我有一个用 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");
}
(请注意:我已经缩短了这段代码片段。在我的实际代码中,我做了一些替换以将 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" }
并仔细检查文件名。您也可以
use Cwd;
并打印出当前目录。
关于perl - 如何检查 Perl 中是否存在 UTF-16 文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1316929/