如标题所述,问题似乎是我从 ASCII 文件中读取了一个字符串,而另一个是 utf8;当我使用插值形成一个字符串,然后将该字符串传递给 open() 时,它似乎得到了修改,并且出现了错误。这是一个最小的例子:
#!/usr/bin/perl
use open ":encoding(utf8)";
use strict;
open (FILE,"<u");
my $p = <FILE>;
$p =~ s/\s+$//;
close FILE;
print "p=",$p,"\n";
if ($p eq "cat") {print "yes\n"} else {"no\n"}
my $file = "påminnelser"; # note the circle over the "a"
my $x = "$p <$file |";
print "x=$x\n";
open (FILE, $x);
close FILE;
从外部文件 u 中读取字符串 $p 似乎有所不同,如下所示:
cat
根据“文件”实用程序,我的代码是 utf8,而文件 u 是 ASCII:
---- rintintin a $ file u
u: ASCII text
---- rintintin a $ file bug.pl
bug.pl: Perl script, UTF-8 Unicode text executable
结果如下所示:
---- rintintin a $ ./bug.pl
p=cat
yes
x=cat <påminnelser |
sh: 1: cannot open påminnelser: No such file
文件名已在 open() 调用中的某处被修改。虽然 $p eq "cat" 是真的,但如果我只是在代码中设置 $p="cat" 而不是从文件中读取它,错误就会消失。我猜这是因为我的源代码文件是 utf8。
谁能解释这里发生了什么以及如何解决它?
[编辑] 正如我对 Dmitri Chubarov 回答的评论中所述,事实证明,我的最小示例实际上并没有正确表示我原始程序中的错误。这个问题描述了实际的错误:Perl 的 File::Glob 是否总是通过 utf8::decode 进行后过滤?