スライス、またはPerlの非常に便利なスライス

現実世界の問題を解決するために、データのリストを常に使用する必要があります。 そして、このアクティビティで一番幸せなのはPerlプログラマです:)



これは、配列またはハッシュの一部を操作するための便利なスライスがあるためです。 スライスは演算子ではなく、ピースが大きなオブジェクトから切り取られるときのデータ処理の原則です。

表示しやすい:



my @arr = (1, 3, 5, 7, 9);

my @arr_slice = @arr[2..4]; # (5, 7, 9)



my %hash = ( 'first' => 2, 'second' => 5, 'last' => 99);

my @hash_slice = @hash{ 'first' , 'last' }; # (2, 99)




* This source code was highlighted with Source Code Highlighter .








そして、これが匿名配列とハッシュの構文です:



my $arr_ref = [1, 3, 5, 7, 9];

my @arr_ref_slice = @{$arr_ref}[2,3]; # (5, 7)



my $hash_ref = { 'first' => 2, 'second' => 5, 'last' => 99};

my @hash_ref_slice = @{$hash_ref}{ 'second' , 'last' }; # (5, 99)




* This source code was highlighted with Source Code Highlighter .








NB。 匿名構造の一般的なルールは

常に最初の括弧内の配列として示されます-関心のあるオブジェクトへの参照(配列またはハッシュ)、および2番目-このオブジェクトの要素のリスト。



my $deep_arr = [1, [2, 3, [4, [20, 26, 28]]], 10];

my @deep_arr_slice = @{$deep_arr->[1][2][1]}[0,2]; # (20, 28)








大量のハッシュなどと同様に、多次元ハッシュとハッシュ配列を使用します。 同じことを自分で試してみてください、それは完全に簡単です。



別の話に移ります-ハッシュをスライスして新しいハッシュを作成します。



my @keys = ( 'first' , 'last' );

my %old_hash = ( 'first' => 2, 'second' => 6, 'last' => 99);

my %new_hash;

@new_hash{@keys} = @old_hash{@keys};

# (first => 2, last => 99)










出来上がり! 最も重要なことは、最初に新しいハッシュを宣言することを忘れないことです。その後、perlは必要なキーを作成し、古いハッシュから値を割り当てます。 サイクルよりも短いもの。 はい、より明確に。



確かに、1つの障害があります-このような構造の場合

my $complex_ref = [{ 'a' => 2, 'b' => 5}, { 'a' => -4, 'b' => 8}, { 'a' => 10, 'b' => -2}];







「a」のすべての値を選択し、それらを新しい配列に割り当てると、次のようにはなりません。

my @new_complex = @{$complex_ref}[0..2]{ 'a' } # wrong!!! syntax error





または:

my @new_complex = @{$complex_ref->[0..2]}{ 'a' }; # (-4)???!!!







この問題を解決するために、私たちは少しチートをして...マップを取得します!



my @new_complex = map {$_->{ 'a' }} @{$complex_ref}[0..2];







まあ、そのようなことは実際の生活の中で便利になります:



my $new_complex_ref = [ map { { 'a' => $_->{ 'a' }, 'c' => ( $_->{ 'b' } + 3 )} } @{$complex_ref}[0, 2] ];







理解してみてください、複雑なものは絶対にありません。 コードが少し読みにくくなっていることには同意しますが、そのタイプの「クラシック」バージョン



my $classic_complex_ref;

for ( my $i = 0; $i <= $#{$complex_ref}; $i++ ){

next if ( $i == 1 );

my $a_val = $complex_ref->[$i]{ 'a' };

my $b_val = $complex_ref->[$i]{ 'b' };

$b_val += 3;

my $hash = { 'a' => $a_val, 'b' => $b_val};

push @$classic_complex_ref, $hash;

}




* This source code was highlighted with Source Code Highlighter .








かさばる。



私見-小さいコードの詳細なコメントは、コメントのない教科書レベルのコードよりもはるかに便利です。 自然言語を読むことは、より簡単で、より速く、より楽しくなります。



PS。 投稿は、プロにとっては明白であり、言語の初心者にとっては理解できない、ちょっとした瞬間を強調するために最善の意図で書かれました。



All Articles