Perl 的 open() 有时会在文件名以空格结尾时失败



我遇到了Perl的open()函数的问题。它与名称以空白结尾的文件有关。如果我使用带有两个参数(文件句柄和文件名)的open(),并且文件名以空白结尾,那么open()将失败。错误消息表示,尽管文件存在,但找不到该文件。当指定打开模式时,不会发生这样的事情,例如,如果我明确声明文件是为读取而打开的。以下是一些示例代码:

use warnings;
use strict;
my $file = '/tmp/test_with_ending_space ';
open WRITE, ">", $file or die "open with mode got error: $!";
print WRITE "my open() testn";
close WRITE;
# open() with mode
open READ, "<", $file or die "open without mode got error: $!";
while (<READ>) {
    print;
}
close READ;
# open() without mode
open READ1, $file or die $!;
while (<READ1>) {
    print;
}
close READ1;

这是这样的代码的输出:

marius@mariusm-PC:~/perl$ ./test.pl
my open() test
open without mode got error: No such file or directory at ./test.pl line 21.

"常用"文件名不会发生这种情况,即文件名以其他字符结尾。

如果这是一个已知的问题,有什么想法吗?如果是,有没有办法解决它?

以防万一,在你开始告诉我"要友善,指定模式并告诉你的open()如何打开文件"之前。不幸的是,这个问题出现在一些核心模块中,例如IO::File::open()(这就是我最初遇到的问题)。该函数中的最后一个调用是open($fh, $file),也就是说,它在没有任何特定模式的情况下调用本机open()。

它记录在打开的中

传递给的单参数和双参数形式的文件名open()将删除前导和尾部空白

阅读以下段落了解更多详细信息。

@choroba给出了"为什么",但您也要求解决方法。

好吧,这是非常笨拙的,但如果你非常绝望,无法更改open()调用,这将起作用。首先,检测文件名是否以空白结尾(我想你可以处理)。如果是,请创建一个指向该文件的临时符号链接(没有尾随空格!),然后打开符号链接。

WFM在我的(旧的)Solaris 2.6框中。

最新更新