私はPerlのマップは、配列スライスを使用することはできますか?
質問
私はいくつかの変数にHTML ::要素のアレイからHTML ::、エレメント> as_trimmed_textを割り当て、コード行を短くしようとしています
my ($var1, var2) = ($columns[1]->as_trimmed_text, $columns[2]->as_trimmed_text);
..それはさらにいくつかのライン上に続けて、いくつかのより多くの列があることを除いて。私が代わりにマップを使用することができ、明るい考えを持っていたが、私は本当に多くの幸運を持っていませんよ。私は
のバリエーションを試してみましたmap { $_->as_trimmed_text } @columns[1, 3, 5, 7, 9]
が、私は、パッケージまたはオブジェクト参照なしでメソッド「as_trimmed_text」を呼び出すことはできません取得しておく。
私がしようとしているか、私はちょうど私が現在持っているものに固執すべきである何をすることは可能ですか?
TIA
EDIT:コラム - >列
解決
まず第一に、あなたがマップの出力に興味を持っていないのであれば、あなたはマップを使用しないでください。地図は、grepのように、並べ替えなどのフィルタです。あなたが出力をしたくない場合は、foreachのを使用します。
しかし、あなたは正しい、マップは問題のまさにこのようなものを解決するために設計されました。それは、配列のスライスを使用していないが、これは、あなたが望む出力が得られます。
@trimmed_columns = map { $column[$_]->as_trimmed_text } (1, 3, 5, 7, 9);
ロバート・Pの答えする元は動作しませんでした理由を良く説明します。
他のヒント
それを見つけます:
ここではどのようなのはずの起こるエミュレートしたコードのビットです
use strict;
use warnings;
package Text;
sub new
{
my $class = shift;
my $text = shift;
return bless { TEXT => $text }, $class;
}
sub as_trimmed_text
{
my $self = shift;
my $text = $self->{TEXT};
$text =~ s/^\s*(.*?)\s*$/$1/;
return $text;
}
package main;
my @texts = ( Text->new(' foo '), Text->new(' bar '), Text->new(' baz '));
my @trimmed = map { $_->as_trimmed_text() } @texts[1, 2];
print "Trimmed were: ", join(',', map { "'$_'" } @trimmed);
この作品、および正常に動作します。私が入手ます:
Trimmed were: 'bar','baz'
しかし、私はこの行でマップを交換する場合:
my @trimmed = map { $_->as_trimmed_text() } @texts[2, 3];
突然のすべてが、私はこの出力を取得します:
Can't call method "as_trimmed_text" on an undefined value
「3」@textsで有効な値の範囲外であるためですので、新しいエントリをautovivifies、それがundef
ます。次に、あなたのマップはありません。
undef->as_trimmed_output()
はbarfs。私は再びあなたの配列スライスをチェックして、あなたが実際に使用可能なインデックス外の値をつかんで、そしてあなたが実際にそのmap
でHTML ::要素部材を処理していることを確認し、ことを除けばされていないことを確認してくださいと思います。 Data::Dumper::Dumper
の値に迅速@columns
は非常に役立ちます。
たとえば、あなたが含まれているためにあなたの配列を変更する場合は、
my @texts = ( Text->new(' foo '), Text->new(' bar '), ' baz ');
と私は今、あなたのエラーを取得し、それを実行しようとします:
Can't call method "as_trimmed_text" without a package or object reference at map.pl
ですから、二重のチェックはあなたの配列の内容は、実際にあなたがのメソッドを呼び出すためにしようとしているクラスのすべてのインスタンス祝福されていることを確認する。
あなたのmap
は、右の私には見えます。あなたは、第二の1の代わりに@columns
の@column
言うべきか?あなたは、変数名にタイプミスをキャッチするためにstrict
オンになっているのですか?
あなたは第二の例の@columns
で別の変数を使用しますが、@column
ていません。次のコードを使用してみます:
map { $_->as_trimmed_text } @column[1, 3, 5, 7, 9]