6

スライス参照の要素を変更すると、元の配列が変更されるように、配列スライスへの参照をどのように取得しますか?

次のコードは@_エイリアシング マジックにより機能しますが、私にはちょっとしたハックのように思えます。

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 の間に必要な関係を説明するためのものであり、この機能が製品コードで使用される方法を反映するものではありません。

4

2 に答える 2

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
于 2009-11-30T01:51:56.160 に答える
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
于 2009-11-30T02:52:45.693 に答える