ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

Re:ツバメの育て方
2019/05/31 from くじら
Re:ツバメの育て方
2019/05/30 from 茶々丸
Re:ツバメの育て方
2019/05/03 from くじら
Re:ツバメの育て方
2019/05/03 from ウズラのミラ
Re:ハードオフにあった2000円のジャンクPCを改造してみよう~3話~
2018/12/01 from くじら

ページ

Profile & Policy

  • くじら
    (プライバシーポリシー/注意事項)

新着トラックバック

   

過去ログ

   
        

リンク

リンク集

Feed

エントリー

カテゴリー「Perlなお話」の検索結果は以下のとおりです。

【Perlなお話】myとlocal変数

myとlocal変数

プログラム言語は、値を一時的に記憶する”変数”を使います。
実用的なPerlプログラムでは変数の宣言を使いこなす事が一番の基礎になります。
ゲームプログラムのように複雑になればなるほどプラグラムは肥大化するので自然と変数も増えてしまいます。
Perlではサブルーチンやif、while,、foreach文などのブロック内に変数の有効範囲(ローカル変数)を宣言する"変数の局所化”を行う事ができます。
"変数の局所化”はメモリの節約にもなるので実用的なプログラムや大きな流れの処理になるようなものを組む時には変数の宣言を使うと余計な変数を増やさないようになります。
Perlではmyとlocalによって変数を宣言します。

サブルーチン・ブロック
sub routine {
       #サブルーチン
        if($a=1){
                #ブロック
        }

       for($i = 1; $i <= 10; $i++){
                #ブロック
        }
}
  • ブロック・・・if、while,、foreach文やサブルーチン等{}で区切られた範囲の事。
  • サブルーチン・・・繰り返し利用できるように内容がまとまっているプログラムをブロック内に記述して、呼び出しすように構造化した処理ブロックの事(ぇ?ナンカセツメイヘンダw
myとlocal変数の宣言
#変数に宣言する
my $a;
local $b;

#計算式でも宣言が可能
my $a = 1 + 2;
local $b = 1 + 2;

#複数の変数を宣言する場合
my ($a1,$a2,$a3);
local ($b1,$b2,$b3);

myとlocal変数の違い

myとlocalは変数の有効範囲を宣言させローカル変数にします。myとlocalはローカル変数の有効範囲が違います。

myで宣言
$a = "オハヨウ";
print"1=$a";
&bloc1; #サブルーチン1呼び出し
print"6=$a";
exit;

#サブルーチン1
sub bloc1 {
       #サブルーチン内で宣言
        my $a="おやすみ";
       print"2=$a";
       &bloc2; #サブルーチン2呼び出し

        if(!$n){
               #ブロック内で宣言
                 my $a = "オハヨウ";
               print"4=$a";
       }
       if(!$n){
               print"5=$a";
       }
}

#サブルーチン2
sub bloc2 {
        print"3=$a";
}
1;

実行結果
1=オハヨウ
2=おやすみ
3=オハヨウ
4=オハヨウ
5=おやすみ
6=オハヨウ
localで宣言
$a = "オハヨウ";
print"1=$a";
&bloc1; #サブルーチン1呼び出し
print"6=$a";
exit;

#サブルーチン1
sub bloc1 {
       #サブルーチン内で宣言
        local $a="おやすみ";
       print"2=$a";
       &bloc2; #サブルーチン2呼び出し

        if(!$n){
             #ブロック内で宣言
                 local $a = "オハヨウ";
                print"4=$a";
       }
       if(!$n){
                print"5=$a";
       }
}

#サブルーチン2
sub bloc2 {
        print"3=$a";
}
1;

実行結果
1=オハヨウ
2=おやすみ
3=おやすみ
4=オハヨウ
5=おやすみ
6=オハヨウ

myを使って宣言する事をレキシカルスコープ宣言と言い、宣言された変数をレキシカルスコープ変数と言います。
レキシカルスコープ変数は宣言を行ったサブルーチン内が有効範囲になります。
localを使って宣言する事をダイナミックスコープ宣言と言い、宣言された変数をダイナミックスコープ変数と言います。
ダイナミックスコープ変数は宣言を行ったサブルーチン内とそのサブルーチンが呼んだサブルーチン内が有効範囲になります。

myとlocalは変数の有効範囲を宣言してローカル変数にします。myとlocalはローカル変数の有効範囲が違います。
ifなどのブロックは同じ動作をしますが、myとlocalではサブルーチンで引き渡される引数の動作が違います。

※myはPerl5から実装されたのでPerl4では使えません。っていってもPerl5が主流でPerl6の「実用版」2010年4月にリリース?ってくらいなのですけど・・・マダー?
localよりmyを使う方が実行速度の面からも良いので一般的にはmyを使います。
ただし特殊変数をローカル変数として使う場合とか処理の流れの関係上必要な時はlocalを使用します。
myは使うのを忘れがちになりますが基本ですから普段から使うクセを付けると良いです。

三国志NETの改造とかの質問た~まにされるので、ある程度Perlが組める人を前提で、実用的なPerlプログラミングの話を少しずつしていこうと思ってます。
飽きなければ・・・(オイ
それと”ぇ?”と思う説明はスルーしてください(オイオイ
三国志NETはローカル変数がほとんど宣言されてないので、超大作にしたい人は、まずはグローバル変数化に取り掛かると後々変数がゴチャゴチャにならず何かと作りやすくなったりします。
Perlは結構メモリ喰いと言われるくらいメモリを消費します。
myを使えばサブルーチンを抜けた時に、変数が掃除されるので、メモリの使用量も少しですが抑えられます。
一見ややっこしぃので使い慣れないと中々流れが掴み難いですが、慣れてしまえば至って簡単です。
ハイ、ワタクシハ、アタマデカンガエルヨリ、ナントナクカンデツクル派デス、ケッコウイイカゲンデスwアマリマネシテハイケマセンw

細かい基本的なテクニックですが、チリも積もればお山になるのです。
ゲームを改造する時は、よく流れを読んで、動作が変わらないように、確認しながら宣言を加えて下さい。
などとエラソーな事を言っても。、直す箇所が多くて結構めんどくさがりな私はあまりやってなかったり(ぇ
myは案外使わない人が多いので(オマエモダw
”皆さんは”myを使うクセ付けましょう(マテ

ページ移動