如何将文件名传递给 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/ 如今,使用三参数版本的 open
和词法文件句柄已被普遍接受为良好做法。
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);
}
我正在编写 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
.
有多种方法可以从数组中获取第一个元素;
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/ 如今,使用三参数版本的 open
和词法文件句柄已被普遍接受为良好做法。
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);
}