次の最小限の作業例に注意してください。
use warnings;
use strict;
use IPC::Shareable;
use Data::Printer;
IPC::Shareable->clean_up;
my $sharevar1 = "a";
my $sharevar2;
print "A: $sharevar1 $sharevar2\n";
p($sharevar1);
p($sharevar2);
my $glue1 = 'glu1';
my $glue2 = 'glu2';
my %options = (
create => 1, #'yes',
exclusive => 0,
mode => 0644, #0644,
destroy => 1, # 'yes',
);
my $sharevar_handle1 = tie $sharevar1, 'IPC::Shareable', $glue1 , \%options ; #
print "B1: $sharevar1 $sharevar2 - $sharevar_handle1\n";
my $sharevar_handle2 = tie $sharevar2, 'IPC::Shareable', $glue2 , \%options ; #
print "B2: $sharevar1 $sharevar2 - $sharevar_handle2\n";
p($sharevar1);
p($sharevar2);
$sharevar1 = "b";
#~ $sharevar1 = "AOE" . \$sharevar2;
$sharevar2 = 20;
print "C: ";
print "- $sharevar1 $sharevar2\n";
p($sharevar1);
p($sharevar2);
これを実行すると、次のような出力が得られます。これは予想どおりです。
Use of uninitialized value $sharevar2 in concatenation (.) or string at tt.pl line 13.
A: a
"a"
undef
Use of uninitialized value $sharevar1 in concatenation (.) or string at tt.pl line 30.
Use of uninitialized value $sharevar2 in concatenation (.) or string at tt.pl line 30.
B1: - IPC::Shareable=HASH(0xa1dc1b8)
Use of uninitialized value $sharevar1 in concatenation (.) or string at tt.pl line 34.
Use of uninitialized value $sharevar2 in concatenation (.) or string at tt.pl line 34.
B2: - IPC::Shareable=HASH(0xa215b10)
undef (tied to IPC::Shareable)
undef (tied to IPC::Shareable)
C: - b 20
"b" (tied to IPC::Shareable)
20 (tied to IPC::Shareable)
ただし、「$sharevar1 = "AOE" . \$sharevar2;
」行のコメントを解除しようとすると、その上の「」がコメントアウトされ$sharevar1 = "b";
ます。その後、最後を除いて、得られる出力はほとんど同じです。
...
B2: - IPC::Shareable=HASH(0x852fb20)
undef (tied to IPC::Shareable)
undef (tied to IPC::Shareable)
Can't use string ("AOESCALAR(0x836bf88)") as a SCALAR ref while "strict refs" in use at /usr/local/share/perl/5.10.1/IPC/Shareable.pm line 741.
C: $
さて、問題は、この「文字列を使用できません...」が実際にクラッシュを引き起こすことです...どうやらtie
d 変数に を介して参照が割り当てられた場合、 string の\
ような値を取得し、明らかにによって解釈されますその後、アドレスを意味する Perl... ?!SCALAR(0x836bf88)
そして、その場合、Perl は文字列の開始部分 ( SCALAR(...
) に一致すると考えたので、文字列 "AOE" を先頭に追加してごまかそうとしましたが、奇妙なことに、Perl はまだ気づいていました (あたかも正規表現を探しているかのように) 「0xwithing括弧」の場合、ちょっと一致します):「文字列(「AOESCALAR(0x836bf88)」)をSCALAR refとして使用できません」...
私の質問は - Perl と IPC::Shareable がアドレス (それ以外の場合は「文字列」として保存される) を正しく解釈する方法についての私の推論です (いいえ、以下の編集を参照してください; はい、投稿を参照してください); そうであるかどうかに関係なく、IPC::Shareable にアドレスを格納するにはどうすればよいでしょうか?
ご回答ありがとうございます。
乾杯!
編集: どうやら、通常、文字列アドレスを含む文字列変数を印刷することですべて問題なく動作します。したがって、この問題は IPC::Shareable 固有のものであると思います:
DB<1> $ttt = "aa"
DB<2> p $ttt
aa
DB<3> $eee = \$ttt
DB<4> p $eee
SCALAR(0xa382668)
DB<5> $eee = "erw".\$ttt
DB<6> p $eee
erwSCALAR(0xa382668)
DB<7> q