Spa*_*les 2 arrays perl map subscript
我只是想缩短一行代码,将HTML :: Element-> as_trimmed_text从HTML :: Elements数组分配给一些变量 - 非常标准的东西,如:
my ($var1, var2) = ($columns[1]->as_trimmed_text, $columns[2]->as_trimmed_text);
Run Code Online (Sandbox Code Playgroud)
..除了有更多的列,所以它继续超过几行.我有一个明智的想法,我可以使用地图而不是我真的没有多少运气.我尝试过变种
map { $_->as_trimmed_text } @columns[1, 3, 5, 7, 9]
Run Code Online (Sandbox Code Playgroud)
但我一直在没有包或对象引用的情况下调用方法"as_trimmed_text".
有可能做我正在尝试的事情,还是应该坚持我现在拥有的东西?
TIA
编辑:列 - >列
找到了:
这里有一些模拟应该发生的事情的代码:
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);
Run Code Online (Sandbox Code Playgroud)
这工作,并且工作正常; 我明白了:
Trimmed were: 'bar','baz'
Run Code Online (Sandbox Code Playgroud)
但是,如果我用这一行替换地图:
my @trimmed = map { $_->as_trimmed_text() } @texts[2, 3];
Run Code Online (Sandbox Code Playgroud)
我突然得到了这个输出:
Can't call method "as_trimmed_text" on an undefined value
Run Code Online (Sandbox Code Playgroud)
这是因为'3'超出了@texts中有效值的范围,因此它会自动生成一个新条目并生成它undef.然后,你的地图呢
undef->as_trimmed_output()
Run Code Online (Sandbox Code Playgroud)
哪个barfs.我再次检查你的数组切片,并确保你没有抓住可用的实际索引之外的值,并且禁止这样做,验证你实际上正在处理HTML :: Element成员map.快速Data::Dumper::Dumper了解价值观@columns将极大地帮助我们.
例如,如果您随后将数组更改为包含
my @texts = ( Text->new(' foo '), Text->new(' bar '), ' baz ');
Run Code Online (Sandbox Code Playgroud)
并尝试运行它,我现在得到你的错误:
Can't call method "as_trimmed_text" without a package or object reference at map.pl
Run Code Online (Sandbox Code Playgroud)
因此,请仔细检查以确保数组的内容实际上是您尝试调用方法的类的所有祝福实例.
你map看起来对我来说.你确定第二个应该说@columns而不是@column吗?你有没有strict打开变量名称的拼写错误?
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |