如何按音节数对单词进行排序?

J36*_*363 6 sed awk perl text-processing

如何根据每个单词包含的音节数对单词列表进行升序排序?

示例输入:

something
important
dog
cat
bookshelf
Run Code Online (Sandbox Code Playgroud)

示例输出:

dog
cat
something
bookshelf
important
Run Code Online (Sandbox Code Playgroud)

cas*_*cas 15

这个 perl 脚本用单词(从 stdin 中每行读取一个,和/或从命令行中列出的任何文件名中读取一个)作为键构建一个散列,并且音节计数作为值。

然后它打印散列键,按音节计数排序。

#! /usr/bin/perl

use strict;

use Lingua::EN::Syllable;

my %words = ();

while(<>) {
   chomp;
   $words{$_} = syllable($_);
};

print join("\n",sort { $words{$a} <=> $words{$b} } keys(%words)), "\n";
Run Code Online (Sandbox Code Playgroud)

输出:

cat
dog
bookshelf
something
important
Run Code Online (Sandbox Code Playgroud)

如果要打印每个单词的音节数,请将最后一行更改为如下所示:

cat
dog
bookshelf
something
important
Run Code Online (Sandbox Code Playgroud)

输出:

 1: cat
 1: dog
 2: bookshelf
 3: something
 3: important
Run Code Online (Sandbox Code Playgroud)

这个版本强调了一个事实,正如模块本身声称的那样,它只估计音节数。“书架”被正确地计算为只有两个音节,但“某物”也应该是两个音节。

我还没有仔细检查模块的代码,但它可能越来越被迷惑em。在许多(大多数?)词中,这不是无声的e,而是算作额外的音节。

  • 顺便说一句,这个脚本突出了学习 perl 的好处之一——CPAN 模块几乎可以做你能想到的任何事情,所以很多用其他语言编写的程序非常复杂,编写起来就像这样微不足道`perl` - 因为模块作者已经完成了大部分工作......你所要做的就是使用他们提供的工具。通常,最难的部分是找到满足您需求的模块 - 在这种情况下,在 google 上搜索 `perl count syllables` 大约需要 30 秒 (4认同)
  • 仅供参考,CPAN 搜索显示有 993 个模块与“Lingua::”匹配,其中一些可能对您有用:http://search.cpan.org/search?m=module&amp;q=Lingua%3A%3A&amp;s=1&amp;n =100 (2认同)