我有 2 個空陣列,我使用 for 回圈將專案添加到其中。
@main = (
"a 1 b 2 c 3 ",
"d 4",
"e 5 f 6 g 7 h 8",
"i 9 j 10",
);
@arr1 = (); #only gets the letters
#supposed to look like:
#(
#[a,b,c]
#[d]
#[e,f,g,h]
#[i,j]
#)
@arr2 = (); #only gets the numbers
#supposed to look like:
#(
#[1,2,3]
#[4]
#[5,6,7,8]
#[9,10]
#)
for($i=0;@main;$i =1){
@line = split(/\s /,shift(@main));
push(@arr1,[]);
push(@arr2,[]);
while(@line){
push(@arr1[$i],shift(@line));
push(@arr2[$i],shift(@line));
}
}
錯誤:
Experimental push on scalar is now forbidden at index.pl line 29, near "))"
Experimental push on scalar is now forbidden at index.pl line 30, near "))"
@arr[$i] 似乎回傳了對陣列的參考。如何獲取此陣列并向其中添加專案?
uj5u.com熱心網友回復:
push 的第一個引數必須是陣列,而不是陣列切片。我認為您想要 @{ $arr1[$i] } (但這不是您唯一的問題)。確保您使用的是 use strict;使用警告;!——池上
for(my $i=0;@main;$i =1){
my @line = split(/\s /,shift(@main));
push(@arr1,[]);
push(@arr2,[]);
while(@line){
# ↓↓ ↓
push( @{ $arr1[$i] } ,shift(@line));
push( @{ $arr2[$i] } ,shift(@line));
}
}
不完全確定它是如何作業的,可能會將參考變成沿著這些線的實際陣列。
我自己想出的另一個解決方案是在之后添加完成的陣列,而不是慢慢添加值:
for($i=0;@main;$i =1){
@line = split(/\s /,shift(@main));
@subArr1 = ();
@subArr2 = ();
while(@line){
push(@subArr1,shift(@line));
push(@subArr2,shift(@line));
}
push(@arr1,[@subArr1]);
push(@arr2,[@subArr2]);
}
uj5u.com熱心網友回復:
從 perl 5.36 開始,您可以在回圈中一次迭代串列的多個元素foreach,這可以讓您稍微清理一下:
#!/usr/bin/env perl
use 5.036;
# The next two lines aren't strictly needed because of the above, but
# I like to be explicit
use strict;
use warnings;
use experimental qw/for_list/;
use Data::Dumper;
my @main = (
"a 1 b 2 c 3 ",
"d 4",
"e 5 f 6 g 7 h 8",
"i 9 j 10",
);
my (@arr1, @arr2);
for my $line (@main) {
my (@sub1, @sub2);
for my ($name, $num) (split " ", $line) {
push @sub1, $name;
push @sub2, $num;
}
push @arr1, \@sub1;
push @arr2, \@sub2;
}
print Dumper(\@arr1, \@arr2);
您可以在舊版本中使用模塊natatime中的相同方法(可從 CPAN 或您的作業系統的包管理器獲得):List::MoreUtils
#!/usr/bin/env perl
use strict;
use warnings;
use List::MoreUtils qw/natatime/;
use Data::Dumper;
my @main = (
"a 1 b 2 c 3 ",
"d 4",
"e 5 f 6 g 7 h 8",
"i 9 j 10",
);
my (@arr1, @arr2);
for my $line (@main) {
my (@sub1, @sub2);
my $it = natatime 2, split(" ", $line);
while (my ($name, $num) = $it->()) {
push @sub1, $name;
push @sub2, $num;
}
push @arr1, \@sub1;
push @arr2, \@sub2;
}
print Dumper(\@arr1, \@arr2);
它們的共同點是首先構建每個子陣列,然后將對它們的參考推送到@arr1最后@arr2,從而消除對大量 arrayref 解除參考語法的需求。它們還直接迭代您存盤在子陣列中的元素,而不是直接使用shift.
uj5u.com熱心網友回復:
請檢查以下演示代碼是否符合您的問題。
該代碼基于 OP 代碼中的注釋,其中描述了結果陣列的外觀。
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my(@main,@arr1,@arr2);
@main = (
"a 1 b 2 c 3 ",
"d 4",
"e 5 f 6 g 7 h 8",
"i 9 j 10",
);
for ( @main ) {
push(@arr1,[ /(\d )/g ]);
push(@arr2,[ /([a-z])/g ]);
}
say Dumper(\@arr1,\@arr2);
輸出
$VAR1 = [
[
'1',
'2',
'3'
],
[
'4'
],
[
'5',
'6',
'7',
'8'
],
[
'9',
'10'
]
];
$VAR1 = [
[
'a',
'b',
'c'
],
[
'd'
],
[
'e',
'f',
'g',
'h'
],
[
'i',
'j'
]
];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513201.html
標籤:perl多维数组
