myになっている理由

このQ&Aのポイント
  • myが付いている項目と付いていない項目があるが、その理由は何か?
  • myはブロック{}の中で宣言され、その中だけで有効とされるが、箱庭のスクリプトでmyを使っている変数が{}の範囲外にあるのはなぜか?
  • 箱庭のスクリプトで各種設定のmyを取り除いたが問題なく動作しているが、それはなぜか?
回答を見る
  • ベストアンサー

myになっている理由

はじめまして。私は数ヶ月前からperlスクリプトに興味を持ち 最近は公開されているスクリプトを見たり改造したりして楽しんでいます。 CGIゲームの箱庭諸島というものなんですが、 http://www.hakoniwa.net/hako/hako2/hako-main.txt この中の各種設定の中にmyが付いている項目と付いていない項目がありますが 一体このmyは何のために書かれているのでしょうか? 試しに各種設定のmyをすべて取り除いてみましたが問題なく動作しています。 私の認識ではmyはブロック{}の中で宣言しその中だけで有効ということだと 思っていますが、箱庭のスクリプトでmyを使ってる変数が{}の範囲外にあるのが わからないのです。 よろしくお願いします。

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

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> つまり、myで宣言したものの有効範囲はファイル全体であって > requireで読み込まれるスクリプトには適用されない。 > myで宣言していない変数はファイル全体とrequireで > 読み込まれるスクリプトにも共通のものが適用される。 > ということで基本的にはあってますか? すみません。ちょっと誤解を招く書き方でした。 あるファイル vincent.pl があったとします #!/usr/bin/perl require 'inc.pl'; my $var1; sub mogera {   my $var2;   foreach (@ARGV) {     my $var3;   } } このとき、$var1 の有効範囲は vincent.pl全体に及びます。 $var2 はサブルーチン mogera の中だけです。 そして $var3 は foreach の中だけで有効です。 その変数を囲む最も小さなブロックの範囲で有効であり、最大でファイル全体ということです(厳密には違うのですが話が長くなるので省略します)。 ですから、$var1, $var2, $var3 のいずれも inc.pl の中から見ることはできません。 明確に宣言されていない変数はグローバル変数になりますので、inc.plからでも 参照することができるわけです。 最初は面倒に思われるかもしれませんが、変数は宣言して使うようにしておくと 変数名を間違えてタイプしてしまったときなどに悩まなくてすみます。 use strict というプラグラマを使うと、この宣言を強制することができます。

Jacktis
質問者

お礼

解答遅くなってしまい申し訳ありません。 ありがとうございました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

my の有効範囲は { } のブロックの内側だけではありません。 あるファイルの中でmy $var としたとき、その有効範囲はファイル全体に及びます。 A "my" declares the listed variables to be local (lexically) to the enclosing block, file, or "eval". If more than one value is listed, the list must be placed in parentheses. 問題のスクリプトを見ていましたが、途中で条件に応じて特定のファイルを require していますね。 おそらく、読み込む側のスクリプトと読み込まれる側のスクリプトとで共通のものを使いたい変数が my で宣言されていないものだと思います。 こういう場合、use vars とか our とか使って宣言するのが最近のスタイルです(use vars はちょっと古め)。 "our" associates a simple name with a package variable in the current package for use within the current scope. When "use strict 'vars'" is in effect, "our" lets you use declared global variables without qualifying them with package names, within the lexical scope of the "our" declaration. In this way "our" differs from "use vars", which is package scoped. Unlike "my", which both allocates storage for a variable and associates a simple name with that storage for use within the current scope, "our" associates a simple name with a package variable in the current package, for use within the current scope. In other words, "our" has the same scoping rules as "my", but does not necessarily create a variable. お金を出して本を買ってもいいというのなら、「Perl ベストプラクティス」を 読んでみると得られることは多いと思います。 http://www.oreilly.co.jp/books/4873113008/ ちょっと高いですけどね(4515円)。

Jacktis
質問者

お礼

ありがとうございます。 つまり、myで宣言したものの有効範囲はファイル全体であって requireで読み込まれるスクリプトには適用されない。 myで宣言していない変数はファイル全体とrequireで 読み込まれるスクリプトにも共通のものが適用される。 ということで基本的にはあってますか? use vars や ourについては調べてみようと思います。 Perl ベストプラクティスの説明を読んでみましたがかなり 詳しく書かれているようですね。購入を検討しようと思います。

