タイトルで述べたように、問題は、ASCII ファイルから読み取った 1 つの文字列と、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;
次のように、文字列 $p が外部ファイル u から読み取られるという違いがあるようです。
cat
「file」ユーティリティによると、私のコードは 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" は true ですが、ファイルから読み取るのではなく、単にコードに $p="cat" を設定すると、エラーはなくなります。これは、ソース コード ファイルが utf8 であるためだと思います。
ここで何が起こっているのか、それを修正する方法を誰かが説明できますか?
[編集] Dmitri Chubarov の回答に対する私のコメントで説明したように、私の最小限の例は、実際には元のプログラムのバグを正しく表していないことがわかりました。この質問は実際のバグを説明しています: Perl の File::Glob は常に utf8::decode によってポストフィルター処理されるべきですか?