我有一个用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吗?有任何想法如何让这段代码片段工作?
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;打印出当前目录.