我正在尝试从包含':'字符的数组中删除所有行。这是一个更大的系统的一部分,因此我不能更改很多界面,我也不是Perl的专家。
我从这里开始:
sub read_file {
my $file = shift;
my $aoh = csv(in => $file, headers => {'a' => 'aa'});
foreach my $row (@$aoh) {
# trim any spurious leading/trailing space (in-place edit)
do { s/^\s+//; s/\s+$// } for values %$row;
# convert start/end bit values to be zero-based
for my $foo ('c', 'd') {
if ($row->{$foo} =~ /^\d+$/) {
$row->{$bit} -= 100;
}
}
}
return $aoh;
}
我尝试过
sub read_file {
my $file = shift;
my $aoh = csv(in => $file, headers => {'a' => 'aa'});
my $aohf = grep { substr($_->{'a'}, 0, 1) eq ":" } @$aoh;
foreach my $row (@$aohf) {
# trim any spurious leading/trailing space (in-place edit)
do { s/^\s+//; s/\s+$// } for values %$row;
# convert start/end bit values to be zero-based
for my $foo ('c', 'd') {
if ($row->{$foo} =~ /^\d+$/) {
$row->{$bit} -= 100;
}
}
}
return $aohf;
}
尝试了几种不同的方法后,我不断收到类似于以下的错误:
Can't use string ("5") as an ARRAY ref while "strict refs" in use at
答案 0 :(得分:3)
在您的行中:
my $aohf = grep { substr($_->{'a'}, 0, 1) eq ":" } @$aoh;
您正在将grep
的结果分配给标量($aohf
)。
根据perldoc -f grep
:
In scalar context, [it] returns the number of times the
expression was true.
因此,您要为$aohf
分配一个数字(根据错误的外观可能为“ 5”)。并且在接下来的代码行中,您尝试使用@$aohf
取消引用“ 5”作为数组。那是行不通的。
您可能打算编写grep
行以分配给数组,如下所示:
my @aohf = grep { substr($_->{'a'}, 0, 1) eq ":" } @$aoh;
然后,您可以这样编写foreach循环的第一行,而无需取消引用任何内容:
foreach my $row (@aohf) {
因此,基本上,您可以分配给数组,然后使用数组。无需取消引用! (这比分配给标量,然后尝试将标量取消引用到数组中要简单。)
尝试我的更改,看看它们是否对您有用。
编辑:
原始代码返回了$aoh
,它是对数组的引用。如果您仍想在新代码中返回对数组的引用,则可以将return
语句更改为:
return \@aohf;
\
之前的@aohf
获得对@aohf
数组的引用,然后将其返回给调用代码。