使用map从对象函数创建数组

时间:2009-10-06 02:44:02

标签: perl map

我有从HTML::ElementHTML::Element->find获得的HTML::TreeBuilder数组,我需要将其as_text值分配给其他一些变量。我知道我真的很容易做到

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

但我希望我可以使用map来代替使代码更具可读性,因为数组中至少有8个元素。我是Perl的新手,所以我不太清楚该怎么做。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:9)

如果你精通perldoc -f map,那就非常清楚:

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

如果要分配标量列表,也可以使用

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

但是,对于未知数量的元素,阵列版本当然更好。

答案 1 :(得分:1)

请注意,如果您只想映射@arr的前两个元素:

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

将为$_->as_text的所有元素调用@arr。在这种情况下,请使用数组切片以避免不必要的调用:

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";

输出:

C:\Temp> jk
97      98      26
A       B       2
ord的每个元素调用了{p> @arr,而uc只调用了我们感兴趣的元素。