如何检查Perl中是否存在UTF-16文件名?

blt*_*t04 4 perl utf-16

我有一个用UTF-16编码的文本文件.每行包含由制表符分隔的多个列.对于那些关心的人,该文件是从iTunes导出的播放列表TXT.第27列包含文件名.

我在Linux中使用Perl 5.8.8使用类似的代码来阅读它:

binmode STDIN, ":encoding(UTF-16)";
while(<>)
{
    chomp;
    my @cols = split /\t/, $_;
    my $filename = $cols[26];   # Column #27 contains the filename
    print "File exists!" if (-e "$filename");
}
Run Code Online (Sandbox Code Playgroud)

(请注意:我已缩短此代码段.在我的实际代码中,我做了一些替换,将iTunes使用的绝对Windows文件名转换为在我的Linux机器上有效的文件名)

即使文件存在,( - e)文件测试也不会返回true.我认为这与UTF-16中的字符串有关,但无法弄清问题是什么.实际文件名仅使用ASCII字符.如果我打印$ filename变量,文件名将正确打印.

Perl中的文件名可以是UTF16吗?有任何想法如何让这段代码片段工作?

cjm*_*cjm 5

UTF-16文本由:encoding层处理.当它进入时$_,没有办法告诉它它曾经是UTF-16.我不认为这是你的问题.

我的猜测是你的文件名中有一些空格(当你尝试将其打印出来时没有注意到)或者你不在你认为的目录中.

尝试

if (-e $filename) { print "File exists!" } 
else { print "File <$filename> not found" }
Run Code Online (Sandbox Code Playgroud)

并仔细检查文件名.您也可以use Cwd;打印出当前目录.