微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在单行内的perl替代项和matchm运算符中使用utf8模式不起作用?

如何解决为什么在单行内的perl替代项和matchm运算符中使用utf8模式不起作用?

在使用Perl的单行代码替换文件中的utf8文本时,我发现了此问题。 我知道How to handle utf8 on the command line (using Perl or Python)?处的黑客行为。他们不适用于这种情况。操作系统为linux,定位设置为utf8

# make file to contain pattern
$echo Текст на юникоде>file
$cat file
Текст на юникоде
# also grep finds it
$grep "Текст на юникоде" file
Текст на юникоде
# different perl hacks mentioned at reference question don't work:
$perl -C63 -n -e "print if m{Текст на юникоде}" file
# does not show anything
$perl -Mutf8 -n -e "print if m{Текст на юникоде}" file
# does not show anything
# although it handles parameters correctly
$perl -e 'print "$ARGV[0]\n"' "Текст на юникоде"
Текст на юникоде
# and inside -e options as well
$perl -e 'print "Текст на юникоде\n"'
Текст на юникоде
# when create perl script to find the pattern,it works:
echo "while (<>) {print if m{Текст на юникоде}}">find.pl
$cat find.pl
while (<>) {print if m{Текст на юникоде}}
$perl find.pl file
Текст на юникоде
# and even this strange way it works:
perl -ne '$m="Текст на юникоде";print if m{$m}' file
Текст на юникоде

所以这是我的问题:还有什么更简单的解决方案,可以在m和s运算符中使用utf8模式和perl单行代码一起使用,为什么简单的方法不起作用?

谢谢!

以防万一:

$uname -a
Linux ubuntu16-pereval 4.4.0-190-generic #220-Ubuntu SMP Fri Aug 28 23:02:15 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$locale
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

解决方法

perl -C63 -n -e "print if m{Текст на юникоде}" file

-C63应用各种标志来告诉Perl输入和输出文件在UTF8中。

perl -C63 -n -e "print if m{Текст на юникоде}" file

-Mutf8告诉Perl编译器您的源代码位于UTF8中。

-C63影响Perl如何查看file中的数据。 -Mutf8影响Perl在-e选项中如何看待代码。为了让Perl理解输入文件和源代码都应解释为UTF8,您需要两个选项。

$ perl -Mutf8 -C63 -n -e "print if m{Текст на юникоде}" file
Текст на юникоде

更新:哦,我应该补充一点,最简单的选项也可以工作(但出于所有错误的原因!)

$ perl -n -e "print if m{Текст на юникоде}" file
Текст на юникоде

在这种情况下,由于Perl会将输入和源代码都解释为由单字节Latin-1字符组成,因此可以使用。请不要这样做:-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?