2020 更新:Perl v5.32 使用 Unicode 13 并支持处理表情符号的 多个属性。您可以简单地使用 Emoji
属性:
use v5.32;
use utf8;
use open qw(:std :utf8);
while( <<>> ) {
s/\p{Emoji}//g;
print;
}
作为一个一行代码,这可以转化为:
% perl -CS -pe 's/\p{Emoji}//g' file1 file2 ...
旧版 Perl 的字符类
在 Perl 中,移除表情符号可以很容易地完成。本质上,这与使用 sed 命令非常相似。根据您的任务更新模式和其他细节:
#!perl
use utf8;
use open qw(:std :utf8);
my $pattern = "[\x{1f300}-\x{1f5ff}\x{1f900}-\x{1f9ff}\x{1f600}-\x{1f64f}\x{1f680}-\x{1f6ff}\x{2600}-\x{26ff}\x{2700}-\x{27bf}\x{1f1e6}-\x{1f1ff}\x{1f191}-\x{1f251}\x{1f004}\x{1f0cf}\x{1f170}-\x{1f171}\x{1f17e}-\x{1f17f}\x{1f18e}\x{3030}\x{2b50}\x{2b55}\x{2934}-\x{2935}\x{2b05}-\x{2b07}\x{2b1b}-\x{2b1c}\x{3297}\x{3299}\x{303d}\x{00a9}\x{00ae}\x{2122}\x{23f3}\x{24c2}\x{23e9}-\x{23ef}\x{25b6}\x{23f8}-\x{23fa}]";
while( <DATA> ) { # use <> to read from command line
s/$pattern//g;
print;
}
__DATA__
Emoji at end
Emoji at beginning
Emoji in middle
UTS #51提到了一种表情符号属性,但它没有列在perluniprop中。如果有这样的属性,您可以简化该属性并删除带有该属性的任何内容:
while( <DATA> ) {
s/\p{Emoji}//g;
print;
}
有Emoticon
属性,但它并不涵盖您的字符类。我还没有查看它是否与UTS#51中的Emoji属性相同。
用户定义的Unicode属性
您可以通过定义一个以In
或Is
开头并后跟您选择的属性名称的子例程来创建自己的属性。该子例程返回一个潜在的多行字符串,其中每行都是单个十六进制代码数字或由水平空格分隔的两个十六进制代码数字。然后,所有这些字符都属于您的属性。
这里是将相同字符类作为用户定义的Unicode属性。请注意,我使用squiggly heredoc,主要是因为我可以在本地编写带有前导空格的程序,以便可以直接粘贴到StackOverflow中。虽然IsEmoji
中的行不能有前导空格,但缩进的heredoc会处理这个问题:
use v5.26;
use utf8;
use open qw(:std :utf8);
while( <DATA> ) {
s/\p{IsEmoji}//g;
print;
}
sub IsEmoji { <<~"HERE";
1f300 1f5ff
1f900 1f9ff
1f600 1f64f
1f680 1f6ff
2600 26ff
2700 27bf
1f1e6 1f1ff
1f191 1f251
1f004 1f0cf
1f170 1f171
1f17e 1f17f
1f18e
3030
2b50
2b55
2934 2935
2b05 2b07
2b1b 2b1c
3297
3299
303d
00a9
00ae
2122
23f3
24c2
23e9 23ef
25b6
23f8 23fa
HERE
}
__DATA__
Emoji at end
Emoji at beginning
Emoji in middle
你可以将它放在一个模块中:
sub IsMyEmoji { <<~"HERE";
1f300 1f5ff
...
23f8 23fa
HERE
}
1;
现在你可以将其用于一行代码中(-I.
将当前目录添加到模块搜索路径中,-M
表示要加载的模块):
现在,您可以在一行代码中使用它(
-I.
将当前目录添加到模块搜索路径中,
-M
表示要加载的模块):
$ perl -CS -I. -MIsEmoji -pe 's/\p{IsEmoji}//g' file1 file2
除此之外,在您的单行代码中,您将被限制使用长字符类。