• ベストアンサー

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

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

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

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

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

mari2002
質問者

お礼

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

関連するQ&A