繁体   English   中英

如何将文件名传递给perl中的子程序?

[英]How to pass file names to a subroutine in perl?

我正在写一个perl脚本,我想将输出文件的文件名传递给子程序。

我试过这样的事情:

use strict;
use warnings;

test("Output.dat");

sub test {
  my $name = @_;

  open(B, ">$name") or die "Failure \n";

  print B "This is a test! \n";
  close(B); 
}

我将多次使用子程序,所以我必须传递文件名,不能在子程序中声明它。

我希望你能帮帮我 :)

你的问题是这一行:

my $name = @_;

您正在为标量变量分配数组。 在Perl中,这将为您提供数组中元素的数量 - 所以我希望您在$name以“1”结尾。

有许多方法可以从数组中获取第一个元素;

my $name = $_[0]; # Explicitly get the first element
my $name = shift @_; # Get the first element (and remove it from the array)
my $name = shift; # Same as the previous example - shift works on @_ by default in a subroutine
my ($name) = @_; # The parentheses make it into a list assignment

最后两个是你最常见的那些。

还有几点:

1 /如果在错误消息中包含$name ,您将获得更好的问题线索。

open(A, ">$name") or die "Failure: $name \n";

或者,更好的是,Perl从您的操作系统获取的错误消息。

open(A, ">$name") or die "Could not open $name: $!\n";

(我已经添加了丢失的逗号 - 我认为这是一个错字。)

2 /这一天,使用三arg版本的open和lexical文件句柄通常被认为是一种好习惯。

open(my $output_fh, '>', $name) or die "Failure: $name \n";

3 /在您的示例中,您打开一个名为“A”的文件句柄,但然后尝试写入名为“B”的文件句柄。 这是拼写错误吗?

my $name = @_;

将在标量模式下分配给@_ $name值。 它表示数组_的元素数量。 这是一些争论。 这很可能不是你想要的。 因此,您必须将数组分配给数组或将标量分配给标量。 你有两个选择

my $name = $_[0];

要么

my ($name) = @_; # or even (my $name) = @_;

我以后会更喜欢的地方,因为它可以很容易地修改为my ($a, $b, $c) = @_; 它是Perl成语。

但是你的代码有更多缺陷。 例如,您应该使用此open表单

open my $fd, '>', $name or die "cannot open > $name: $!";

这几点没有优势。 首先,您使用词法范围的IO句柄,以防止在词法范围之外泄漏,并在退出此词法范围时自动关闭。 第二个列表形式可防止解释除文件名以外的$name内容。

因此生成的代码应如下所示:

sub test {
    my ($name) = @_;

    open my $fd, '>', $name
        or die "cannot open > $name: $!";

    print $fd "This is a test!\n";
}

在回答你的问题之前,想建议一件事 -

总是使用3参数open()版本,如 -

open (my $FH, '>', 'file.txt') or die "Cannot open the file:$!";

如果要将单个参数传递给子例程,则可以使用“shift”运算符。

test("Output.dat");

sub test {
    my $name = shift;

    open (my $B, '>', $name) or die "Cannot open the file:$!";
    print $B "This is a test! \n";

    close($B); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM