0

私はまだ map コマンドの使用方法を学んでおり、次のコードを次のコードから map コマンドの使用に変換する方法を理解するのに苦労しています。

一発ギャグ

perl -MData::Dumper -wE'
   $_ = "Alpha,Beta,Gamma|Alpha,Beta";
   say;
   ($first,$second)=split/\|/;
   @first=split /,/,$first;
   @second=split /,/, $second;
   print Dumper({FIRST=>\@first, SECOND=>\@second})
'

完全なスクリプト:

#! /usr/bin/perl  
use strict; 
use warnings; 
use Data::Dumper;
use v5.10; 

$_ = "Alpha,Beta,Gamma|Alpha,Beta";

say;

my ($first,$second)=split/\|/; 
my @first=split /,/,$first; 
my @second=split /,/, $second; 
warn Dumper({FIRST=>\@first, SECOND=>\@second});

代わりに map 関数を使用して、以下の行を 2 つの配列に変換します。

アルファ、ベータ、ガンマ|アルファ、ベータ

$VAR1 = {
          'FIRST' => [
                       'Alpha',
                       'Beta',
                       'Gamma'
                     ],
          'SECOND' => [
                        'Alpha',
                        'Beta'
                      ]
        };
4

2 に答える 2

4

繰り返される部分は、コンマでの分割、配列の作成、その配列への代入、およびその配列への参照の取得 ( my @first = split /,/, $first; \@first) であるため、これがループ内 (my @a = split /,/, $_; \@a別名[ split /,/ ]) になります。

my %h; @h{qw( FIRST SECOND )} = map [ split /,/ ], split /\|/;

なぜハッシュを使用しているのですか?配列の方がはるかに自然です。

my @a = map [ split /,/ ], split /\|/;

後者では、$a[0]and$a[1]の代わりに$h{FIRST}and を使用します$h{SECOND}

于 2013-11-02T17:24:04.377 に答える
3
perl -MData::Dumper -wle'
  $_ = "Alpha,Beta,Gamma|Alpha,Beta"; 
  print;
  my @r = 
      # map { my @x = split /,/; \@x } 
      map { [split /,/] } # same functionality as above
      split/\|/; 
  warn Dumper \@r;
'

上記のように正確な出力を得るには(Dumper href)

perl -MData::Dumper -wle'
  $_ = "Alpha,Beta,Gamma|Alpha,Beta"; 
  print;
  my %h =
      map { qw(FIRST SECOND)[$i++] => [split /,/] }
      split/\|/; 
  warn Dumper \%h;
'
于 2013-11-02T17:04:52.353 に答える