Perl - назначить переменные значениям ссылок - PullRequest
2 голосов
/ 26 марта 2012

Есть похожий вопрос Как я могу присвоить результат вызова подпрограммы ссылкам на массивы в Perl? , но мне интересно узнать о возможностях perl

Есть ли в Perl хак для прямого разыменования массива ссылок?

в коде типа

sub test { return([1..4],[5..8]); }
my (@a,@b);
my @result = test();
@a = @{$result[0]}; @b = @{$result[1]};

Я хотел бы сократить код до простого утверждения, например

sub test { return([1..4],[5..8]); }
my (\@a,\@b) = test();

или в цикле

foreach my $element (\"1",\"2",\"3") {
    my $dereferenced_element = $$element;

было бы неплохо написать что-то вроде

foreach my \$element (\"1",\"2",\"3") {

Я знаю, что этот синтаксис не имеет особого смысла, поскольку я не хочу присваивать значение ссылке на переменную, а назначаю разыменованное значение самой переменной
но мне любопытно, есть ли что-то в этом направлении в репертуаре Perl, и я думаю, что этот пример показывает лучшее, что я собираюсь сделать

Ответы [ 4 ]

3 голосов
/ 26 марта 2012

Вы можете изменить глобусы напрямую, если хотите, но это не очень хорошая практика.

sub test { return [1..3], [2..4]; }
(*x, *y) = test;
print "@x and @y";

Вывод:

1 2 3 and 2 3 4

Это не работает с лексическим (my) переменные.Чтобы заставить его работать с strict, вы можете объявить переменные с our (вместо my).

2 голосов
/ 26 марта 2012

Это не ответ на ваш вопрос относительно прямой разыменования, но

то, что вы делаете:

sub test { return([1..4],[5..8]); }
my (@a,@b);
my @result = test();
@a = $result[0]; @b = $result[1];

не совсем правильно, ваши массивы @a и @b становятся2d массивы после этого.

Вместо этого вы должны сказать:

@a = @{$result[0]};
@b = @{$result[1]};

или, как вы, скорее всего, уже знаете:

my ($a, $b) = test();

или:

for my $element (test()) {
     # $element is an array ref
}
1 голос
/ 26 марта 2012

@ Qtax ответ аккуратный. Мне было интересно, иначе это можно сделать. Не совсем то, что вы просили, но рядом.

sub test { return [1..3], [2..4]; }

my (%a);

@a{'ret1','ret2'} = test();

print @{$a{'ret1'}} ;
print @{$a{'ret2'}} ;
0 голосов
/ 26 марта 2012

Лучший способ, IMO, - присвоить ссылки на массивы скалярным переменным и разыменовывать их при необходимости.

my ($x, $y) = test();

my @arrayx = @$x;
my @arrayy = @$y;

print "Element 1 in \$x is: $x->[1]\n";
for my $element (@$x) { ... }

Вам также следует знать, что в качестве переменных следует использовать $a и $bэто плохая идея, потому что это предопределенные глобальные переменные, используемые подпрограммой sort.Они могут использоваться , как и большинство предопределенных переменных, но это может привести к странному поведению и трудностям поиска ошибок.

...