Perl:打开文件

时间:2011-02-08 13:38:08

标签: perl

我正在尝试打开作为参数收到的文件。

当我将参数存储到全局变量打开成功运行时。

但是

如果我使用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";

4 个答案:

答案 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脚本时始终使用strictwarnings

答案 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);

始终使用strictwarnings。如果他们中的任何一个抱怨,修复代码,不要注释掉编译指示。您也可以use autodie在开启后避免使用明确的or die,请参阅autodie

答案 3 :(得分:3)

来自Perl's docs for open()

  

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