在Perl中,为什么我不能使用单个参数打开来打开这个文件?

时间:2017-04-20 18:19:30

标签: perl

文件大小为52MB。它与程序位于同一目录中。

$big = 'VIXhx.csv';

# tie @optLine, 'Tie::File', $big or die "Cant Tie to $big $!" ; 

open $big or die "Cant open $big, $!," ; 

Tie::File没有给出任何错误消息。

普通open给出了错误消息:

  

无法在C:\ Python34 \ hsf \ ETFs \ VIX \ qad打开VIXhx.csv,没有这样的文件或目录。   第47行。

(是的,它在Python目录中 - 但Perl在那里工作正常)

我可以在编辑器中打开文件,因此文件本身似乎没有问题。

我在同一个程序中有一个较小的文件,在Tie::File中没有问题打开。

$dat = 'ETF5Y.csv';

tie @datLine, 'Tie::File', $dat or die "Cant Tie to $dat $!" ; 

如果文件太大,Perl是否有可能无法打开文件?

3 个答案:

答案 0 :(得分:2)

请参阅perldoc perlopentut

  

单个参数打开

     

还记得我们怎么说Perl的开放有两个论点吗?那是一种被动的搪塞。你看,它也只需要一个参数。当且仅当变量是全局变量而不是词法时,您可以只传递一个参数,即文件句柄,它将从同名的全局标量变量中获取路径。

$FILE = "/etc/motd";
open FILE or die "can't open $FILE: $!";
while (<FILE>) {
    # whatever
}

因此,如果您希望单个参数open执行您想要的操作,则必须将代码编写为

$big = 'VIXhx.csv';
open big or die "Can't open '$big': $!"; 
#   ^ <-- look, no dollar sign before filehandle

或者,您可以这样做:

$big = 'VIXhx.csv';
*{$big} = \$big;
open $big and print <$big>;

如果您想保留open $big

但是,远距离依赖全局变量和效果并不是一个好主意。相反,使用open的三个参数形式分别指定文件句柄,模式和文件名,如下所示:

open my $vix_fh, '<', $vix_file
    or die "Failed to open '$vix_file': $!";

顺便说一句,在最近的Perl文档中,您甚至不会在“Single Argument Open”中找到此部分。以下注释应该为您提供原因:

  

这是为什么?有人必须迎合歇斯底里的海豚。它从一开始就存在于Perl中,如果不是之前的话。

单个参数open也可用于turn any Perl program quine

答案 1 :(得分:2)

请检查perldoc -f open有关如何打开文件的信息,最后打开空文件名的内容,

strace perl -e '$big = "/etc/passwd"; open $big or die "Cant open $big, $!,"'

输出

...
open("", O_RDONLY)                      = -1 ENOENT (No such file or directory)
write(2, "Cant open /etc/passwd, No such f"..., 64Cant open /etc/passwd, No such file or directory, at -e line 1.

答案 2 :(得分:2)

我找到了原来问题的答案,为什么TIE不起作用。

事实证明该文件使用'0A'作为行终止符,所以TIE期望'0D0A',将整个52MB文件读作一条记录。

我添加了recsep =&gt;对于TIE声明,“\ n”,一切正常。