我有一個陣列,比如說@array1 = qw(abc def ghi jkl)。
現在,我想以一種將元素 1 逐 1 移動的方式使用這個陣列,但這種移動實際上是發生的,而不是在陣列中。
就像,“ shift”將移動元素并將它們從陣列中洗掉。但是,我不希望洗掉這些元素。
短代碼片段:
while (my $rName = shift @array1) {
my $bName = shift @array1 ;
## Do something now with the value
}
##And now, I want that I can use @array1 again with the original elements residing
如何實施?
uj5u.com熱心網友回復:
在Perl 5.36中,您將能夠這樣做:
for my ($rName, $bName) (@array1) { ... }
uj5u.com熱心網友回復:
使用 C 風格的for回圈并以 2 遞增。$#foo是最后一個元素的索引。
my @foo = 0 .. 5;
for (my $i = 0; $i <= $#foo; $i = 2){
my $r_name = $foo[$i];
my $b_name = $foo[$i 1];
}
如果您想要看起來更漂亮的代碼,您可以使用CPAN 上natatime的 List::MoreUtils,它為您提供了一個可以在while回圈中使用的迭代器。
use List::MoreUtils 'natatime';
my @foo = 0 .. 5;
my $it = natatime 2, @foo;
while ( my ($r_name, $b_name) = $it->() ) {
print "$r_name $b_name\n";
}
uj5u.com熱心網友回復:
您還可以pairs從核心List::Util模塊中使用:
該函式是對偶數大小的對串列進行操作的便捷快捷方式,它回傳一個
ARRAY參考串列,每個參考包含給定串列中的兩個專案。
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use List::Util qw/pairs/;
my @array1 = qw/a 1 b 2 c 3/;
for my $pair (pairs @array1) {
my ($rName, $bName) = @$pair;
say "$rName => $bName";
}
say "@array1";
uj5u.com熱心網友回復:
# Require Perl 5.36
for my ( $rName, $bName ) ( @array1 ) {
...
}
my @array2 = @array1;
while ( @array2 ) {
my $rName = shift @array2;
my $bName = shift @array2;
...
}
for my $i ( 0 .. $#array1/2 ) {
my $rName = $array1[ $i * 2 0 ];
my $bName = $array1[ $i * 2 1 ];
...
}
for ( my $i = 0; $i < @array1; ) {
my $rName = $array1[ $i ];
my $bName = $array1[ $i ];
...
}
use List::Util qw( pairs );
for ( pairs @array1 ) {
my ( $rName, $bName ) = @$_;
...
}
我試圖從最快到最慢來組織它們,但我實際上并沒有對任何東西進行基準測驗。
之前提到了三個解決方案,但沒有人提到我認為最快的解決方案,不需要 5.36(尚未發布)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/439354.html
上一篇:將位元組陣列轉換為十進制
下一篇:perlDBI模塊安裝出錯
