>假设我有(在Bash中(:
txt="На берегу пустынных волн
Стоял он, дум великих полн,
И вдаль глядел."
如果我通过管道将其传输到Perl,我可以打印没有问题:
$ echo "$txt" | perl -lnE 'say "$_"'
На берегу пустынных волн
Стоял он, дум великих полн,
И вдаль глядел.
但是我对本文的各种正则表达式有问题。假设我添加了新的花式单词边界:
$ echo "$txt" | perl -lnE 'while (/b{wb}(.+?)b{wb}/g) { print ""$1"" }'
"–"
"ù"
"–"
"∞"
" "
"–"
"±"
"–µ—"
"Ä"
...
# junk characters...
单词边界不起作用,输入字符已更改。
(如果我将正则表达式更改为/b{wb}(.+)b{wb}/g
则输出与第一个相同。(.+)
消耗整行。
我可以通过添加 -CASD 命令行开关来解决这些问题,并且花哨的单词边界按设计工作:
$ echo "$txt" | perl -CSAD -lnE 'while (/b{wb}(.+?)b{wb}/g) { print ""$1"" }'
"На"
" "
"берегу"
" "
"пустынных"
" "
"волн"
"Стоял"
" "
"он"
","
" "
"дум"
" "
"великих"
" "
"полн"
","
"И"
" "
"вдаль"
" "
"глядел"
"."
问题:perlrun 中的-CASD
开关似乎暗示启用的 unicode 功能适用于stdin
和stdout
输入流。没有提到任何会改变正则表达式的内部差异。既然我可以在第一种情况下读取和打印 unicode,为什么添加-CASD
会更改正则表达式?
$ perl -v
This is perl 5, version 28, subversion 0 (v5.28.0) built for darwin-thread-multi-2level
在第一种情况下,您不是在读取和打印 unicode,而是在读取和打印 UTF-8。对于Perl,这些字符串由字节(八位字节(组成,而不是字符,因此它可以在多字节序列的中间找到单词边界。有关详细信息,请参阅 perlunicode。
既然我可以在第一种情况下读取和打印 unicode,为什么添加
-CASD
会更改正则表达式?
该命令行选项只是使perl解码传入数据,就好像它是UTF-8编码的,并将传出数据重新编码为UTF-8
。仅读取文本并打印具有相同编码的相同文本不需要对流进行解码和重新编码,因为字节序列已经正确编码
如果输入是Windows-1255编码(希伯来语(,而输出需要UTF-8编码,那么数据需要首先解码为字符串,然后编码为UTF-8字节序列
只有当输入和输出需要完全相同的编码,并且不需要将输入作为字符串处理时,才能省去解码和编码