在Perl中,为什么可以';我不能用单参数打开这个文件吗?

在Perl中,为什么可以';我不能用单参数打开这个文件吗?,perl,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,没有此类文件或目录。 pl第47行 (是的,它

文件大小为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,没有此类文件或目录。 pl第47行

(是的,它在Python目录中,但是Perl在那里工作得很好)

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

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

$dat = 'ETF5Y.csv';

tie @datLine, 'Tie::File', $dat or die "Cant Tie to $dat $!" ; 
如果文件太大,Perl是否可能无法打开该文件?

请参阅:

单参数打开 还记得我们说过Perl的open包含两个参数吗?那是一种被动的推诿。你看,它也可以只需要一个论点。如果且仅当变量是全局变量而不是词法变量时,可以只传递一个参数filehandle,它将从同名的全局标量变量获取路径

$FILE = "/etc/motd";
open FILE or die "can't open $FILE: $!";
while (<FILE>) {
    # whatever
}
或者,您可以这样做:

$big = 'VIXhx.csv';
*{$big} = \$big;
open $big and print <$big>;
顺便说一下,在最近的Perl文档中,您甚至找不到关于“单参数打开”的这一节。下面的注释应该让您了解原因:

这是为什么?必须有人照顾歇斯底里的海豚。这是Perl从一开始就有的东西,如果不是以前的话

单个参数
open
也可用于转换为。

请参见:

单参数打开 还记得我们说过Perl的open包含两个参数吗?那是一种被动的推诿。你看,它也可以只需要一个论点。如果且仅当变量是全局变量而不是词法变量时,可以只传递一个参数filehandle,它将从同名的全局标量变量获取路径

$FILE = "/etc/motd";
open FILE or die "can't open $FILE: $!";
while (<FILE>) {
    # whatever
}
或者,您可以这样做:

$big = 'VIXhx.csv';
*{$big} = \$big;
open $big and print <$big>;
顺便说一下,在最近的Perl文档中,您甚至找不到关于“单参数打开”的这一节。下面的注释应该让您了解原因:

这是为什么?必须有人照顾歇斯底里的海豚。这是Perl从一开始就有的东西,如果不是以前的话


单个参数
open
也可用于转换为一个。

请检查
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.

关于如何打开文件,请检查
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.

我找到了我最初问题的答案,为什么领带不起作用

事实证明,该文件使用“0A”作为行终止符,因此TIE(预期为“0D0A”)将整个52MB文件作为一条记录读取


我在TIE语句中添加了recsep=>“\n”,一切正常。

我找到了最初问题的答案,即为什么TIE不起作用

事实证明,该文件使用“0A”作为行终止符,因此TIE(预期为“0D0A”)将整个52MB文件作为一条记录读取


我在TIE语句中添加了recsep=>“\n”,一切正常。

您没有正确的
open
格式。首先,没有提到用作文件句柄的变量。签出。有关如何使用
open
,请参阅。提示:您可能需要3个参数,而不是1个。从何处运行此操作?与程序相同的目录并不意味着您从该目录运行程序。工作目录将在您调用它的地方。52MB在任何意义上都不是一个“大”文件您没有正确的
open
格式。首先,没有提到用作文件句柄的变量。签出。有关如何使用
open
,请参阅。提示:您可能需要3个参数,而不是1个。从何处运行此操作?与程序相同的目录并不意味着您从该目录运行程序。工作目录将在您调用它的地方。52MB在任何senseTry
perl-e'$big=“/etc/passwd”中都不是一个“大”文件*{$big}=\$big;打开$big并打印“
它将
$big
作为globtype并打开一个参数。:)好的-我添加了'Try
perl-e'$big=“/etc/passwd”*{$big}=\$big;打开$big并打印“
它将
$big
作为globtype并打开一个参数。:)好的-我添加了'