電子書籍の厳選無料作品が豊富!

お世話になります。
早速ですが、簡単なことなのかもしれませんが、
どうにも分からないので教えてください。

作業域が消えてしまうように見えるのです。

&rtna;
&rtnb;


sub rtna {
 ------
}


sub rtnb {
 ------
}


上記のようなロジックがありまして、
rtnaで作成した作業域 $wk1を rtnbで参照すると無くなっているのです。
(具体的に20081231の様な日付です)

$wk1は明示的に確保などしておらず、直接rtnaで作成しています。
このような考えは駄目なのでしょうか。
(rtnbでは参照できないのでしょうか)

調べた方法
rtnaの中でprintしてみたところ、ちゃんと20081231と表示されます。
rtnbでprintすると何も表示されません。

どのようにトレースしたら宜しいでしょうか。
ご指摘を宜しくお願いいたします。

A 回答 (2件)

> $wk1は明示的に確保などしておらず、直接rtnaで作成しています。



この 1行の意味が致命的に重大です。

可能性1 ============================================
rtna 内で
my $wk1
とか
local $wk1
とか書いていれば、 rtnbからは見えません。

可能性2 ============================================
そうで無ければ、 両 rtn は、同じソースの同じ package 内ですか?

可能性3 ============================================
rtnb から$wk1が見えるはず状況であっても、rtnb内で my や local で $wk1 を定義すれば、やはり見えなくなります。

可能性4 ============================================
$wk1 がリファレンスの場合や $wk1 を参照するリファレンスがあると、あなた自身が意図せずに内容を書き換えるケースもあります。


上記いずれもハズれの場合や理解できない場合は、同じ問題が発生するできるだけ短い完全なコードを手間をかけて作って貼り付けてください。
# 完全とは、それだけで実行できる『Perlのソースとして完結したもの』です。
# できるだけ短いとは、せいぜい2~30行で。
    • good
    • 0
この回答へのお礼

細かく有り難うございました。
まさに可能性1のlocalを使っていました。
$wk8 = $wk1と移してやったら問題なく参照できました。
これまでにもlocalを使っていましたが、
今回のような経験は初めてです。
これまではlocalで作った作業域を外のsubで使うということが無かった
ということだったのですね。
お世話になりました。

お礼日時:2009/01/08 23:03

悪いけど, 「これでわかってくれ」という方が無理. $wk1 がどこでどのように参照されているかわからないので, 答えようがありません. 少なくとも $wk1 が出てくる行はすべて出すくらいのつもりで書いてください.


特に「$wk1は明示的に確保などしておらず、直接rtnaで作成しています。」と書いてあってもどのように「作成している」のかはあなた以外のだれにも理解できません. 「どのように作成しているのか」は確実に書いてください.
もちろんいくつか推測はできて, 例えば
・実は rtnb→rtna の順に実行されていた
・rtna と rtnb でパッケージが違う
・rtna で my を使って $wk1 を使っていた
とか考えられるけど, こうやって他人に推測させるような質問は大体良くないと思ってください.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!