Perl:8个或10个不同的字符
s///
解决方案:10个不同,总共13个
sed技术(据称;见下文)也始终在perl中起作用,并产生不同字符的名称数(10):
s/[aeiou]//gi
例如:
$ echo 'This program will remove VOWELS. So we can speak without them.' |
perl -ple 's/[aeiou]//gi'
Ths prgrm wll rmv VWLS. S w cn spk wtht thm.
这是10个不同的字符,这证明了:
$ echo 's/[aeiou]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
10
与sed的解决方案的问题是,它/i
是不 sed的POSIX的一部分,并且因此是不可移植的:
$ echo 'This program will remove VOWELS. So we can speak without them.' |
sed -e 's/[aeiou]//gi'
sed: 1: "s/[aeiou]//gi": bad flag in substitute command: 'i'
那是在OpenBSD系统上运行的。相反,由于/i
确实确实是标准perl的一部分,因此您可以指望它始终存在。不像sed。
如果要在元音列表中包括“ y”,则使用相同的技巧当然会更大:
$ echo 'This nifty program remove any VOWELS. So we easily can speak without them.' |
perl -ple 's/[aeiouy]//gi'
Ths nft prgrm rmv n VWLS. S w sl cn spk wtht thm.
$ echo 's/[aeiouy]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
11
现在共有14个字符。
tr[][]
解决方案:共8个不同的10个
您也可以使用tr///
它删除任何匹配的内容。Perl甚至可以将sed的y///
别名用于tr
:
y/aeiou//d
现在可以使用8个不同的字符,但是不能使用大写字母。您最终不得不再添加5个字符来处理casemap:
$ echo 'y/aeiouAEIOU//d' | perl -nle '@s{split//}=(); print scalar keys %s'
13
现在总共有15个
但是,将“ y”作为元音添加到混音中并不会像在s///
版本中那样增加不重复字符的数量:
$ echo 'This nifty program remove any VOWELS. So we easily can speak without them.' |
perl -ple 'y/aeiouy//d'
Ths nft prgrm rmv n VOWELS. S w sl cn spk wtht thm.
所以这仍然只是11个总数中的原始8个:
$ echo 'y/aeiouy//d' | perl -nle '@s{split//}=(); print scalar keys %s'
8
编辑:会计变音符号
像这样的输入Renée’s naïveté
呢?正确的输出当然应该是Rn’s nvt
。使用v5.14的/r
标志执行以下操作s///
:
$ echo 'Renée’s naïveté' |
perl5.14.0 -CS -MUnicode::Normalize -nle 'print NFD($_)=~s/[aeiou]\pM*//rgi'
Rn’s nvt
这是27个不同的字符:
$ echo 'print NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
27
您可以修剪,要26,如果你能保证你至少V5.10通过交换运行print
的say
:
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]\pM*//rgi'
Rn’s nvt
$ echo 'say NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
26
如果您不介意移变音符号而不是删除变音符号,则可以将其降至22。
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]//rgi'
Rń’s n̈vt́
至少可以说,这很有趣。:)这是其不重复计数:
$ echo 'say NFD($_) =~ s/[aeiou]//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
22
祝您好运,让其他任何语言都能使用比这更少的字符来正确处理变音符号!