如何在Perl中引用数组切片?

时间:2009-11-30 00:54:56

标签: perl arrays syntax reference slice

如何引用数组切片,以便在修改切片引用的元素时修改原始数组?

下面的代码因@_别名魔法而起作用,但对我来说似乎有点像黑客攻击:

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 个答案:

答案 0 :(得分:4)

Data::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

答案 1 :(得分:3)

你就是这样做的,是的。考虑一下,这不是一个黑客;它只是简单地使用Perl的功能将任意左值组合成一个数组,然后引用它。

您甚至可以使用它来推迟创建哈希值:

$ 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