2009-12-26
Perl基礎文法最速マスター

Perlの文法一覧です。他の言語をある程度知っている方はこれを読めばPerlの基礎をマスターしてPerlを書くことができるようになっています。
基礎
文法チェック
文法をチェックを厳しくするために最初に必ず次の2行を書くようにします。
use strict; use warnings;
この2行を加えることで事前に文法チェックが行われるので、ソースコードを記述する作業は速くなり、コードの品質が上がります。
print文
print文です。
print "Hello world";
Perlでは標準関数や事前に定義されている関数で括弧を省略することができます。
コメント
コメントです。
# コメント
変数の宣言
変数の宣言です。変数にはスカラ変数、配列変数、ハッシュ変数があります。
# スカラ変数 my $num; # 配列変数 my @students # ハッシュ変数 my %month_num;
スクリプトの実行
スクリプトを実行するにはコマンドラインで次のようにします。
perl script.pl
出力結果をファイルに書き出すにはリダイレクトを使います。
perl script.pl > file.txt
コンパイルチェック
事前にコンパイルチェックを行うにはコマンドラインで次のようにします。
perl -c script.pl
デバッガの起動
デバッガを起動するにはコマンドラインで次のようにします。
perl -d script.pl
デバッガについては「デバッガの手引き」も参考にしてください。
数値
数値の表現
スカラ変数に数値を代入できます。整数でも小数でも代入できます。桁数が大きい場合はアンダーバーを区切り文字として利用できます。
my $num = 1; my $num = 1.234; my $num = 100_000_000;
四則演算
四則演算です。
$num = 1 + 1; $num = 1 - 1; $num = 1 * 2; $num = 1 / 2;
余りと商の求め方です。商を求めるには普通の除算を行った後にint関数で整数部を取り出します。
# 商 $div = int(3/2); # 余り $mod = 3 % 2;
インクリメントとデクリメント
インクリメントとデクリメントです。
# インクリメント $i++ # デクリメント $i--
文字列
文字列の表現
文字列はシングルクォートかダブルクォートで囲みます。ダブルクォートの中では\t(タブ)や\n(改行)などの特殊文字を利用することができます。またダブルクォートで囲まれた文字列の中では変数展開することができます。
my $str1 = 'abc'; my $str2 = "def"; my $str3 = "a\tbc\n"; # 変数展開(結果は abc def) my $str4 = "$str1 def";
文字列操作
各種文字列操作です。
# 結合 my $join1 = 'aaa' . 'bbb'; my $join2 = join(',', 'aaa', 'bbb', 'ccc'); # 分割 my @record = split(/,/, 'aaa,bbb,ccc'); # 長さ my $length = length 'abcdef'; # 切り出し my $substr = substr('abcd', 0, 2); # ab # 検索 my $result = index('abcd', 'cd'); # 見つかった場合はその位置、見つからなかった場合は-1が返る
配列
配列の宣言と代入
配列の宣言と代入です。配列は複数の値を代入することができる変数です。
# 配列の宣言 my @array; # 配列への代入 @array = (1, 2, 3);
配列の要素の参照と代入
配列の要素を参照と代入です。
# 要素の参照 $array[0]; $array[1]; # 要素の代入 $array[0] = 1; $array[1] = 2;
配列の個数
配列の個数を取得するには配列をスカラコンテキストで評価します。Perlにしか見られない少し特殊な文法です。
my $array_num = @array;
配列の操作
配列を操作する関数です。
# 先頭の要素を取り出す my $first = shift @array; # 先頭に要素を追加 unshift @array, 5; # 末尾の要素を取り出す my $last = pop @array; # 末尾に要素を追加 push @array, 9;
ハッシュ
ハッシュの宣言と代入
ハッシュの宣言と代入です。ハッシュは複数の対になる値を代入することのできる変数です。
my %hash; %hash = (a => 1, b => 2);
ハッシュの要素の参照と代入
ハッシュの要素の参照と代入です。
# 要素の参照 $hash{a}; $hash{b}; # 要素の代入 $hash{a} = 5; $hash{b} = 7;
ハッシュのキーは「a-zA-Z_」で構成されている場合は、シングルクォートやダブルクォートで囲む必要はありません。
ハッシュに関する関数
# キーの取得 @keys = keys %hash; # 値の取得 @values = values %hash; # キーの存在確認 exists $hash{a}; # ハッシュのキーの削除 delete $hash{a};
制御文
if文
if文です。
if (条件) {
}
if 〜 else文
if 〜 else文です。
if (条件) { } else { }
if 〜 elsif 文
if 〜 elsif文です。
if (条件) { } elsif (条件) { }
他の言語のようにelse ifではなくelsifであることに注意しましょう。
while文
while文です。
my $i = 0; while ($i < 5) { # 処理 $i++; }
for文
for文です。
for (my $i = 0; $i < 5; $i++) { ... }
foreach文
foreach文です。配列の各要素を処理できます。foreachはforのエイリアスになっており実質は同じものです。
foreach my $field (@fields) { ... }
比較演算子
比較演算子の一覧です。Perlでは数値比較と文字列比較は厳密に区別されます。
[A]数値比較演算子の一覧
| $p == $q | $pと$qは等しい |
| $p != $q | $pと$qは等しくない |
| $p < $q | $pは$qより小さい |
| $p > $q | $pは$qより大きい |
| $p <= $q | $pは$q以下 |
| $p >= $q | $pは$q以上 |
[B]文字列比較演算子の一覧
| $s eq $t | $sは$tと等しい |
| $s ne $t | $sは$tは等しくない |
| $s lt $t | $sは$tより小さい |
| $s gt $t | $sは$tより大きい |
| $s le $t | $sは$t以下 |
| $s ge $t | $sは$t以上 |
7. サブルーチン
Perlでは関数のことをサブルーチンともいいます。サブルーチンを作るには次のようにします。
sub sum { my ($num1, $num2) = @_; my $total = $num1 + $num2; return $total; }
Perlでは他の言語のように明示的に引数名を指定する必要はありません。@_という配列に引数が入っているので必要に応じて利用します。戻り値を返却するにはreturnを使用します。
ファイル入出力
ファイル入出力です。
open my $fh, '<', $file or die "Cannot open '$file': $!"; while (my $line = <$fh>) { ... } close $fh;
open関数でファイルをオープンすると、$fhにファイルハンドルが代入されます。'<'は読み込みモードです。書き込む場合は'>'とします。<$fh>という記述でファイルから一行読み込むことができます。or の後ははファイルオープンに失敗した場合に実行されます。dieはエラーメッセージを表示してプログラムを終了する関数です。$!はファイルオープンに失敗した場合のOSからのエラーメッセージです。
知っておいたほうがよい文法
Perlでよく出てくる知っておいたほうがよい文法の一覧です。
Perlの真偽値
Perlで偽と判断される値は、「undef」「''」「0」「'0'」の4種類です。これ以外は真になります。
defined 値が定義されているかどうかの判定
値が定義されているかどうかを調べるにはdefined関数を使用します。
defined $num;
コマンドライン引数
コマンドライン引数を受け取るには@ARGV変数を使用します。
my ($file, $options) = @ARGV;
コマンドライン引数をひとつだけ受け取る場合は次のように書くことができます。暗黙的に@ARGVがshiftの引数に渡されます。
my $file = shift;
スカラコンテキストとリストコンテキスト
Perlでは文脈によって戻り値が異なる関数があります。たとえばlocaltime関数などです。
# スカラコンテキスト(日付・時刻を文字列で取得) my $time_str = localtime(); # リストコンテキスト(日付・時刻の各要素を配列として取得) my @datetime = localtime();
unless文
unlessはif文の否定を表現します。
unless (条件) {
...
}
後置のif, 後置のunless
Perlではifやunlessを文の後ろに置くことができます。
# 後置のif print $num if $num > 3; # 後置のunless die "error" unless $num;
後置のfor
Perlではforを文の後ろに置くことができます。
# 後置のfor print $_ for @nums;
値は順番に$_に代入されます。
配列スライスとハッシュスライス
配列スライスとハッシュスライスを使うと指定した要素のみを配列として取得できます。
# 配列スライス @select = @array[1, 4, 5]; # ハッシュスライス @select = @hash{'a', 'b', 'd'};
map
mapを使うと配列の各要素を変換することができます。$_には@arrayの要素が順に代入されます。
@mapped = map { $_ * 2 } @array;
grep
grepを使うと条件に一致した要素のみを配列として取得できます。$_ には@arrayの要素が順に代入されます。
@select = grep { $_ =~ 'cat' } @array;
リスト代入
リスト代入と呼ばれる代入方法があります。
my ($num1, $num2) = ($num3, $num4);
範囲演算子
整数の範囲を表現する範囲演算子と呼ばれるものがあります。
my @numes = (0 .. 5);
文字列リスト演算子
文字列のリストを簡単に書く構文があります。
my @strs = qw/aaa bbb ccc/;
単独のreturn
サブルーチンの中でreturnと書くと、スカラコンテキストの場合はundefが返却され、リストコンテキストの場合は空のリスト()が返却されます。戻り値を使ってサブルーチンでエラーが発生したことを伝えたい場合はreturn undef とは書かないで return と書くようにします。
sub name { my @args = @_; return; }
例外処理
例外を投げるにはdieを使用します。
die "Error message";
例外を捕獲するにはevalを使用して$@を判定します。
eval { dieが発生する可能性のある関数など }; if ($@) { ... }
ファイルからすべて読み込む
ファイルからすべて読み込む関数はないので行をすべて配列に読み込んでjoinでつなげます。
my @lines = <$fh>; my $content = join '', @lines;
これは一行で書けます。
my $content = join '', <$fh>;
3項演算子
3項演算子です。下のサンプルの場合は$flgが真値の場合は1が、偽値の場合は2が$numに代入されます。
my $num = $flg ? 1 : 2;
||=
左辺値が偽値の場合に右辺値を代入します。下のサンプルの場合は$numが偽値であった場合に2が$numに代入されます。
$num ||= 2;
//=
Defined-or演算子です。左辺値が未定義の場合に右辺値を代入します。下のサンプルの場合は$numが未定義であった場合に2が$numに代入されます。
$num //= 2;
モジュールの読み込み
モジュールを読み込むにはuseを使います。
use モジュール名;
Perlで設定ファイルを書く
Perlで書いた設定ファイルを読み込むにはdoを使用します。
my $conf_file = "app.conf"; my $conf = do $conf_file or die qq/Can't load config file "$conf_file": $!$@/;
設定ファイルの内容です。
{
name => 'Foo',
number => 9
}
ファイルの読み込みか解析に成功しなかった場合は未定義値が返却されます。ファイル名が存在しなかった場合は$!に、Perlのソースコードの読み込みに失敗した場合は$@にエラーの内容が設定されます。
複数行コメント
以下のように記述すると複数行コメントができます。
=pod コメントにしたい文章 =cut


