我可以将Perl的地图与数组切片一起使用吗?

时间:2009-11-05 22:22:13

标签: perl arrays map subscript

我只是想缩短一行代码,将HTML :: Element-> as_trimmed_text从HTML :: Elements数组分配给一些变量 - 非常标准的东西,如:

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

编辑:列 - >列

4 个答案:

答案 0 :(得分:9)

找到它:

这里有一些模拟应该发生的代码:

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中有效值的范围,因此它会自动生成一个新条目,并使其成为undef。然后,你的地图

undef->as_trimmed_output()

哪个barfs。我会再次检查你的数组切片,并确保你没有抓住可用的实际索引之外的值,并且除此之外,验证你实际上正在使用map处理HTML :: Element成员。对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

因此,仔细检查以确保数组的内容实际上是您尝试调用方法的类的所有祝福实例。

答案 1 :(得分:5)

您的map看起来对我而言。您确定第二个应该说@columns而不是@column吗?你有strict打开以捕获变量名称的拼写错误吗?

答案 2 :(得分:1)

首先,如果您对地图的输出不感兴趣,则不应使用地图。地图,如grep,sort等是一个过滤器。如果您不想输出,请使用foreach。

但你是对的,地图的目的是解决这类问题。这将提供您想要的输出,尽管它不使用数组切片。

@trimmed_columns = map { $column[$_]->as_trimmed_text } (1, 3, 5, 7, 9);

Robert P's answer更好地解释了为什么原版不起作用。

答案 3 :(得分:1)

您在第二个示例@columns中使用了另一个变量,但未使用@column。尝试使用以下代码:

map { $_->as_trimmed_text } @column[1, 3, 5, 7, 9]