• ベストアンサー

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

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

  • Perl
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • perl が 実行できない

    perl 初心者です。 apache を起動させ(起動画面は表示)、perl のファイルを IE で表示させようとして、print文を実行しても、print文がそのまま表示されるだけになっています。 perl のパスは、#! d:/perl/bin/perl です。 (コマンドラインから実行すると実行できるので、インストールは正常です。) (XP以前だったと思いますが、そのときは IEで、長文のプログラムが起動できていましたが。)

  • #!/usr/local/bin/perlで命令が出せません。

    プログラミングのド素人で、独学でwindows上でcygwinを使っている者から質問させていただきます。「#!/usr/local/bin/perl」というコマンドをプログラムの先頭に書いて、[ファイル名]を入力してcygwinで命令をしたところ、命令が実行できず、「commond not found」と出てしまいました。そこで、ネット上で、いろいろ調べて、試してみたのですが、どうしても、解決できません。 どなたか、アドバイスをいただけないでしょうか? ちなみに、perl [ファイル名]では、命令を実行することができます。「type -a perl」というコマンドを入力すると、「/cygdrive/c/Perl/bin/perl」というのがでてきたので、「#!/cygdrive/c/Perl/bin/perl」というコマンドを書いても上手くいきませんでした。 ちなみに、私が書いたプログラムは、以下のようなものです。 #!/cygdrive/c/Perl/bin/perl (あるいは#!/usr/local/bin/perl) # hello -- 挨拶のプログラム print ("hello");

    • ベストアンサー
    • Perl
  • VC6でコンパイルでスタックの領域を増やすには?

    初めて、VisualC++6.0で再帰を行うプログラムを書いているのですが、 スタックオーバースローなのか、突然プログラムが終了し、タスクバーにあった実行中のアプリが消えてなくなります。 原因がまだわからないのですが、スタックを増やす方法が知りたいのですが、どうすればよいのでしょうか? また、このように突然アプリが終了するので、どこが原因かわからないのですが、実行中に警告表示するような機能はありますか?

  • PerlでCGIの書き方

    今、HTML:Templateを用いてCGIのプログラムを書いています。 基本的にCGI上のボタンをおすとPOSTで情報をわたして、次のCGIにいき、そこからTMPLを読み出して、画面を表示してるのですが、画面場のボタンをおしてもCGIを更新せずに、Perlの実行だけすることは可能ですか?あるいは、POSTでCGIに届いた情報をIF文で中身を確認して、表示するTMPLをかえて、Perlの実行も行うのが普通のやりかたなのでしょうか? あまりよくわからずにネットだけの情報をたよりにプログラミングをしているので設計の仕方など分からないことが多々あります。 どなたかCGIに詳しい方ご返答おねがいします。

    • ベストアンサー
    • CGI
  • プログラム実行時の、一時停止の命令文

    初心者ですが、Visual C++6.0での、 プログラム実行時の、一時停止の命令文が、存在しますか? 返答、お願いします。

  • 実行時エラーについて

    お世話になっています。教えて下さい。 VBで作ったプログラムです。 デバッグ時には何の問題もなく、実行可能(完全コンパイル後に実行)で、コンパイルも問題なく通りますが、EXEにして実行すると、以下のエラーが出ます。 実行時エラー:'91' object変数、またはwithブロック変数が設定されていません。 どなたか、原因に心当たりがある方、いらっしゃったら教えて下さい。 よろしくお願いします。

  • CGI(perl)って・・・

    どんな感じで使ってます? あれはプログラム言語として使ってます? あの分かりにくい記号を覚えて使うものなんですか? 今まで(と言うか今も)COBOLとJAVAを 使ってきたんですが、なんかパズルのように組み合わせる パールのCGIになじめないっす・・・ どんな感じで使ってるか教えてください! やっぱ(命令文みたいなの、笑)覚えて作ってます? それとサンプルを埋め込んで使うんですか? だれでも良いんで参考までに 教えてぇぇぇぇ!同業者でCGI詳しい人もヨロシク☆

    • ベストアンサー
    • CGI
  • マクロを一段階ごとに実行

    よろしくお願いします。 試行錯誤しながらマクロを組んでいるものです。 なんとか無事に完成したマクロがあるのですが その内容を見てもどの命令が何を実行しているのか 後から自分でわからなくて難儀しています。 (’から始まる説明を記入しておきたくて) プログラムの一行(一文?一命令?)ごとに 実行してエクセル画面での変化を確認する方法は 無いものでしょうか? F8はエラーチェックには使えますが 今回の私の意図するものではないもので・・・ 御存知の方いらっしゃいましたら よろしく御回答ねがいます。

  • 複数バイト命令実行のタイミング

    1バイト単位でメモリの各アドレスにデータが保存されているコンピューターにおいて、複数のバイトで表される命令がどのように実行されるのか教えて下さい。 メモリには一つのアドレスごとに8ビット(1バイト)のデータが入っており、CPUはプログラムカウンタで示されたメモリ上のアドレスにあるデータや命令を一つずつ順番に読み込んで、それをデコーダーが解釈し各回路への指令に変換することでプログラムを実行していくということは理解しています。 しかし現在の32ビットコンピューターなどにおいてアセンブリの命令、例えば「MOV A,B」(Bレジスタの内容をAレジスタにコピーする)といった命令は、「B90001」などの3バイトのマシン語で表されるとすると、メモリ上では アドレス  内容 0000  0xB9 0001  0x00 0002  0x01 のように3つの連続するアドレスにまたがってデータが存在し、CPUが「MOV A,B」を読み込み、それを順次デコーダーに送るまでには「MOV」、「A」、「B」の3クロックを要すると思います。 その際、デコーダーが命令を解釈し各回路に指令の信号を送るタイミングというのは、最後の「B」のデータを読み込んだ時点になるのでしょうか?もしそうならば、3クロック目に最後の「B」のデータがデコーダーに到着するまでの間、「MOV」と「A」のデータというのはCPUにメモリから読み込まれた後はどのように扱われるのでしょうか? 少し質問が分かりにくく恐縮ですが、情報工学を独学で勉強しており、プログラムが実際の回路でどのように実行されるのか理解したいと思っています。 どうぞご回答よろしくお願い致します。

  • デバッグ実行の繰り返しでメモリ不足

    windowsXP、VB6を使ってアプリケーションを作成しているのですが、 このアプリケーションで「デバッグ実行→終了」を繰り返すと、 2回目以降の実行途中でメモリ不足エラーが表示されます。 VB6を終了し、再度起動するとまたデバッグ実行が可能になり、 上記同様に「デバッグ実行→終了」の繰り返しでまたメモリ不足になります。 http://chaichan.web.infoseek.co.jp/vbtips/VBMemo2006111601.htm を参考にすると、 動的配列や多次元配列、パブリック変数の多用が原因かと思ったのですが、 VB6起動直後は実行できるのでよくわかりません。 アドバイスをいただけないでしょうか。 よろしくお願いいたします。

専門家に質問してみよう