我正在尝试打开作为参数收到的文件。
当我将参数存储到全局变量打开成功运行时。
但是
如果我使用make make,因为我的打开无法打开该文件。
是什么原因。
#use strict;
use warnings;
#my $FILE=$ARGV[0]; #open Fails to open the file $FILE
$FILE=$ARGV[0]; #Works Fine with Global $FILE
open(FILE)
or
die "\n ". "Cannot Open the file specified :ERROR: $!". "\n";
答案 0 :(得分:13)
一元开放仅适用于包(全局)变量。这在the manpage上有记录。
打开文件进行阅读的更好方法是:
my $filename = $ARGV[0]; # store the 1st argument into the variable
open my $fh, '<', $filename or die $!; # open the file using lexically scoped filehandle
print <$fh>; # print file contents
P.S。在调试Perl脚本时始终使用strict
和warnings
。
答案 1 :(得分:7)
全部在perldoc -f open
:
如果省略EXPR,则标题变量的名称与 FILEHANDLE包含文件名。 (注意词汇 变量 - 用“我的”声明的变量 - 对此不起作用 目的;因此,如果您使用“我的”,请在通话中指定EXPR 打开。)
请注意,这不是指定文件名的好方法。正如您所看到的,它对它所在的变量类型有一个严格的约束,它所需的全局变量或它打开的全局文件句柄通常是最好的避免。
使用词法文件句柄可以控制其范围,并自动处理关闭:
open my $fh, '<', "filename" or die "string involving $!";
如果您从命令行获取该文件名,则可以完全取消open
或任何句柄,并使用普通<>
运算符从命令行读取参数或STDIN。 (有关此问题的更多信息,请参阅评论)
答案 2 :(得分:6)
use strict;
use warnings;
my $file_name = shift @ARGV;
open(my $file, '<', $file_name) or die $!;
…
close($file);
始终使用strict
和warnings
。如果他们中的任何一个抱怨,修复代码,不要注释掉编译指示。您也可以use autodie
在开启后避免使用明确的or die
,请参阅autodie。
答案 3 :(得分:3)
如果省略EXPR,则与FILEHANDLE同名的标量变量包含文件名。 (请注意,词汇变量 - 用我声明的变量 - 不会用于此目的;因此,如果您使用我的,请在您打开的调用中指定EXPR。)