Как я могу использовать протоколы PDL в подпрограмме с передачей по ссылке?

В частности, я хочу использовать протоколы с параметром PERLCOLS.

Вот что я хочу сделать:

my @array;
getColumn(\@array, $file, 4); # get the fourth column from file

Я могу сделать это, если я использую \@array, но для обратной совместимости я бы предпочел не делать этого. Вот как я могу это сделать, используя array-ref-ref:

sub getColumn {

    my ($arefref, $file, $colNum) = @_;    

    my @read = rcols $file, { PERLCOLS => [$colNum] };
    $$arefref = $read[-1];

    return;
}

Но я не вижу, как сделать подпрограмму, которая принимает массив ref в качестве аргумента, не говоря что-то вроде @$aref = @{$read[-1]}, который, на самом деле, копирует каждый элемент в отдельности.

PS: читаем PDL::IO::Misc документация, кажется, что массив Perl должен быть $read[0] но это не так.

PERLCOLS - массив номеров столбцов, которые должны считываться в массивы perl, а не в piddles. Любые столбцы, не указанные в явном списке столбцов для чтения, будут возвращены после явных столбцов. (по умолчанию B).

Я использую PDL v2.4.4_05 с Perl v5.10.0, созданным для x86_64-linux-thread-multi

2 ответа

Я не понимаю, почему это не сработает

my $arr_ref;
getColumn( $arr_ref, $file, 4 );

sub getColumn {
  my ( $arr_ref, $file, $colNum ) = @_;

  my @read = rcols, $file, { PERLCOLS => [ $colNum ] };
  # At this point, @read is a list of PDLs and array references.

  $arr_ref = $read[-1];
}

Глядя на rcols() документация, похоже, если вы добавите PERLCOLS опция возвращает любой столбец, который вы запрашиваете в качестве ссылки на массив, поэтому вы можете просто назначить его для ссылки на массив, которую вы передали.

Что касается вопроса о документации, то я понимаю, что вы не указали никаких явных столбцов, поэтому rcols() сначала вернет все столбцы в файле как PDL, а затем возвратит запрошенные столбцы как Perl arrayrefs, поэтому ваш arrayref выходит в $read[-1],

Я считаю, что часть трудностей с использованием rcols здесь пользователь использует PDL-2.4.4, а rcols Версия документа была из PDL-2.4.7, которая может иметь перекос в функциональности. С текущей версией PDL-2.4.10 она проста в использовании rcols читать в одном столбце данных как массив perl, который возвращается через arrayref:

pdl> # cat data
1 2 3 4
1 2 3 4
1 2 3 4

pdl> $col = rcols 'data', 2, { perlcols=>[2] }
ARRAY(0x2916e60)

pdl> @{$col}
3 3 3

Обратите внимание, что в текущем выпуске perlcols Параметр позволяет указать тип вывода столбца, а не просто добавить столбец в стиле perl в конце.

использование pdldoc rcols или сделать help rcols в оболочке PDL, чтобы увидеть больше документации. Хороший ресурс - это список рассылки perldl.

Другие вопросы по тегам