2011-09-09 8 views
1

例えば、perl配列から複数の値を取得する最良の方法は何ですか?

まず、私は次

my @dataRecord = split(/\n/); 

、このような配列にdataRecordを取得し、私は

@dataRecord = grep(/test_names/,@dataRecord); 
、このような試験線を取得する配列データレコードをフィルタリング

次は、私は、このようなテストラインからテスト名を取得する必要があります

my ($test1_name,$test2_name,$test3_name) = getTestName(@dataRecord); 

    sub getTestName 
    { 
     my $str = shift @_; 
     # testing the str for data and 
     print str,"\n"; # This test point works in that I see the whole test line. 
     $str =~ m{/^test1 (.*), test2 (.*), test3 (.)/}; 
     print $1, "\n"; # This test point does not work. 
     return ($1,$2,$3); 
    } 

このタスクを実行するためのより良い方法はありますか?

+0

あなたはどのような値を期待しています戻ってくる? –

答えて

4

必要な構文を減らしながら操作を連鎖させることができます。これには、プログラムの重要な部分を強調しながら構文ノイズを減らすという利点があります。

my @test = map m{/^test1 (.*), test2 (.*), test3 (.)/}, 
      grep /test_names/, 
      split /\n/; 

# use $test[0], $test[1], $test[2] here 

あなたが問題をデバッグしようとしている場合は、マップとgrepは、エラーチェックコードを挿入することが容易になり、ブロックを取ることができます:ここでは

my @test = map { 
       if (my @match = m{/^test1 (.*), test2 (.*), test3 (.)/}) { 
        @match 
       } else { 
        die "regex did not match for: $_" 
       } 
      } # no comma here 
      grep /test_names/, 
      split /\n/; 

は、アレイから割り当てるには、いくつかの異なる方法がありますがそれは直接あなたの質問に関連、おそらく便利ですされていません。

my ($zero, $one, $two) = @array; 
my (undef, $one, $two) = @array; 
my (undef, undef, $two) = @array; # better written `my $two = $array[2];` 

my ($one, $two) = @array[1, 2]; # note that 'array' is prefixed with a @ 
my ($one, $two) = @array[1 .. 2]; # indicating that you are requesting a list 
            # in turn, the [subscript] sees list context 
my @slice = @array[$start .. $stop]; # which lets you select ranges 

サブルーチンに引数を解凍するには:

ペアを取る方法で
my ($first, $second, @rest) = @_; 

my ($self, %pairs) = @_; 
+0

ありがとうエリック、どのようにnull値が@test配列に入力されていないことを確認できますか? –

+0

どのタイプのヌルですか?値は未定義で、その場合は 'grep defined、...'となります。値には長さ、 'grep length、...'がありません。値はゼロかもしれません、 'grep $ _!= 0、...'。あるいは、 'grep $ _、...'と誤っている可能性があります。誤った値が現れるポイントで、これらのいずれかを処理スタックに追加します。 –

+0

ありがとうもう一度エリック、値が定義されていないように聞こえるパターンマッチ(m //)エラーで、初期化されていない値$ strを使用しています。これは奇妙なエラーです。なぜなら、grepはそれぞれのデータレコードをキャプチャするためにあなたに伝えるフィルタデータだけをキャプチャすると考えていたからです。 –

0

あなたは(変数のリストに、その戻り値を割り当てることによって、例えば、リストコンテキストでm//演算子を使用して一致する部分式のリストを取得することができサブルーチンコールで現在行っているように)。だから、あなたがはるかに簡単な構築物でサブルーチンを置き換えることができます。

my $str = shift @dataRecord; 
my ($test1_name, $test2_name, $test3_name) = 
    $str =~ m/^test1 (.*), test2 (.*), test3 (.)/; 

または、forループあなたが@dataRecord配列の各要素のためにこれをしたい場合:

for my $str (@dataRecord) { 
    my ($test1_name, $test2_name, $test3_name) = 
     $str =~ m/^test1 (.*), test2 (.*), test3 (.)/; 
} 
関連する問題