全般的な文法
Scriptは先頭《 上 》から順に実行されます。
Sub Routineなどは呼び出されたあとは呼び出し行へ戻ります。
また、文(ステートメント)の末尾には必ずセミコロン";"をつけ、セミコロンまでが1つの命令として扱われます。
下記のサンプルでは、先ず初めに 「Hello 」 が表示され、次に 「World\n」 が表示されます。
1. print "Hello" ;
2. print "World\n" ;
大文字、小文字は区別して扱われます。
print "Hello World\n"; # 正
Print "Hello World\n"; # 誤 ( printのpが大文字
)
Perlでは、整数・浮動小数点数のほかに、8進数や16進数も数値として扱えます。 8進数の場合は数値の先頭に "0" を、16進数の場合は数値の先頭に
"0x" をつけます。
| 12345 |
# 整数 |
| 12_345 |
# 整数(アンダースコアは無視) |
| 123.45 |
# 小数 |
| 1.23E45 |
# 指数 |
| 0x12345 |
# 16進数 |
| 012345 |
# 8進数 |
文字列はダブルクォテーション(")又はシングルコーテーション(')で囲みます。ダブルクォテーションはその中に含まれる変数やエスケープシーケンスを展開します。シングルコーテーションは展開しません。
$a = 30 ;
print "$a" ; # 変数の内容30が表示される
print '$a' ; # $aと表示される
エスケープシーケンス
Perlスクリプトから改行を出力する場合は print文を使用します。また改行などはエスケープシーケンスを使用します。
エスケープシーケンスはバックスラッシュ(日本語環境では \ )で始まる文字列で、それぞれが特殊な意味を持ちます。
| 記述 |
展開文字 |
| \n |
改行 |
| \r |
復帰 |
| \f |
改ページ |
| \t |
タブ |
| \b |
バックスペース |
| \a |
アラーム |
| \e |
エスケープ文字 |
| \33 |
文字コード(8進数) |
| \x1b |
文字コード(16進数) |
| \" |
ダブルクォテーション |
|
エスケープシーケンスは文字列をダブルクォテーションで囲みます。ダブルクォテーションで囲まれた文字列は、展開して出力されます。 シングルクォテーションで囲まれた文字列は展開されず、そのままです。(
\' と\\を除く )。
$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 )
コメント
コメントはシャープ 「#」 からその行の行末までです。 CやJava の /* ~ */ で記述するような複数行にわたるコメントは記述する事出来ません。
print "hello world"; # comment
# comment
非推奨ですが、複数行のコメントは、 perldoc用の記述方である =pod と =cut を使用することで、記述できます。
print "ここは実行されます。\n";
=pod
ここはコメント行になります。
ここもコメント行になります。
=cut
print "ここも実行されます。\n";
Perlの変数
Perlでは変数を使用してデータを保持します。Perlでの変数は宣言する必要が無く、新規の変数を Perlが自動的に変数として領域を確保します。
また、Perlの変数に関しては、文字列、数値の区別はありません。
注意:間違えて意図しない名前の変数も登録されてしまい、デバッグが困難になる場合があります。
Perlは変数名の先頭にPrefix と呼ばれる接頭子をつけ型宣言を行います。 変数型には、scalar変数、配列変数、hash ( 連想配列変数 ) の 3種類があり以下のPrefixを付けます。
またPrefixには、Sub routineを表すものもあります。
| scalar変数 |
→ |
$ |
| 配列変数 |
→ |
@ |
| 連想配列(hash) |
→ |
% |
| サブルーチン |
→ |
& |
それぞれの型については独特のNameSpaceをもち、Scalar、配列、連想配列で同じ名前を宣言しても衝突がありません。
変数名について
Perlの変数名は、英字 ( a~z、A~Z ) またはアンダースコア ( _ ) で始まり、英字、アンダースコアまたは数字 ( 0~9 )
になります。 長さの制限はありません。また、大文字、小文字は区別して扱われます。
| $abc |
→ |
正 |
| $a123 |
# |
正 |
| $_abc |
# |
正 |
| $123 |
# |
誤 ( 数値で始まっている ) |
scalar変数
scalar変数は、数値、文字列値、リファレンス等の値を1つだけ保持します。
prefix ( $ ) が付き、変数の値は数値、文字列値の区別はなく、自動的に変換されます。 例えば文字列に数値を代入すれば数値変数としても扱われます。
scalar変数の初期値は数値の場合は 「 0 」、文字の場合は 「 "" 空白文字 」 になります。
$a = 10; # 数値を代入
$b = "20"; # 文字列を代入
$c = $a + $b; # 数値と文字列を加算
print $c ; # 表示→ ( 30 )
※数値は浮動小数点数になります。
配列
配列はPrefix"@" がつき、各配列の要素にアクセスする場合は "0" から始まる数値を添え字として使用します。またこの時の数値は
"[ ]"で囲みます。また添え字には変数も使用可能です。
配列の初期化と参照は以下のように行います。
# 配列の初期化
@week = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat') ;
# 要素への参照 "mon"が表示されます
print $week[1] ;
| sun |
mon |
tue |
wed |
thu |
fri |
sat |
| ↓ |
↓ |
↓ |
↓ |
↓ |
↓ |
↓ |
| $week[0] |
$week[1] |
$week[2] |
$week[3] |
$week[4] |
$week[5] |
$week[6] |
| @week |
配列は、全体に対する扱いの場合は、Prefix "@" を使用します。配列の各要素はスカラ変数となるので、そのアクセスはPrefix "$" つけた変数を使用し"[ ]"で囲みます。
hash
hashとは配列変数の添字がキーと呼ばれる文字列となったものになります。 prefix "%" がつき、個々のscalar値へアクセスする場合には、prefix"$" つけた文字列をキーとして "{ }" で囲みます。
hashの初期化と参照は以下のように行います。
# hashの初期化
%week = ('sun', 'first', 'wed', 'middle', 'fri', 'end') ;
# 要素への参照 "end"が表示されます
print $week{fri} ;
| $week{sun} |
$week{wed} |
$week{fri} |
| %week |
hashは、全体に対する扱いの場合は、Prefix "%" を使用します。配列の各要素はスカラ変数となるので、そのアクセスはPrefix "$" つけた変数を使用し"{ }"で囲みます。
typeglob
typeglobとは、同じ識別子:identifier(プレフィクス以降)を持つ変数グループをまとめて処理出来るようにするポインタの集合です。

typeglobのサンプル
$palm = "hello hello" ;
@palm = (1,2,3,4) ;
*dreams = *palm; # copy the typeglob
print $dreams; # 表示は "hello hello
print $dreams[1] ; # 表示は( 2 )

scope ( 可視範囲 )
変数のscope ( 可視範囲 ) とは、変数を参照出来る範囲の事です。
Perl のディフォルトは、 グローバル変数になり どこからでも参照出来ます。 このため 大規模なスクリプト開発をする場合は my , local
などの装飾子をつけて、明確に管理しましょう。
$a = 12 ; # $aの宣言、代入
&Sub_A ; # サブルーチンの呼び出
&Sub_B ; # サブルーチンの呼び出し
print $a ; # 表示→ ( 123 )
print $b ; # 表示→ ( 23 )
sub Sub_A {
print $a ; # 表示→ ( 12 )
$b = 23 ; # $bへの代入
}
sub Sub_B {
print $b ; # 表示→ ( 23 )
$a = 123 ; # $aへの代入
}
特殊変数
$_ default 変数
プログラム中で、操作対象の変数を指定しない場合、暗黙のうちに、この変数が指定されたとみなされます。
# 省略されている状態
foreach ( @lines ) {
chomp;
s/>/>/g;
s/</</g;
print;
}
# 省略されているけど、実はこういうこと。
foreach $_ ( @lines ) {
chomp( $_ );
$_ =~ s/>/>/g;
$_ =~ s/</</g;
print $_;
}
$_ の使用方法 sample
@alpha = ('a', 'b', c', d', 'e', 'f', g');
foreach ( @alpha ){ # $_ それぞれ代入
print ; # $_ の内容を出力
print "\n";
}
[ 出力結果 ]
a
b
c
d
e
f
g
|