Regex 使用Perl按元音对字符串中的字符进行排序

Regex 使用Perl按元音对字符串中的字符进行排序,regex,string,perl,sorting,scripting,Regex,String,Perl,Sorting,Scripting,我需要根据从文件输入的给定字符串中出现的元音对小写字符串进行排序。我需要在命令提示符下打印已排序的字符串列表 i、 e.元音将是stringA元音中出现的元音的子串,而元音LB是stringB中相应的子串。如果子字符串元音LA以ASCII升序显示在元音LB之前,则输出中的StringA显示在stringB之前 我目前拥有的: #!/usr/bin/perl -w use warnings; use strict; open my $INFILE, '<', $ARGV[0] or d

我需要根据从文件输入的给定字符串中出现的元音对小写字符串进行排序。我需要在命令提示符下打印已排序的字符串列表

i、 e.元音将是stringA元音中出现的元音的子串,而元音LB是stringB中相应的子串。如果子字符串元音LA以ASCII升序显示在元音LB之前,则输出中的StringA显示在stringB之前

我目前拥有的:

 #!/usr/bin/perl -w

use warnings;
use strict;

open my $INFILE, '<', $ARGV[0] or die $!;

while( my $line = <$INFILE> ) {

sub sort_vowels {

 my $vowels_a = $a;
 my $vowels_b = $b;

$vowels_a =~ s/[^aeiou]//g;     # only vowels
$vowels_b =~ s/[^aeiou]//g;

return $vowels_a cmp $vowels_b;   # compare the substrings
}
}

print sort { sort_vowels };     # print the sorted strings

close $INFILE;
这应该输出:

apparate
fanfare
panacea
albatross
albacore
false
parmesan
candelabra
beans
vermeil
我得到的错误是:

syntax error at sort_strings.pl line 22, near "};"
Execution of sort_strings.pl aborted due to compilation errors.

不知道我哪里出错了。任何帮助都将不胜感激
push @{ $hash{ lc ( $word =~ s/[^aeiou]//igr ) } }, $word;
从Perl5.14开始,/r标志返回结果。5.14之前也可以这样做:

push @{ $hash{ lc( join( '', $word =~ m/([aeiou]+)/ig )) } }, $word;
然后,输出顺序只需获得一组已排序的键并取消这些键中存储的单词列表的排序:

say foreach map { @{ $hash{ $_ } } } sort keys %hash;       

嗯,如果你认为字符串的元音版本只是单词排序顺序的一个键,那么你可以处理每个单词,比如::

push @{ $hash{ lc ( $word =~ s/[^aeiou]//igr ) } }, $word;
从Perl5.14开始,/r标志返回结果。5.14之前也可以这样做:

push @{ $hash{ lc( join( '', $word =~ m/([aeiou]+)/ig )) } }, $word;
然后,输出顺序只需获得一组已排序的键并取消这些键中存储的单词列表的排序:

say foreach map { @{ $hash{ $_ } } } sort keys %hash;       
也许打印sort{sort_元音};这就是你要找的

while和foreach循环允许您一次处理单个元素,但sort需要一个完整的列表作为输入。

也许打印sort{sort\u元音};这就是你要找的


while和foreach循环允许您一次使用单个元素,但sort需要一个完整的列表作为输入。

您从何处获取此代码?我从另一篇文章中获得了帮助。现在我正试着根据我的目的修改它@MPappect while循环中唯一的操作是定义一个子例程。我相信那不是你想要的。此外,您没有将数组或列表传递到排序中。您最好由perldoc的一位过客来为您服务。@mpapec original@您从哪里获取了此代码?我从另一个帖子获得了帮助。现在我正试着根据我的目的修改它@MPappect while循环中唯一的操作是定义一个子例程。我相信那不是你想要的。此外,您没有将数组或列表传递到排序中。你最好由一位与佩尔多克相识的过客为你服务。@mpapec original@他得到了一种完全可行的服务。他把文件改成了乱七八糟的…我想你说的是打印排序{sort_元音};代码中的行?…需要有一个超出}最后一个括号读取的文件吗@tjd排序子例程之后需要一个列表或数组。在提供的原始帖子中,读取数据文件句柄中的所有行。@tjd,我明白了。这个解决方案是足够的,但它会重新计算排序键,即不使用Swartzian变换。@Axeman虽然我们非常喜欢Swartzian变换,但我认为我们可能需要更多的基本技术……他得到了一个完全可行的排序@。他把文件改成了乱七八糟的…我想你说的是打印排序{sort_元音};代码中的行?…需要有一个超出}最后一个括号读取的文件吗@tjd排序子例程之后需要一个列表或数组。在提供的原始帖子中,读取数据文件句柄中的所有行。@tjd,我明白了。这个解决方案是足够的,但它会重新计算排序键,即没有斯瓦兹变换。@Axeman虽然我们非常喜欢斯瓦兹变换,但我认为我们可能需要更多的基本技术。。。