私の知る限り、2 つの変数が常に同じ値を共有することはできません。ここにあなたを助けることができるいくつかのアイデアがあります:
パッケージ変数:
{
package test1;
our $var;
sub step1 {$var = "Hello"}
}
{
package test2;
our $var;
sub step1 {$var .= " World!\n"}
}
test1::step1();
$test2::var = $test1::var;
test2::step1();
print $test2::var;
コメント: 醜い
参考文献:
{
package test1;
our $varref;
sub init {
my ($ref) = @_;
$varref = $ref;
}
sub step1 {$$varref = "Hello"}
}
{
package test2;
our $varref;
sub init {
my ($ref) = @_;
$varref = $ref;
}
sub step1 {$$varref .= " World!\n"}
}
my $var = "";
test1::init(\$var);
test2::init(\$var);
test1::step1();
test2::step1();
print $var;
コメント: より良いですが、より多くのコードが必要です。
追加の共有モジュール:
{
package test::shared;
our $var;
}
{
package test1;
sub step1 {$test::shared::var = "Hello"}
}
{
package test2;
sub step1 {$test::shared::var .= " World!\n"}
}
test1::step1();
test2::step2();
print $test::shared::var;
コメント: いくつかの利点があります。
明示的な状態
{
package test1;
sub step1 {
my $state = @_;
$state->{var} = "Hello";
return $state; # superfluous, but helps understanding
}
}
{
package test2;
sub step1 {
my $state = @_;
$state->{var} .= " World!\n";
return $state; # superfluous, but helps understanding
}
}
my $state = {};
$state = test1::step1($state); # equiv: test1::step1($state), because of references
$state = test2::step1($state);
print $state->{var};
コメント: これはほとんどオブジェクト指向プログラミングです。何をいつ共有するかが明示されているので、私はこのパターンを好みます。明示的な状態により、マルチスレッドと再入可能性の観点から、アプリケーションのスケーリングが容易になります。
コスト: 明示性。詳細な構文。
利点: 再入可能性、明示性による明確な一連の思考。