関連するQ&A

  • この箱\庭諸島の配布元

    http://bb.ark2k.net/~weapon/hakoniwa/hako1/hako-main.cgi この箱庭諸島、どこで配布されていますか?

  • 箱庭諸島のオリジナルソースありませんか?

    箱庭諸島のオフィシャルページにて 「 現在、箱庭諸島商用化の話があり、その関係上ゲームの開催、関連サイトへのリンク、スクリプト配布などを行う事ができません。しかし、すでに配布しているものに関しては、従来の使用条件で使って頂いて構いません。つまり、当サイトへのリンクさえ残してもらえれば、改造もフリー再配布も可能です。 」 となっており、ダウンロードできません。 フリー再配布は可能になっているのでyahooで探してみましたがありませんでした。 なので、perl版のオリジナル(改造版は×)ソースを手に入れる方法を教えていただけませんか? なお、バージョンはできれば新しいものがいいですが、あまりこだわりません。

    • ベストアンサー
    • Perl
  • my($Str)とmy $Strの違い

    いつもお世話になります。 某高機能アクセス解析プロのPerlで書かれたCGIファイルの中に、 my($Str)と、my $Str が出てきます。 これは、何か特別な違いがあるのでしょうか。 知識も無いのにCGIを改造していて恐縮ですが、 このような ちょっとした事で非常に悩みます。 どうか教えて下さい。 よろしく、お願いします。

    • ベストアンサー
    • Perl
  • HTML版の箱庭諸島のスクリプトを教えてください

    今度、自分のHPに箱庭諸島を載せたいのですが CGI版のはデーター量が多くて、サーバーダウンしてしまうので HTML版のを載せたいのですが、 HTML版のスクリプトを教えてください

  • Perl my 改行について

    #Practice Coad in Perl(注意:プログラムは上から実行される) use strict; use warnings; # スカラー変数 my $a = '1'; #これは「1」という数字の入っている箱 my $b = '2'; #これは「2」という数字の入っている箱 my $str = "ABCD_TEXT"; #文字列 print "$a" - "$b" ; print "$str"; 以下のコードで、my$str ="ABCD_TEXT"; #文字列 表示を 3 ABCD_TEXT としたい。 どうすればいいか?

  • ループ中でのmy宣言と処理速度

    こんにちは、Perl入門者ですがよろしくお願いします。 質問内容はループ中にmy宣言をいちいちすると処理速度は落ちてしまうのかということです。 ソースを例に挙げると まず、$lenをループの外に書く方法と my $i; my $len; for( $i=0 ; $i<1024 ; $i++){ $len = length($str[$i]; } $lenをループの中に書く方法 my $i; for($i=0 ; $i<1024 ; $i++){ my $len; $len = length($str[$i]); } の2種類です(その他の変数については特に言及していません) 使いやすさでいえば、ループ内で宣言をした方が自動的に初期化されるのでうれしいのですが ふと、いちいちメモリの解放と確保を行っているわけですからOS(?)に負荷がかかって遅くなっているのではと考えました。 Perlで処理速度を測ることもできるようですが恥ずかしいながらスキル不足です。すいません。 どなたかご存知の方、自分なりの考えがある方はご教授頂きたく存じます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 初心者です。Perlではどんな時変数宣言は必要ですか?

    Perl初心者です。 マニュアル本を見ると、Perlでは特に変数を宣言しなくても扱えるようになっていますよね。 今まで幾つか自作CGIプログラムを作ってきたのですが、一度も my や localといった変数宣言を使った事がありません。 プログラム自体は正常に稼働しているので今まで全く無視していたのですが、こちらのPerlカテゴリの質問などを参照させていただいていると、皆さん必ず変数を my で宣言してらっしゃいます。 これは行った方がよいものなのですか? 宣言する事のメリット、宣言しない事のリスク、もしくはしたほうが良い場合、しない方が良い場合等を教えてください。とりあえず、サブルーチン内で宣言すると他のサブルーチンでは使えないらしい、という事だけは朧気に… よろしくお願いします。

    • ベストアンサー
    • Perl
  • 構文エラーのある行番号を知りたい

    いつもお世話になっております。 現在既存のPERLを解析して、初心者ながらもなおしています。 で、私が直すとCGIエラーが起こり、よくよく調べたら”;”がなかったり、use strict;を宣言しているのにmy(hoge)と書いていなかったり、でケアレスなミスがたくさんあり、それをつぶしていけば何とかわかるのですが、何せ、たくさん改造かけてしまったあとではそれだけでも見つけるのが大変です。そういうエラーがある場合、”○○行目に";"がありません”というメッセージがhtml上に表示されると便利なのですが、そういう機能はありませんか? よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • fedora core3でCGIがソースコードで表示されてしまいます。

    document root("var/www/html")でCGIを使うために、httpd.confの設定で#Addhandler cgi-script →Addhandler cgi-script , と書き直し、<Directory"var/www/html">のoption項目にExecCGIと追加しました。 アクセスするときはlocalhost/***.cgiとしています。 cgi fileのperlのパスが#!/usr/bin/perlとなっているのでその場所にちゃんとperlがあるかも確認しました。 .cgiファイルはWindowsXPからASCIIで転送したものです。.httpd.confの設定以外はデフォルトの状態です。 何日間か試行錯誤したのですが、うまくいきません。どうかご助言お願いします。

  • use strictを宣言してlocal変数を使うには?

    Perl初心者です。初歩的な質問ですが、 サブルーチンの中で my だと、その下の{ } ブロックではmyで宣言したローカル変数がスコープされないので  localを使うのではないかと思いますが、 それだと、use strictではエラーになります。 こんなときどう処理したらよいのでしょうか。

    • ベストアンサー
    • Perl

専門家に質問してみよう