文件大小为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是否有可能无法打开文件?
答案 0 :(得分:2)
单个参数打开
还记得我们怎么说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”,一切正常。