0

次のような配列があります。

@array = ('a:b','c:d','e:f:g','h:j');

grep と map を使用して、これを次のように変換するにはどうすればよいですか?

%hash={a=>1,b=>1,c=>1,d=>1,e=>1,f=>1,h=>1,j=>1};

私はもう試した:

 @arr;

 foreach(@array){
    @a = split ':' , $_;
    push @arr,@a;

 } 


  %hash = map {$_=>1} @arr; 

しかし、私は個々の配列の最初の2つの値を取得する必要があるすべての値を取得しています

4

4 に答える 4

4

それは非常に簡単です:

%hash = map {$_=>1} grep { defined $_ } map { (split /:/, $_)[0..1] } @array;

したがって、各配列要素を「:」区切り文字で分割すると、配列が大きくなり、最初の値は 2 つだけになります。次に、定義された値をgrepし、キーと値のペアを作成する他のマップに渡します。

于 2013-06-22T05:19:22.250 に答える
1

の後の最初の 2 つの要素を除くすべてを無視する必要がありますsplit

 my @arr;
 foreach (@array){
    @a = split ':', $_;
    push @arr, @a[0,1];
 } 

  my %hash = map {$_=>1} @arr; 

地図を使って、

my %hash =
  map { $_ => 1 }
  map { (split /:/)[0,1] }
  @array;
于 2013-06-22T05:57:18.847 に答える
1

十分にエレガントではありませんが、これは機能するはずだと思います。一時配列を使用して結果を保持しsplit、最初の 2 つの要素を返します。

my %hash = map { $_ => 1 } map { my @t = split ':', $_; $t[0], $t[1] } @array;
于 2013-06-22T06:21:36.733 に答える
1

gこれにより、キーが除外されます

my %hash = map { map { $_ => 1; } (split /:/)[0,1]; } @array;
于 2013-06-22T06:25:27.993 に答える