Как мне взять ссылку на фрагмент массива в Perl? - PullRequest
6 голосов
/ 30 ноября 2009

Как бы вы взяли ссылку на фрагмент массива так, чтобы при изменении элементов ссылки на фрагмент изменялся исходный массив?

Следующий код работает из-за @_ магии псевдонимов, но для меня это немного хакер:

my @a = 1 .. 10;
my $b = sub{\@_}->(@a[2..7]);
@$b[0, -1] = qw/ < > /;
print "@a\n";
# 1 2 < 4 5 6 7 > 9 10

Кто-нибудь есть лучше / быстрее?

Редактировать: приведенный выше пример кода просто иллюстрирует отношения, требуемые между @a и $ b, он никоим образом не отражает способ использования этой функциональности в рабочем коде.

Ответы [ 2 ]

4 голосов
/ 30 ноября 2009

Данные :: Alias ​​, кажется, может делать то, что вы хотите:

#!/usr/bin/perl

use strict; use warnings;

use Data::Alias;

my @x = 1 .. 10;

print "@x\n";

my $y = alias [ @x[2 ..7] ];
@$y[0, -1] = qw/ < > /;

print "@x\n";

Выход:

1 2 3 4 5 6 7 8 9 10
1 2 < 4 5 6 7 > 9 10
3 голосов
/ 30 ноября 2009

Вот как ты это делаешь, да. Подумайте об этом немного, и это не такой взлом; он просто использует функцию Perl для сборки произвольных l-значений в массив и затем получает ссылку на него.

Вы даже можете использовать его, чтобы отложить создание хеш-значений:

$ perl -wle'my %foo; my $foo = sub{\@_}->($foo{bar}, $foo{baz}); print "before: ", keys %foo; $foo->[1] = "quux"; print "after: ", keys %foo'
before: 
after: baz
...