Удалить строки из массива хэшей CSV - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь удалить все строки из массива, который содержит символ ':'.Это часть более крупной системы, поэтому я не могу изменить большую часть интерфейса и не являюсь экспертом в 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 Ответ

3 голосов
/ 07 мая 2019

В вашей строке:

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.

Следовательно, вы присваиваете номер (вероятно, «5», судя по вашей ошибке) для $aohf.И в следующей строке кода вы пытаетесь разыменовать эту «5» как массив с @$aohf.Это не сработает.

Возможно, вы намеревались написать строку grep для присвоения массиву, например так:

my @aohf = grep { substr($_->{'a'}, 0, 1) eq ":" } @$aoh;

Затем вы можете написать первую строку вашегоЦикл foreach, подобный следующему, без необходимости что-либо отменять:Не требуется разыменование!(Это проще, чем присвоить скаляр и затем попытаться отменить ссылку на скаляр в массив.)

Попробуйте мои изменения и посмотрите, работают ли они для вас.


РЕДАКТИРОВАТЬ:

Исходный код вернул $aoh, который является ссылкой на массив.Если вы все еще хотите вернуть ссылку на массив в новом коде, вы можете изменить оператор return на:

return \@aohf;

\ до того, как @aohf получит ссылку на *Массив 1039 *, который затем возвращается к вызывающему коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...