Как я могу использовать протоколы PDL в подпрограмме с передачей по ссылке? - PullRequest
4 голосов
/ 06 октября 2010

В частности, я хочу использовать протоколы с параметром 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 ]

1 голос
/ 21 апреля 2012

Я полагаю, что часть трудностей с использованием rcols заключается в том, что пользователь использует PDL-2.4.4, в то время как версия rcols docs была из 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 .

1 голос
/ 06 октября 2010

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

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].

...