Perl字符串排序

Perl字符串排序,perl,hash,Perl,Hash,我试图根据字符串中包含的元音对文本文件中的小写字符串进行排序 例如: 元音L1是出现在string1中元音的子串,元音L2是对应的子串 string2的子字符串。如果子字符串元音L1以ASCII升序显示在元音L2之前,则输出中的string1将显示在string2之前 我试图通过哈希表来实现这一点,因为它听起来像是最有意义的数据结构 我的代码: #!/usr/bin/perl -w use strict; my %hash; my $vow = my $w; my $file = $ARGV[

我试图根据字符串中包含的元音对文本文件中的小写字符串进行排序

例如: 元音L1是出现在string1中元音的子串,元音L2是对应的子串 string2的子字符串。如果子字符串元音L1以ASCII升序显示在元音L2之前,则输出中的string1将显示在string2之前

我试图通过哈希表来实现这一点,因为它听起来像是最有意义的数据结构

我的代码:

#!/usr/bin/perl -w
use strict;

my %hash;
my $vow = my $w;
my $file = $ARGV[0];

open (IN, $file) or die "Could not open file: $!";

while (my $line = <IN>) {
        $vow = ~s/[^aeiou]//g;
        $hash{$vow}{$w} = 1;
}
close(IN);

foreach my $key (sort %hash) {
    foreach my $word (sort %{$hash {$key}}){
        print "$word\n";
    }
}
命令应为:

apparate,
fanfare,
panacea,
albatross,
albacore,
false,
parmesan,
candelabra,
beans,
vermeil
好的,我正在尝试:

#!/usr/bin/perl

use strict;
use warnings;

sub sort_vowelsonly {
  my $a_vowels = $a;
  my $b_vowels = $b;

  $a_vowels =~ s/[^aeiou]//g;
  $b_vowels =~ s/[^aeiou]//g;
   print "DEBUG: Comparing $a_vowels with $b_vowels\n";
  return $a_vowels cmp $b_vowels
}

print sort { sort_vowelsonly }  <DATA>;

__DATA__
albatross 
apparate 
fanfare 
candelabra 
panacea 
vermeil 
parmesan 
albacore 
false
beans
#/usr/bin/perl
严格使用;
使用警告;
仅子排序_元音{
我的$a_元音=$a;
我的$b_元音=$b;
$a_元音=~s/[^aeiou]//g;
$b_元音=~s/[^aeiou]//g;
打印“调试:比较$a_元音和$b_元音\n”;
返回$a_元音cmp$b_元音
}
打印排序{sort_vouelsonly};
__资料__
信天翁
幻影
大张旗鼓
烛台
灵丹妙药
维梅尔
帕尔马干酪
长鳍金枪鱼
假的
豆

关键点是-自定义排序子项将-1、0或+1返回到
sort
。它将在内部接受任何逻辑。因此,我们插入
$a
$b
(特殊排序变量)。去掉“非元音”并使用perl
cmp
函数进行比较

以Sobrique的解决方案为例,这里介绍了如何按照您的意愿使用输入文件,而不是传入
,非常简单:

#!/usr/bin/perl -w

    use strict;
    use warnings;

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

    sub sort_vowelsonly {
     my $a_vowels = $a; 
     my $b_vowels = $b; 

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

    return $a_vowels cmp $b_vowels;
    }


    print sort { sort_vowelsonly } <$INFILE>;


    close $INFILE;
#/usr/bin/perl-w
严格使用;
使用警告;

打开我的$infle,'您有一个语法错误。而不是
$vow=~s/[^aeiou]//g你需要
$vow=~s/[^aeiou]//g一些示例数据对调试代码很有用-打算完成什么?它几乎肯定不会做你认为它在做的事情。这可能是“未初始化值为hash ref”的来源。(因为
$w
undef
,当您将其插入哈希时)@sputnick感谢您的关注@Sobrique我将显示一些示例数据,只要我的$vow=我的$w;在这种情况下,它应该表示值,因为元音是我真正关心的全部。不,不!你说得对。顺序应该是幻影,大张旗鼓,灵丹妙药,信天翁,信天翁,假,帕尔玛干酪,烛台,豆子,维梅尔塔这是可怕的!这正是我需要的!谢谢你的帮助!
#!/usr/bin/perl

use strict;
use warnings;

sub sort_vowelsonly {
  my $a_vowels = $a;
  my $b_vowels = $b;

  $a_vowels =~ s/[^aeiou]//g;
  $b_vowels =~ s/[^aeiou]//g;
   print "DEBUG: Comparing $a_vowels with $b_vowels\n";
  return $a_vowels cmp $b_vowels
}

print sort { sort_vowelsonly }  <DATA>;

__DATA__
albatross 
apparate 
fanfare 
candelabra 
panacea 
vermeil 
parmesan 
albacore 
false
beans
#!/usr/bin/perl -w

    use strict;
    use warnings;

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

    sub sort_vowelsonly {
     my $a_vowels = $a; 
     my $b_vowels = $b; 

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

    return $a_vowels cmp $b_vowels;
    }


    print sort { sort_vowelsonly } <$INFILE>;


    close $INFILE;