我可以使用Perl的地图数组切片?
题
我只是想缩短线路的指派HTML ::元素 - > as_trimmed_text从HTML ::元素的数组到一些变量的代码 - 非常标准的东西,如:
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
编辑:柱 - >列
解决方案
首先,如果你不感兴趣的地图的输出,你不应该使用的地图。地图,如grep,排序等是一个过滤器。如果你不想输出,使用的foreach。
但你是正确的,图的目的是要解决究竟这类问题。这会给你想要的输出,但它不使用数组片段。
@trimmed_columns = map { $column[$_]->as_trimmed_text } (1, 3, 5, 7, 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有效的值的范围之外,因此它autovivifies一个新条目,并使其undef
。然后,地图确实
undef->as_trimmed_output()
其中barfs。我会再次检查您的阵列片,并确保你没有可用的实际指标外敛值,和禁止的是,确认你实际上是处理HTML ::元件要素与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
所以,仔细检查,以确保您的数组的内容实际上是你想调用的方法的类的所有祝福的实例。
您map
看起来我的权利。你确定第二个应该说@columns
代替@column
?你有strict
开启赶上错别字在变量名?
您正在使用在第二实施例@columns
另一个变量,但不是@column
。尝试使用以下代码:
map { $_->as_trimmed_text } @column[1, 3, 5, 7, 9]