gpt4 book ai didi

Perl 排序字符串

转载 作者:行者123 更新时间:2023-12-02 08:30:54 25 4
gpt4 key购买 nike

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

例如:vowel1 将是 string1 中出现的元音的子串,而 vowel2 对应string2 的子串。如果子字符串 vowel1 在 ASCII 升序中出现在 vowel2 之前,则 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";
}
}

当我编译程序时,这是结果。

Use of uninitialized value $_ in substitution (s///) at sort_strings.pl line 14, <IN> line 1.
Use of uninitialized value $w in hash element at sort_strings.pl line 16, <IN> line 1.
Can't use an undefined value as a HASH reference at sort_strings.pl line 23.

我对 Perl 还是个新手,仍然对一些你能做和不能做的事情感到困惑。对于哈希引用错误,我认为您可以使用 % 来引用它。我见过使用数组执行此操作的代码。

我知道 $w 是未初始化的,但这种情况下的值并不重要。

有没有比我现在做的更好的方法?

非常感谢任何帮助。

编辑(示例数据):

如果我有一个包含这些词的文本文件

albatross,
apparate,
fanfare,
candelabra,
panacea,
vermeil,
parmesan,
albacore,
false,
beans,

顺序应该是:

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

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

关于Perl 排序字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26978663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com