• ベストアンサー

myで()をつける場合とつけない場合

最近すっかりお世話になりっぱなしですがまた質問がでてきてしまいました。 どうぞよろしくお願いいたします。 エラーメッセージを出力するサブルーチンの中で my $errmsg = @_; となっている箇所を my($errmsg) = @_; に直したところ、 "1"とだけ表示されていたバグが直ったのですが理由がわかりません--; 他人が書いたプログラム中に、()ありや()なしが混在しているのですが、 どちらが正しいのでしょうか? それともどちらも正しい(使い分けがある)のでしょうか。 よろしくお願いいたします。

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

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 正体は @_ の渡し方にあります。  Perl では、   $普通の変数 = @配列変数  という数式を書くと、$普通の変数には「@配列変数の配列数」が代入されるというルールがあります。  なので、質問文にある前者の代入では、@_ のそのときの配列数である「1」が代入されたのです。  ところが、( ) で囲んだ普通の変数は、「仮に配列として扱う」というルールがあるため、   ($普通の変数) = @配列変数  と書くと、($普通の変数) が、さも配列であるかのように扱われるんです。   @配列変数 = @配列変数  という式の場合、右の配列に入っているすべての値が、正確に左の配列へコピーされるので、質問文中の後者の式では、$errmsg という変数が、さも配列変数であるかのように解釈され、値が正しく代入されたんです。  ちなみに、my は変数の有効範囲を指定する宣言子なので、この問題に関しては関係ありません。

mari2002
質問者

お礼

