Perl:打开文件

vrb*_*lgi 6 perl

我试图打开收到的文件作为参数.

当我将参数存储到全局变量时,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总是使用strictwarnings在调试Perl脚本.

  • 这个答案忽略了这一点.简单的问题是为什么一元开放仅适用于包变量.简单的答案是因为它是如此记录的.其他一切都是在丢失的蛋糕上结霜. (2认同)

JB.*_*JB. 7

一切都在perldoc -f open:

如果省略EXPR,则与FILEHANDLE同名的标量变量包含文件名.(请注意,词汇变量 - 用"我的"声明的变量 - 不会用于此目的;因此,如果您使用"我的",请在您打开的调用中指定EXPR.)

请注意,这不是指定文件名的好方法.正如您所看到的,它对其所在的变量类型有严格的约束,并且通常最好避免使用它所需的全局变量或它打开的全局文件句柄.

使用词法文件句柄可以控制其范围,并自动处理关闭:

open my $fh, '<', "filename" or die "string involving $!";
Run Code Online (Sandbox Code Playgroud)

如果您从命令行获取该文件名,则可以完全取消该文件名open或任何句柄,并使用plain <>运算符从命令行参数或STDIN中读取.(有关详细信息,请参阅评论)


zou*_*oul 6

use strict;
use warnings;

my $file_name = shift @ARGV;
open(my $file, '<', $file_name) or die $!;
…
close($file);
Run Code Online (Sandbox Code Playgroud)

总是使用strictwarnings.如果他们中的任何一个抱怨,修复代码,不要注释掉编译指示.您也可以在打开后use autodie避免显or die式,请参阅autodie.