Как я могу использовать протоколы 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.