我的设置: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标志号,这使得该示例至少工作一次?
答案 0 :(得分:4)
为什么没有-C标志号...这使得该示例至少工作一次?
因为在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
的{{1}}值。使用use utf8;
use utf8
的任何奇数值都会通过测试(STDIN假定为UTF-8),但是你会得到一个&#34;宽字符&#34;警告,除非您还将STDOUT设置为UTF-8。
因此,-C
和任何数字-C3
一样有效。对于1-liners,您可能希望$i % 4 == 3
(-CSDA
)表示所有I / O和-C63
都应为UTF-8。
您还可以使用@ARGV
选项,而不是将-Mutf8
放入1-liner。 use utf8;
不起作用,因为它等同于-mutf8
并且parens阻止调用use utf8 ();
方法。由于import
方法将源代码标记为UTF-8,import
不执行任何操作。但-mutf8
相当于-Mutf8
,因此可行。
但是,将use utf8;
放入-Mutf8
可能会破坏使用非ASCII ISO-8859-1文字的任何脚本。这可能是您愿意承担的风险,但您应该了解它。