2009-10-06 14 views
5

の配列は、HTML::TreeBuilderHTML::Element->findから得られており、他の変数にはas_textの値を割り当てる必要があります。私は本当に簡単にマップを使用したオブジェクト関数からの配列の作成

my ($var1, $var2) = ($arr[0]->as_text, $arr[1]->as_text); 

を行うことができます知っているが、私は配列の少なくとも8つの要素があるとしてだけでコードは少し読みやすくするために代わりにmapを使用することができ期待していました。私はPerlには本当に新しいので、私は何をすべきかについてはあまりよく分かりません。

誰でも正しい方向に向けることができますか?

答えて

9

あなたがよくperldoc -f mapに精通している場合、それはかなり明らかだ:

my @as_texts = map { $_->as_text } @arr; 

あなたがスカラーのリストに割り当てたい場合にも作品:

my($var1, $var2, $var3, ...) = map { $_->as_text } @arr; 

しかし、もちろん配列バージョン未知数の要素の方が良いです。

my($var1, $var2) = map { $_->as_text } @arr; 

@arrのすべての要素の$_->as_textを呼び出します:あなただけ@arrの最初の2つの要素をマップする場合、

+2

これは私です個人的な好みの重要な問題ですが、変換が単純な場合は 'map $ _-> as_text、@ arr'というEXPR形式の' map'を使うことを好みます。 – hobbs

+1

@hobbs - 私はしばしばしますが、$ _-> as_textがそのような場合に期待通りに動作するかどうかはわかりませんでした。私は 'map chr、@ arr'が動作することを知っていますが、メソッド呼び出しが同じように動作するかどうかはわかりませんでした。見つけ出す唯一の方法はテストすることだと思いますが、この特定のケースで私は個人的に大括弧を使うことを好みます。 –

+1

@hobbs 'map EXPR、LIST'は' map BLOCK LIST'よりも速いですが、私は後者のための吸盤です。 –

1

注意。その場合には、不要な呼び出しを回避するために、配列スライスを使用する:

my($var1, $var2) = map { $_->as_text } @arr[0 .. 1]; 

例:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @arr = 'a' .. 'z'; 
my $count; 
my ($x, $y) = map { $count++; ord } @arr; 

print "$x\t$y\t$count\n"; 

$count = 0; 
($x, $y) = map { $count++; uc } @arr[0 .. 1]; 

print "$x\t$y\t$count\n"; 

出力:ucが呼び出されたのに対し、

 
C:\Temp> jk 
97  98  26 
A  B  2 

ord@arrの各要素を求めました私たちが興味を持っていた要素についてのみ。

関連する問題