これはlocal
は可能性のあるまれなケースの一つでありますあなたに便利です:
my $hash => {
a => 123,
b => 234,
c => {
option1 => 123,
option2 => 235,
},
};
sub sub1 {
# We only need hash values a and b
delete local $hash->{c};
print "sub1: $_\n" for sort keys %$hash;
}
sub sub2 {
# sub2 needs all a, b and c.
print "sub2: $_\n" for sort keys %$hash;
}
sub1();
sub2();
の出力は、それを削除してスコープを抜けるときに取り消しとなるように、
sub1: a
sub1: b
sub2: a
sub2: b
sub2: c
キーワードは「ローカル」キーを局在化することになります。これがどのように動作するかに関するPerlのドキュメントの最も良い説明はperlsub: Localized deletion of elements of composite typesです。この変更を行っても
my $hash = {
a => 'foo',
b => 'bar',
c => {baz => 'bang'},
};
sub sub1 {
my $href = shift;
delete local $href->{c};
print "sub1: $_\n" for sort keys %$href;
}
sub sub2 {
my $href = shift;
print "sub2: $_\n" for sort keys %$href;
}
sub1($hash);
sub2($hash);
、
$href
でローカライズされていない要素の変更が反映されます:
にするもう一つのポイントは、それが周囲の範囲からそれらを吸収するのではなく、サブルーチンに引数を渡すために、通常は有益だということです参照渡しのため$hash
に戻ります。しかし、それは可読性を向上させ、周囲のスコープの名前からサブルーチンを切り離すので、やり直すのは良い習慣です。
時には便利なもう1つの手法は、渡された構造の深いクローンを作成することです。サブルーチンに渡された参照先に変更が反映されずにクローンを自由に変更できることです。しかし、エレメントにプレーンな古い値またはネストされた値ではなくオブジェクトが含まれている場合、これは高価(または不可能)になる可能性があります。
use Storable qw(dclone);
my $hash = {
a => 123,
b => 234,
c => {option1 => 123, option2 => 235},
};
sub sub1 {
my $href = shift;
my $clone = dclone($href);
delete $clone->{c};
print "sub1: $_\n" for sort keys %$clone;
}
sub sub2 {
my $href = shift;
print "sub2: $_\n" for sort keys %$href;
}
sub1($hash);
sub2($hash);
dclone
は、データ構造のクローンを作成するための唯一の方法ではありません。それにもかかわらず、完全を期すために、私はこのように使用される可能性がありますStorable'sdclone
機能を、言及します。特定のケースに適した独自のソリューションを作成することができます。特に、事前に構造の形状と構成を知っている場合は、しかし、一般的な解決策として、それはかなり便利です。
しかし、最終的にdclone
は、ただちに鍵を隠すのではなく、まったく新しいデータ構造を作成することになります。これはdelete local $href->{c}
の機能です。 local
を使用して構造体のコピーを作成する必要性を避けることができ、あるいは誤差や余分な思考の潜在的な原因を排除して、手作業で値を保存する必要がある場合(つまり、my $temp = delete $href->{c}; ... $href->{c} = $temp;
)仕事のための正しいツールであると判明した時代。
各サブで達成しようとしていることの大まかな例を提示できれば、適切な解決策が提示される可能性があります。 –