グローバル変数名の衝突を起こさずに、またはマザー呼び出し元サブルーチンの外部で変数を宣言したり、サブルーチンパラメーターを使用したりせずに、あるサブルーチンで宣言された変数をその内部で呼び出される別のサブルーチンと共有するにはどうすればよいですか?
言い換える と、サブルーチンで定義された変数を、呼び出されたサブルーチンから呼び出すにはどうすればよいですか?
詳細説明:( 前の1行の質問が十分に説明的でなかった場合)
私の質問を理解するために最後まで読む必要はないことに注意してください。あなたがあなたの時間を節約するために私が求めているものを持っているなら、読むのをやめてください。
私が持っているsubroutine1
とsubroutine2
しましょう:
subroutine1 ();
sub subroutine1 {
my $word1='hello';
subroutine2();
}
sub subroutine2 {
print $word1; #Prints nothing as subroutine2 is unable to access $word1 declared in subroutine1
}
私の質問は、具体的には$word1
、あるサブルーチン(subroutine1
)で宣言された変数(subroutine2
)を、その内部でsubroutine2
呼び出される(内部で呼び出される)別のサブルーチン()にどのように共有できるかについて尋ねsubroutine1
ます。
subroutine1
)たとえば、次の3つの簡単なよく知られた方法のいずれかを使用して簡単に達成できます。
方法1:$word1
グローバルとして宣言します。
subroutine1 ();
sub subroutine1 {
$word1='hello'; #$word1 is declared as global
subroutine2();
}
sub subroutine2 {
print $word1;
}
方法2:$word1
マザー呼び出し元サブルーチンの外部で宣言し、subroutine1
その範囲を制限します。
{
my $word1='hello';
subroutine1 ();
sub subroutine1 {
subroutine2();
}
sub subroutine2 {
print $word1;
}
}
方法3:$word1
パラメータとしてに渡しますsubroutine2
。
subroutine1 ();
sub subroutine1 {
my $word1='hello';
subroutine2($word1);
}
sub subroutine2 {
my $x = shift;
print $x;
}
この例は非常に簡単で、上記の3つを含む簡単な方法で解決できます。しかし、このように単純に構築し、それらの制限を念頭に置いて(グローバル変数名の衝突、サブルーチン外の宣言、パラメーターの使用なし)、今のところ単純化できなかった私の本当の複雑な問題を確実に解決します。
2つのサブルーチンがネストされていない場合、定義上、要求は不可能です。ネストされていない2つの潜水艦から見える場合は、潜水艦の外に存在している必要があります。そのため、グローバルである必要があります。そうでない場合、サブの外部での宣言は、両方のサブを含む字句スコープにその可視性を制限する必要があります。
そのため、ネストされたサブが残ります。
sub tree_visitor {
my @rv;
local *_helper = sub {
my ($node) = @_;
push @rv, $node->text;
for my $child ($node->children) {
_helper($child);
}
};
_helper($node);
return @rv;
}
必要なものに近いものは、「動的スコープ変数」と呼ばれます。グローバル変数を使用しますが、変数の値は、呼び出し元のサブが終了した後に復元されます。
sub subroutine2 {
our $x;
print $x;
}
sub subroutine1 {
local our $x = 'hello';
subroutine2();
}
subroutine1();
あなたが実際に直面している問題を私たちが知っていれば、あなたを助けるのはもっと簡単でしょう。ただし、グローバル変数またはクロージャが含まれます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加