我有一個哈希陣列,我需要將它分成兩個不同的陣列。哈希陣列如下所示:
[
{
'a'=>1
'b'=>2
'c'=>3
'd'=>4
},
{
'e'=>5
'f'=>6
'g'=>7
'h'=>8
}
];
我需要以以下方式將其劃分為兩個不同的陣列:
[{
'a'=>1
'b'=>2
'c'=>3
'd'=>4
}]
[{
'e'=>5
'f'=>6
'g'=>7
'h'=>8
}]
我試過下面的代碼:
my @new_array;
push @new_array, [ splice @$missingSections, 0, 2 ] while @$old_array;
但這是拆分陣列并將其合并到同一個陣列中,這意味著我得到以下輸出:
[[{
'a'=>1
'b'=>2
'c'=>3
'd'=>4
}],
[{
'e'=>5
'f'=>6
'g'=>7
'h'=>8
}]]
我該怎么做才能得到兩個不同的陣列?
uj5u.com熱心網友回復:
Perl 中的陣列支持一系列操作。至于基礎,我們可以從前面或后面洗掉和回傳一個元素,使用shift或pop,并可以添加unshift或push。
然后還有更多,包括splice您嘗試過的,然后還有用于更復雜操作的庫。但是基礎知識很容易解決您的問題。單程
my $old_arrayref = [ { a=>1, b=>2 }, { c=>3, d=>4 } ];
my @new_array_1 = shift @$old_array;
my @new_array_2 = shift @$old_array;
(一個陣列可以簡單地分配一個元素串列,只包括一個元素。但是如果陣列中有任何東西,那么在這樣的分配之后這些都將消失,所以不要忘記這一點。)
在此問題之后,我將源 ( old_array) 作為陣列參考。現在它$old_array是空的,如果它只有現在在@new_array_N's 中的那兩個元素。?
另一種更基本的方法是索引陣列以訪問單個元素并將它們復制到新陣列。這種方式$old_array將保持原樣。
也許更合理的安排是將這兩個新陣列的參考作為陣列的元素,這可能是您的代碼嘗試做的。為此,您只需要?
my @new_array = map { [ $_ ] } @$old_array;
該地圖在塊中的代碼適用于它的輸入中的每個元素(@$old_array),回傳清單,分配給@new_array。這[]在身體構造一個匿名陣列(參考),這是一個標量,因此可以放置在陣列上。放置在此陣列參考中的唯一元素是 的當前處理元素@$old_array,可在(無處不在的)$_變數 中使用。
見perlintro和perldata上面鏈接,并在鏈接shift。對于庫中提供的對串列和陣列的許多其他操作,請參閱List::Util和List::MoreUtils以了解初學者。
有關參考資料,請參閱perlreftut,有關具有參考資料的陣列,請參閱perllol(串列串列)和perldsc(資料結構食譜)。
一個完整的程式?
use warnings;
use strict;
use feature 'say';
use Data::Dumper;
my @old_array = ( { 'a'=>1, 'b'=>2 }, { 'c'=>3, 'd'=>4 } );
my @new_array = map { [ $_ ] } @old_array;
say Dumper \@new_array;
這個列印(只是濃縮,在這篇文章中的可讀性)
$VAR1 = [
[ { 'a' => 1, 'b' => 2 } ],
[ { 'c' => 3, 'd' => 4 } ]
];
? 如果新陣列也需要是陣列參考
my $new_arrayref_1 = [ shift @$old_array ];
my $new_arrayref_2 = [ shift @$old_array ];
在第二個例子中,在簡短的“完整程式”中
my $new_arrayref = [ map { [ $_ ] } @$old_array ];
uj5u.com熱心網友回復:
您想要的輸出不是有效的 Perl,所以不清楚您想要什么。
如果您想要以下內容:
my $array_of_arrays_of_single_hash = [
[{
'a'=>1
'b'=>2
'c'=>3
'd'=>4
}],
[{
'e'=>5
'f'=>6
'g'=>7
'h'=>8
}]
];
然后您可以使用以下內容:
my $array_of_arrays_of_single_hash = [
map { [ $_ ] }
@$array_of_hashes
];
相反,如果您想要以下內容:
my $array_of_single_hash_1 = [{
'a'=>1
'b'=>2
'c'=>3
'd'=>4
}];
my $array_of_single_hash_2 = [{
'e'=>5
'f'=>6
'g'=>7
'h'=>8
}];
然后您可以使用以下內容:
my ($array_of_single_hash_1, $array_of_single_hash_2) =
map { [ $_ ] }
@$array_of_hashes;
這兩種解釋都使用單個元素創建陣列,這通常不是人們想要的。
也許你想要以下內容:
my $hash1 = {
'a'=>1
'b'=>2
'c'=>3
'd'=>4
};
my $hash2 = {
'e'=>5
'f'=>6
'g'=>7
'h'=>8
};
然后您可以使用以下內容:
my ($hash1, $hash2) = @$array_of_hashes;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316249.html
