发现:
下面是一些代码,它模拟什么应该发生:
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成员。有关@columns
中值的快速Data::Dumper::Dumper
将非常有帮助。
例如,如果你再改变你的数组包含
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
所以,仔细检查,以确保内容你的数组实际上是你试图调用方法的类的所有祝福实例。
目前看起来您正在使用不同的变量:第一个示例为“@ column”,第二个为“@ columns”。但是使用“地图”的想法很好 – 2009-11-05 22:25:27
这是行不通的吗? 'map {$ columns [$ _] - > as_trimmed_text} 1,3,5,7,9' – 2009-11-05 22:31:43
你可能需要在你正在做的事情中添加更多的代码;这对我来说是正确的。 – 2009-11-05 22:31:56