2

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

my ($var1, var2) = ($columns[1]->as_trimmed_text, $columns[2]->as_trimmed_text);

..除了还有几列,所以它继续多几行。我有一个好主意,我可以使用 map 代替,但我真的没有太多运气。我已经尝试过

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

但我一直在没有包或对象引用的情况下无法调用方法“as_trimmed_text”。

是否可以做我正在尝试的事情,或者我应该坚持我目前拥有的?

TIA

编辑:列 - >列

4

4 回答 4

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()

哪个呕吐物。我会再次检查您的数组切片,并确保您没有在可用的实际索引之外获取值,除此之外,请验证您实际上是在使用 that 处理 HTML::Element 成员map。快速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

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

于 2009-11-05T22:43:02.427 回答
5

你的map样子对我来说很合适。你确定第二个应该说@columns而不是@column?您是否已strict打开以捕获变量名中的拼写错误?

于 2009-11-05T22:25:42.133 回答
1

首先,如果您对 map 的输出不感兴趣,则不应使用 map。Map 和 grep、sort 等一样是一个过滤器。如果您不想要输出,请使用 foreach。

但你是对的,map 正是为了解决这类问题而设计的。这将提供您想要的输出,尽管它不使用数组切片。

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

罗伯特 P 的回答更好地解释了为什么原版不起作用。

于 2009-11-05T22:26:18.803 回答
1

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

map { $_->as_trimmed_text } @column[1, 3, 5, 7, 9]
于 2009-11-05T22:26:47.430 回答