• ベストアンサー

perlの命令実行順がおかしいんです

お世話になっております。 調べ方が甘いのか、調べ切れなかったのでお願いいたします。 Perl5.8.7でプログラムしているのですが、明らかに命令実行順が おかしくなります。(デバッグ文で確認) 再帰したりしているので、スタックの上書きが起きているのかとも 思いましたが、確認する方法を知りません。 またPerlではガベージコレクタで、ほとんどスタックの上書きなど ないというサイトも見ました。 どんな原因が考えられるのでしょうか? 情報不足の場合は何が不足しているのか仰ってください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

$nCnt がmy で宣言されていないので、再帰呼び出しで壊れているとか

papope
質問者

補足

ご回答かりがとうございます。 ご指摘の件、修正してみました。 同時にソースを再度、見直してみました。 myで宣言していない部分が他にもあり、その為だったようです。 助かりました。 ありがとうございます。

その他の回答 (3)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

補足スクリプトの最後の方 > DB登録 } この行は、コメントアウトされてるのだと思いますけど、そうすると{}の対応が狂ってしまいます。

papope
質問者

お礼

補足に入力してしまいましたが、助かりました。 ありがとうございます。

papope
質問者

補足

回答ありがとうございます。 先にも述べましたが、私の転記の仕方が悪かったのが原因と思われ ます。申し訳ありません。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1補> ぱっと見た感じ sub PrnCont($;$) { に対応する 「 } 」が足りないように思いますが・

papope
質問者

補足

ご回答ありがとうございます。 PrnContの『}』の数なんですが、私のソースの転記の仕方が悪かった のですが、対応はあっています。 これはエディタの機能で『{}』の対応のチェックもしていますし、 -WCオプションでもチェックしています。 DB登録の行を転記すると長くなるので、このように書かせていただきました。 分かりづらくなってしまい申し訳ございません。

noname#20377
noname#20377
回答No.1

僕はPerlを書ける人間ではないので的確な回答は出せないと思いますが、 >情報不足の場合は何が不足しているのか仰ってください。 「問題が発生している近辺のソース」を掲示していただければ他の回答者からの回答もより的確になるのではないかと思います。

papope
質問者

補足

ご回答ありがとうございます。 結構、長いソースになるので、部分的に載せさせていただきます。 sub PrnCont($;$) { my($oEnt, $iLvl) = @_; $iLvl = 0 unless($iLvl); unless ($oEnt->is_multipart) { #(1)シングルパート $mmsg = &CodeExc($oEnt->bodyhandle>as_string);          DB登録しています。 } else { #(2)マルチパート $nCnt = $oEnt->parts; #Count of Parts for (my $i=0; $i<$nCnt; $i++) { if($oEnt->parts($i)->is_multipart) { #マルチパートのネスト PrnCont($oEnt->parts($i),$iLvl+1); } else { #普通のマルチパート if($oEnt->parts($i)->mime_type eq "text/plain") { if ($i == 0) { Unicode::Japanese->new(($oEnt->parts($i)->bodyhandle->as_string),"auto")->utf8; $mmsg = &CodeExc($oEnt->parts($i)->bodyhandle->as_string); DB登録 } else { $sPath = $oEnt->parts($i)->bodyhandle->path;                             DB登録 } } elsif($oEnt->parts($i)->mime_type eq "text/html") { #$mmsg = Unicode::Japanese->new(($oEnt->parts($i)->bodyhandle->as_string),"auto")->utf8; $mmsg = &CodeExc($oEnt->parts($i)->bodyhandle->as_string);                        DB登録  rm("-f","$TmpDir/msg-$$-*.html"); } else { $sPath = $oEnt->parts($i)->bodyhandle->path; DB登録 } } $x++; } } } 11行目のForループで途中からこれを読んでいるMainのプログラムが動いてしまいます。 これでわかっていただけますでしょうか?

関連するQ&A

専門家に質問してみよう