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 文字的脚本。这可能是您愿意承担的风险,但您应该意识到这一点。
我的设置: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 文字的脚本。这可能是您愿意承担的风险,但您应该意识到这一点。