Perl:如何对值进行排序并将它们放入数组中

Perl : How to sort value and put them into array

我是 Perl 的新手,但这是我正在尝试做的事情,例如变量的值为 apple、banana、cat、dog,我需要将此值放入单个数组中,例如

my $value = "apple","banana","cat","dog";

结果:

my @A = "apple";
my @B = "banana";
my @c = "cat";
my @D = "dog";

就这样?我希望有人能帮我解决这个问题,非常感谢

我认为你误解了一些概念。

以美元符号开头的变量 $ 只能保存一个值。它们被称为标量,它们不能是数组。

my $value = "apple","banana","cat","dog";

$value 的值将只是 "apple"。该列表的其他部分将被丢弃。

你的变量@A@B@C@D都是数组。当一个变量有一个 at @ 作为它的标志时,它就是一个数组。

my @A = "apple";
my @B = "banana";
my @c = "cat";
my @D = "dog";

这段代码确实创建了四个数组,每个数组有一个值,这很好。但这可能不是你被要求做的。

我想你的意思是将单词列表分配给一个数组,然后将数组的每个元素分配给一个单独的标量变量。


# make an array of words
my @words = ( "apple","banana","cat","dog" );

# assign each one to a single variable.
my ($apple, $banana, $cat, $dog) = @words;

上面的代码使用列表赋值和等号左侧的变量列表 = 将数组的元素放入这些变量中。

另一种方法是通过访问数组中的元素来单独分配每个元素。为此,印记从 @ 更改为 $

my $apple  = $words[0];
my $banana = $words[1];
my $cat    = $words[2];
my $dog    = $words[3];
不过,

None 其中与排序有关。

如果要对数组进行排序,可以使用 sort built-in。您的列表已经按字母顺序排序,所以这不是很令人兴奋。

my @sorted = sort @values;
print "@sorted"; # apple banana cat dog

because I need it to be arranged in alphabetical order using array as a holder for those value. so if the script capture this letter it will go to that array , for example if the script has the value of yoyo it will go to array @Y. just like that , I hope you understand what I mean. thank you

看起来你想要做的是创建一个 multi-level 数据结构,所以你可以报告这样的事情。

A: apple, astronaut
B: banana, buttons
C: cat, carnage
D: dog
P: perl
Y: yoyo, yawn

现在您通常不会为此使用 26 个不同的数组。这真是糟糕的风格,而且很难维护,因为你不能让它动态化。

相反,您将使用 multi-level 数据结构。哈希参考非常适合。

$sorted_words_by_first_letter = {
  'a' => [ 'apple', 'astronaut' ],
  'b' => [ 'banana', 'buttons' ],
   # ...
}

您必须迭代列表,查看每个单词的第一个字母,然后将它们放入哈希引用中的正确键中。

my $sorted_words_by_first_letter;
my @words = qw/ banana apple astronaut yoyo buttons /;
foreach my $word (@words) {
  
  # find the first character
  $word =~ m/^(.)/; 
  
  # put it at the end of the array for the appropriate letter
  push @{ $sorted_words_by_first_letter->{} }, $word;
}

您可以在 perlref and perlreftut. You can read more about regular expressions at perlre 阅读更多关于 Perl 中的引用和 multi-level 数据结构的信息。

如果您输入的不是列表,而是字符串,您先 need to split 它。

my @words = split /,/, "banana,apple,astronaut,yoyo,buttons";

要将其转换回我上面显示的输出,您需要迭代键。

foreach my $letter ( sort keys %{ $sorted_words_by_first_letter } ) {
  printf "%s: %s\n", uc($letter),
    join ', ', sort @{ $sorted_words_by_first_letter->{$letter };
}

这将输出以下内容:

A: apple, astronaut
B: banana, buttons
Y: yoyo

为了向您展示为什么不应该为每个不同的字母使用特定变量,请考虑此代码。我只是展示这个,所以你明白为什么这是一个坏主意。请不要这样做。


my ( @A, @B, @C, @D, @E, @F, @G, @H, @I, @J, @K, @L, @M, 
     @N, @O, @P, @Q, @R, @S, @T, @U, @V, @W, @X, @Y, @Z );

my @words = qw/ banana apple astronaut yoyo buttons /;
foreach my $word (@words) {

  # find the first character, assign to var
  ( my $letter ) = $word =~ m/^(.)/; 

  if ($letter =~ m/a/i) {
    push @A, $word;
  } elsif ($letter =~ m/b/i) {
    push @B, $word;
  } elsif ($letter =~ m/c/i) {
    push @C, $word;
  } # ...

如您所见,它很快变得又长又笨重,我们甚至还没有讨论过之后如何使用它。这将需要再次进行相同数量的重复。所以请不要这样做。 它所做的只是让你的代码很难维护。