从哈希的csv数组中删除行

时间:2019-05-06 22:38:50

标签: perl

我正在尝试从包含':'字符的数组中删除所有行。这是一个更大的系统的一部分,因此我不能更改很多界面,我也不是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

1 个答案:

答案 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数组的引用,然后将其返回给调用代码。