perl 中的什么 -C 标志号使 UTF-8 "just work"?

What -C flag number in perl makes UTF-8 "just work"?

我的设置:perl-5.20.2,UTF-8 环境。

考虑以下两个 bash 示例。第一个可以,第二个不行。

echo -n 'привет мир' | perl -MEncode -le '$a=decode("utf8",<>); $x=decode("utf8","мир"); print encode("utf8",sprintf("% 11s",$a)) if $a=~/$x/'|grep -q ' привет мир' && echo OK
for (( i=0; $i < 512; i=$((i+1)) )); do echo -n 'привет мир' | perl -C$i -le '$a=<>; print sprintf("% 11s",$a) if $a=~/мир/' | grep -q ' привет мир' && echo $i; done

为什么案例 2) 中没有 -C 标志号,这使得该示例至少可以运行一次?

Why there is no -C flag number ... which makes the example work at least once?

因为在您的 Perl 源代码中使用 UTF-8 文字需要 use utf8;

for (( i=0; $i < 512; i=$((i+1)) )); do echo -n 'привет мир' | perl -C$i -le 'use utf8; $a=<>; print sprintf("% 11s",$a) if $a=~/мир/' | grep -q ' привет мир' && echo $i; done

没有 -C 值可以复制 use utf8;use utf8 -C 的任何奇数值都通过了测试(STDIN 假定为 UTF-8),但你会收到 "Wide character in print" 警告,除非你也将 STDOUT 设置为 UTF-8。

因此,-C3 和任何数字 $i % 4 == 3 一样有效。对于 1-liners,您可能希望 -CSDA (-C63) 表示所有 I/O 和 @ARGV 应该是 UTF-8。

您还可以使用 -Mutf8 选项,而不是将 use utf8; 放入 1-liner。 -mutf8 不起作用,因为它等同于 use utf8 (); 并且括号阻止调用 import 方法。由于 import 方法将您的源代码标记为 UTF-8,因此 -mutf8 什么都不做。但是 -Mutf8 等同于 use utf8; 所以它有效。

但是,将 -Mutf8 放入 PERL5OPT 可能会破坏任何使用非 ASCII ISO-8859-1 文字的脚本。这可能是您愿意承担的风险,但您应该意识到这一点。