|
||||
|
|
2章 変数
|
|
|
Perl の変数
プログラムを作成していて、「 プログラムの初めの方で使用しているデータを後で使用したい!! 」なんてことは良くある事です。 コンピュータのプログラムでは、このような場合にデータを保存しておく箱が必要になります。 このデータを保存する箱の事を一般的に「 変数 」と呼びます。 Perlでもこの変数を使用してデータを保持します。 C++といった他の言語では変数を使用する前に 「この変数を使用します」 という宣言を行う必要がありまが Perlでは宣言する必要が無く、新たに出てきた変数を Perlが自動的に新規の変数として領域を確保します。
この宣言無しで使用できると言うことは一見使い勝手が良く思うかもしれませんが、裏を返せば タイプミスで記述した変数もそのまま使えてしまうと言うことなので、デバッグが困難になってしまう場合があります。 型の種類
Perlは変数名の先頭にプレフィクス と呼ばれる記号をつけることによって、これが変数であると認識します。 変数には、スカラ変数、配列変数、ハッシュ ( 連想配列変数 ) の 3種類があってそれぞれ次のようなプレフィクスが用いられます。 また 変数に使用する 3種類のほかに、サブルーティンとしても 1つプレフィクスがあります。
それぞれ独特のネームスペースと呼ばれるものを持っているので、スカラ、配列、連想配列で同じ名前を使っても、 名前の衝突を心配する必要はありません 「 型グロブの説明参照 」。 しかし変数名はそのにどういった物が格納されているか連想できる名前が好ましいと思います。 例えば、$a〜$z と連番で変数を作成していっても、少し大きなスクリプトを作成していくと混乱してしまう可能性が非常に高いです。 VisualBasic、C++のように変数に数値、文字と言った区別がなく通常のデータに対しては全てスカラ変数を使用します。 変数名の決まり
変数名で付けれれる名称は、英字 ( a〜z、A〜Z ) またはアンダースコア ( _ ) で始まり、英字、アンダースコアまたは数字 ( 0〜9 ) が続く単語が指定可能です。 文字数の制限はありませんが、大文字、小文字は区別して扱われます。
スカラー変数
スカラ変数は、数値、文字列値、リファレンス等の様々な値を1つだけ保持することが出来ます。
プレフィクス ( $ ) が付き、変数の値は数値、文字列値の区別なく、必要に応じて自動的に変換されます。 例えば文字列に数値を代入すれば数値変数としても振る舞う事が可能です。 代入もされていない状態の変数は数値として扱われると 「 0 」 として扱われ、文字として扱われると 「 "" 空白文字 」 として扱われます。
$a = 10; # 数値を代入 $b = "20"; # 文字列を代入 $c = $a + $b; # 数値と文字列を加算 print $c ; # 表示→ ( 30 ) ※数値は浮動小数点数型数値として保持されます。 配列
配列に関する詳細については [ 3章 ] を見てください、ここでの説明はざっと流す程度です。
配列とは 複数のスカラ値の集合を表わします。プレフィクス "@" がつき、個々のスカラ値へアクセスするには "0" から始まる添字を指定しますこの時の添字指定は "[ ]" を用い、個々の要素指定はプレフィクス "$" で行います。 [ 配列の初期化、参照のサンプル ]
# 配列の初期化
@week = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat') ; # 要素への参照 "mon"が表示されます print $week[1] ; 上のコードで作成したテーブルを図解すると、、、
ここでプレフィクスが二つ出てきているのに気が付いたと思います、最初の配列の初期化は配列全部に対することなのでプレフィクス "@" を使用します。配列一つ一つの要素はスカラ変数となり、スカラへのアクセスなのでプレフィクス "$" を使用します。 ハッシュ ( 連想配列 )
ハッシュに関する詳細については [ 4章 ] を見てください。ここでの説明はざっと流す程度です。
ハッシュを簡単に表現すると、配列変数の添字がキーと呼ばれる文字列となったものになります。 データはキーと対応して保持されます。 プレフィクス "%" がつき、個々のスカラ値へアクセスするには変数名にキーを付けますこの時のキーの指定は "{ }" を用い、個々の要素指定は配列同様プレフィックス "$" で行います。 [ ハッシュの初期化、参照のサンプル ]
# ハッシュの初期化
%week = ('sun', '始まり', 'wed', '中日', 'fri', '週末') ; # 要素への参照 "週末"が表示されます print $week{fri} ; 上のコードで作成したハッシュを図解すると、、、
ここでもプレフィクスが二つ出てきています、最初のハッシュの初期化はハッシュ全部に対することなのでプレフィクス "%" を使用します。つぎはハッシュのひとつのスカラへのアクセスなのでプレフィクス "$" を使用します。 型グロブ
型グロブとは、同じ識別子(プレフィクス以降)を持つあらゆる値を表現する ワイルドカードのようなものになります。
各変数に対する単なるポインタの集まりとなり、Perlで同じ識別子( 変数名 )を使っても、スカラー変数、配列、ハッシュ等を独立して保持できるのは下図のような仕組みがあるからです。
![]() この型グロブを別の識別子の型グロブ代入する事により、スカラー変数、配列、ハッシュ等の全ての変数、サブルーチン名を別名で参照する事が出来ます。 [ 型グロブを代入したサンプル ]
$Long_name = "Hello World" ; @Long_name = (1,2,3,4) ; *short = *Long_name; # グロブの代入 print $short; # 表示( Hello World ) print $short[1] ; # 表示( 2 ) ![]() 上のサンプルを見ていただくと変数 Long_name に代入した値が shortで参照できていますね。 これは上の画像で見ていただけるように型グロブを代入して別名で同様の変数を参照しているという事です。 スコープ ( 可視範囲 )
変数のスコープ ( 可視範囲 ) とは、スクリプトの中でどこまでその変数を参照する事が出来るのかという範囲を意味します。 例えば、サブルーティンの中で宣言した変数はそのサブルーティンの中でしか参照できない場合、その変数のスコープはそのサブルーティンと言うことになります。
Perlの場合、通常の変数は全てどこからでもアクセス可能なグローバルなスコープを持つ事になります ( 正確にはパッケージ内で ) 。 ただし宣言時に local や my を使用すると前途に当てはまりません。 ( 2つの違いについては 9章を参照して下さい )
$a = 10 ; # $aの宣言、代入 &Sub_A ; # サブルーチンの呼び出 &Sub_B ; # サブルーチンの呼び出し print $a ; # 表示→ ( 100 ) print $b ; # 表示→ ( 10 ) sub Sub_A { print $a ; # 表示→ ( 10 ) $b = 10 ; # $bへの代入 } sub Sub_B { print $b ; # 表示→ ( 10 ) $a = 100 ; # $aへの代入 } 上サンプルの変数 aと b は、サブルーティン Sub_Aや Sub_Bの中からも値を参照/変更できています。 つまり、これらの変数は サブルーティン Sub_Aや Sub_Bでも参照できるスコープと言うことになります。 特殊変数 「 $_ ]
Perlの大きな特徴の一つが、省略した記述が出来る 事です。 省略した記述とは、例えば本来値を指定する箇所に値を指定しなくても構文エラーにならず、スクリプトを実行出来たりすることを指します。
このため上級者の書いたコードを見るとパッと見で理解が難しかったりするケースがあります。 このように指定する変数を省略した場合、ほとんどの関数は デフォルトで「 $_ 」の特殊な変数を用いるようになっています。
print ; # print $_ ; と同じ while( /^abcd/ # $_ =~ /^abcd/ と同じ for ( 1..10 ) # $_ をカウンタ1〜10として使用 [ $_を使用した配列全アクセスのサンプル ]
@week = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'); foreach ( @week ){ # $_に一行ずつ代入 print ; # $_ の内容を出力 print "\n"; } [ 出力結果 ]
sun
mon tue wed thu fri sat エスケープシーケンス
Perlスクリプトから改行を出力するケースを考えてみましょう。 出力は print文を使用しますが、改行はどのように記述するのでしょうか・・・ 当然 printの後に 改行をしても出力結果で改行されるわけではありません。 これまでで何度か使用していますが、このような場合はエスケープシーケンスと呼ばれる文字列を指定します。
例えばスクリプトの中で「 改行 」や「 タブ 」を出力したい場合には、それらを表すエスケープシーケンスを出力します。 エスケープシーケンスとはバックスラッシュ(日本語環境では \ )で始まる文字列で、それぞれが特殊な意味を持っています。
エスケープシーケンスを使用したい場合には文字列をダブルコーテーションで囲みます。ダブルコーテーションで囲まれた文字列は、バックスラッシュ( \ )と変数がそれぞれ展開して出力されます。 逆にシングルコーテーションで囲まれた文字列はこの 置換を受けません( \' と\\を除く )。
$a = "Hello" ;
print "$a World" ;# 表示→ ( Hello World ) print '$a World' ;# 表示→ ( $a World ) # エスケープシーケンスの展開 print "Hello \n World" ;# 表示→ ( Hello [改行] World ) print 'Hello \n World' ;# 表示→ ( Hello \n World ) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||