首先,并非所有书面语言都有“元音”。(例如,中文(Zhōngwén)(书面中文)没有,因为它是表意文字而不是语音。又例如,日语大多没有;它主要使用辅音+元音平假名或片假名音节,例如“ga”, “wa”、“tsu”代替。)
并且一些书面语言(例如印地语、孟加拉语、希腊语、俄语)确实有元音,但使用不容易映射到 aeiou 的字符。对于此类语言,您必须查找(搜索 metacpan?)或制作查找表,指定哪些字母是“元音”。
但是,如果您正在处理任何基于拉丁字母 (abcdefghijklmnopqrstuvwxyz) 的书面语言,即使该语言使用大量变音符号(在 Perl 和 Unicode 圈中称为“组合标记”)(例如越南语),您也可以轻松将它们映射到“元音”或“非元音”,是的。方法是“规范化到完全分解的形式”,然后去掉所有的组合标记,然后折叠大小写,然后将每个字母与正则表达式 /[aeiou]/ 进行比较。以下 Perl 脚本将使用基于拉丁字母的任何语言查找大多数或所有“元音”:
#!/usr/bin/perl -CSDA
# vowel-count.pl
use v5.20;
use Unicode::Normalize 'NFD';
my $vcount;
while (<>)
{
$_ =~ s/[\r\n]+$//;
say "\nRaw string: $_";
my $decomposed = NFD $_;
my $stripped = ($decomposed =~ s/\pM//gr);
say "Stripped string: $stripped";
my $folded = fc $stripped;
my @base_letters = split //, $stripped;
$vcount = 0;
/[aeiou]/ and ++$vcount for @base_letters;
say "# of vowels: $vcount";
}