さっそくのご回答ありがとうございます。 そういうことだったのですね~。なぞが解けてすっきりしました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • サブルーティンの使い方。

    サブルーティンの理解を深めるために、 階乗の計算をサブルーティンで行うプログラムを作りました。 自作のプログラムについて質問を二つしたいと思います。 1.一応、計算は出来るのですが、 定型的でないというか、無駄が多いというか、 何か違う気がするのです。 どこか変なところはありませんでしょうか? 2.エラーメッセージをどこにいれたらいいのかわかりません。 数字以外、(例えば文字)が入力されれば1が出力されるようにはしたのですが、 「これは数字ではありません」のようなエラーメッセージを出したいのです。 この場合はどこにどのように記述すればいいですか? 色々試してみたのですが、思い通りに動きませんでした。 みなさま、知恵をお貸しください。 ------------------------------------------- use strict; print "数字を入力してください。\n"; chomp( my $number = <STDIN> ); my $k_number = kaijo($number); print "入力された数字の階乗は$k_numberです。\n"; sub kaijo { my $number = shift @_; return undef if $number < 0; return 1 if $number == 0; my $kaijo = 1; for(my $i = $number; $i>1; $i--) { $kaijo *= $i; } return $kaijo; }

  • AtEndOfStream について

    お世話になっております。 他人が作成したWSHのプログラムを解析して おりまして、どうしても意味が分からない箇所が ございます。  (オブジェクトA).StdErr.AtEndOfStream 文献等から、「オブジェクトAのエラー出力が ストリームの最後であるかどうかを判定し、 True/Falseを返す」ということまでは分かった のですが、『エラー出力がストリームの最後』と いう状態はどういうことなのでしょうか? 大変恐縮ですが、どなたかご教示いただければと 思います。 どうぞよろしくお願いいたします。

  • Fortranのサブルーチン引数について

    他人が作ったFortran(恐らくFortran77)のプログラムで計算をしようとしています。 コンパイルはできるのですが,実行するとエラーが出てしまい困っています。 エラーメッセージは 「forrtl:severe(157):Program Exception - access violation」 となっていて,実行時エラー番号で調べると 「プログラムが適切な参照権を持っていない仮想アドレスに書き込み,または読み取り を行おうとした」と出ていました。 Fortran初心者の自分にはイマイチ意味が判らないのですが,エラーが出た後に サブルーチンのある決まった場所に黄色い矢印が示されます。 そこで今,その部分のサブルーチンを確認しているところです。 前置きが長くなってしまいましたが サブルーチンの中を確認している途中で疑問に思った所が一つあります。 問題のサブルーチンは --------------------------------------- call dbesl(EN,0,BX0,BY0,BI0,BK0)     subroutine dbesl(X,NOR,BX,BY,BI,BK) FN = NOR  ・  ・  ・ 11 NOR = FN               <---この行に黄色い矢印が出る return end --------------------------------------- となっているのですが,サブルーチンを呼び出すcall文の所で 2つ目の引数が『0』となっているのは正しい使い方なのでしょうか? どうもサブルーチン内の計算をしてメインプログラムに引数を返す所が おかしいような気がしています。 因みにメインプログラムに戻る際の"FN"の値は『0』となっていました。 コンパイラはCompaq Visual Fortranを使用しています。 足りない情報は出来るだけ追記していきますので,ご教示宜しくお願いします。

  • My Image Garden

    My Image Garden Ver.3.6.4 で canon ts3130s からスキャンしたいのですがUSBが接続されていない等の理由で、エラーメッセージが出ます。勿論USBは、接続されています。 何か良い対策はないでしょうか ※OKWAVEより補足:「キヤノン製品」についての質問です。

  • メール送信先が実在するか確かめたい

    $send = mail($e_mail, "kenmei", $MSG, $header) ; if ($send) { } else { $ERRMSG = "以下のメールが " . $e_mail . " 宛てに送信できませんでした\n\n" ; mail("自分のアドレス", "can't send", $ERRMSG, $header) ; } というコーディングをしたのですが、実在しないアドレスが$e_mailに入っていても、この処理自体はエラーが 起きないのか、エラーメッセージは出力されません。 宛て先が実在する・しないを確める方法を教えてください。お願いします。

    • 締切済み
    • PHP
  • 入力フォームをCGIでエラーチェック→PHPにデータを送る

    CGIでフォームの入力をチェックした後、データをphp に送ろうと思います。 今まで使用してた、エラーチェックした後、データを、管理者にメールでデータを送信させるCGIをカスタマイズして、エラーチェックの後に、PHPへデータを送ることは可能なのでしょうか? どなたか御教授お願いいたします。 以下はエラーチェック後の部分です。 $errNum = chkFormInput(); fixTags(); open HTML, $template or err("$templateが開けません"); @html = <HTML>; close HTML; if ($errNum > 0){ # エラーメッセージの先頭のカンマをはずす $errMsg =~ s/^,//; $errMsg = "<font color=\"red\">$errMsg (計$errNumヶ所)"; $errMsg .= "に未入力、又は不適当な入力があります。<br></font>\n"; }elsif (sendmail() && stockData()){ $errMsg = "ありがとうございました。以下の内容で$adminName($adminMail)に送信しました。"; } replaceTags(); showHTML(); exit();

    • 締切済み
    • CGI
  • my pop について

    my popと言う物を友人から教えられて インストールしましたが画面右下からひっきりなしに メッセージが出てきてうるさいのでアンイストールしようと思い設定をクリックして出てきた画面でアンイストールのボタンをクリックしても何もおこらず 、窓の手などを使いアンイストールをするのですが再起動すると消えたはずのmypopがまたプログラムの中に戻っているのです。ファイルの検索から調べてファイルごと削除したのですが、だめでした。 一体このようなしつこい物はどうしたらアンイストールできるのでしょうか。 ちなみにここのサイトです。 http://www.mypop.jp/詳しい方 撃退法をおしえてください。ポップが出てくるたびに 腹が立ちます。

  • My DVD LEを起動出来ません

    お教え下さい。 DELL INSPIRON 640mを使用してます。 Roxio My DVD LEを起動するとサーバー連結後、「無料アクティブ化期間が終了しました」というメッセージで使用できません。 PC購入時に付属していた正規版のソフトなのに。 SONIC のMy DVD LEは、たびたびランタイムエラーを生じたので、4月ごろ再インストールをした結果、このような事態に!! SONIC のHP見て、再インストールする様にということで、実施後ユーザー登録画面にてなんとか登録したが、 My DVD LE初期画面でサーバー連結後、「無料アクティブ化期間が終了しました」という再度このエラーメッセージで、 My DVD LEを起動出来ません。 Activate.MSI の要求もしばしば出てきます。 また、CREATOR LE終了時には、3つのプログラムエラーが常時出ます。 「0x003cafa0の命令が0x0050aa5cのメモリを参照した。メモリが"written"になることはできません」 「0x003cafe8fの命令が0x23c1908のメモリを参照した。メモリが"read"になることはできません」 「Runtime Error!・・・・・R6025」(ランタイムエラーはMy DVD LEしでもばしば発生) という状況です。不安定です。

  • 実行時のlibxxx.soのオープンエラーについて

    こんにちは。 soralis上でテストを試みてますが、リンク先を呼び出した時にオープンエラーがでてるみたいです。エラーの解消方法はどうすればよろしいですか? 業務プログラムをテストドライバから引数を渡し、出力ファイルを吐かせるという流れをやりたいのですが、テストドライバを実行すると業務プログラムのオープンエラーですというメッセージがでます。 テストドライバから業務プログラムを呼び出している個所をコメントにするとエラーがでません。 原因がわからないので教えてください。よろしくお願いします。

  • vc++ 関連

    ぼくは今vc++2008 を使っています. デバッグなしで実行だとでエラーになるのに デバッグだとエラーにならない というわけのわからないバグで混乱しています. デバッグモードだとエラーが出ないので バグが見つけられなくて困ってます. そういう事ってあるんですか? ちなみにエラーメッセージは Debug Assertion Failed! Program: ...ments\Visual Studio File: c:\program files\microsoft visual studio 9.0\vc\include\list Line: 218 Expression: list iterator not dereferencable です.