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