我试图打开收到的文件作为参数.
当我将参数存储到全局变量时,open工作成功.
但
如果我使用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";
Run Code Online (Sandbox Code Playgroud)
Eug*_*ash 13
一元开放仅适用于包(全局)变量.这在联机帮助页上有记录.
打开文件进行阅读的更好方法是:
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
Run Code Online (Sandbox Code Playgroud)
PS总是使用strict和warnings在调试Perl脚本.
一切都在perldoc -f open:
如果省略EXPR,则与FILEHANDLE同名的标量变量包含文件名.(请注意,词汇变量 - 用"我的"声明的变量 - 不会用于此目的;因此,如果您使用"我的",请在您打开的调用中指定EXPR.)
请注意,这不是指定文件名的好方法.正如您所看到的,它对其所在的变量类型有严格的约束,并且通常最好避免使用它所需的全局变量或它打开的全局文件句柄.
使用词法文件句柄可以控制其范围,并自动处理关闭:
open my $fh, '<', "filename" or die "string involving $!";
Run Code Online (Sandbox Code Playgroud)
如果您从命令行获取该文件名,则可以完全取消该文件名open或任何句柄,并使用plain <>运算符从命令行参数或STDIN中读取.(有关详细信息,请参阅评论)
use strict;
use warnings;
my $file_name = shift @ARGV;
open(my $file, '<', $file_name) or die $!;
…
close($file);
Run Code Online (Sandbox Code Playgroud)
总是使用strict和warnings.如果他们中的任何一个抱怨,修复代码,不要注释掉编译指示.您也可以在打开后use autodie避免显or die式,请参阅autodie.