2009-12-26
Perl基礎文法最速マスター
Perlの文法一覧です。他の言語をある程度知っている人はこれを読めばPerlの基礎をマスターしてPerlを書くことができるようになっています。簡易リファレンスとしても利用できると思いますので、これは足りないと思うものがあれば教えてください。
1. 基礎
文法チェック
文法をチェックを厳しくするために最初に必ず次の2行を書くようにします。プログラムが動けばよいからという考えでこの2行を書かないというのはよくないです。この2行を加えることで事前に文法チェックが行われるので、ソースコードを記述する作業は速くなり、コードの品質も上がります。
use strict; use warnings;
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
2. 数値
数値の表現
スカラ変数に数値を代入できます。整数でも小数でも代入できます。桁数が大きい場合はアンダーバーを区切り文字として利用できます。
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--
3. 文字列
文字列の表現
文字列はシングルクォートかダブルクォートで囲みます。ダブルクォートの中では\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が返る
4. 配列
配列変数の宣言と代入
配列です。
# 配列の宣言 my @array; # 配列への代入 @array = (1, 2, 3);
配列の要素の参照と代入
配列の要素を参照と代入です。
# 要素の参照 $array[0]; $array[1]; # 要素の代入 $array[0] = 1; $array[1] = 2;
配列の個数
配列の個数を取得するには配列をスカラコンテキストで評価します。Perlにしか見られない少し特殊な文法です。
my $array_num = @array;
配列の操作
配列を操作する関数です。
my @array = (1, 2, 3); # shift(先頭を取り出す) my $first = shift @array; # $firstは1 # unshift(先頭に追加) unshift @array, 5; # @arrayは (5, 2, 3); # pop(末尾を取り出す) my $last = pop @array; # @arrayは (5, 2) # push(末尾に追加) push @array, 9; # @arrayは (5, 2, 9)
5. ハッシュ
ハッシュ変数の宣言と代入
my %hash; %hash = (a => 1, b => 2);
ハッシュの要素の参照と代入
ハッシュの要素の参照と代入です。
# 要素の参照 $hash{a}; $hash{b}; # 要素の代入 $hash{a} = 5; $hash{b} = 7;
ハッシュに関する関数
# キーの取得 @keys = keys %hash; # 値の取得 @values = values %hash; # キーの存在確認 exists $hash{a}; # ハッシュのキーの削除 delete $hash{a};
6. 制御文
if文
if文です。
if (条件) {
}
if 〜 else文
if 〜 else文です。
if (条件) { } else { }
if 〜 elsif 文
if 〜 elsif文です。他の言語のようにelse ifではなくelsifであることに注意しましょう。
if (条件) { } elsif (条件) { }
while文
while文です。
my $i = 0; while ($i < 5) { # 処理 $i++; }
for文
for文です。
for (my $i = 0; $i < 5; $i++) { }
foreach文
foreach文です。配列の各要素を処理できます。for文よりも好んで利用されます。(実際はperlはforeachはforのエイリアスになっていてまったく同じものです)
foreach my $field (@fields) { }
7. サブルーチン
Perlでは関数のことをサブルーチンともいいます。サブルーチンを作るには次のようにします。Perlでは他の言語のように明示的に引数名を指定することはありません。@_という配列に引数が入っているので自力で取り出します。戻り値を返却するにはreturnを使用します。
Perlでは戻り値としてスカラ変数だけではなく、配列変数やハッシュ変数を返すこともできます。
sub sum { my ($num1, $num2) = @_; my $total = $num1 + $num2; return $total; }
8. ファイル入出力
ファイル入出力です。以下が雛形になります。ファイルをオープンすると、$fhにファイルハンドルが入ってきます。'<'は読み込みモードです。書き込む場合は'>'とします。<$fh>の部分はダイヤモンド演算子と呼ばれ、ファイルから一行読み込みます。or の後ははファイルオープンに失敗した場合に実行されます。dieはエラーメッセージを表示してプログラムを終了する関数です。$!はファイルオープンに失敗した場合のOSからのエラーメッセージです。
open my $fh, '<', $file or die "Cannot open '$file': $!"; while(my $line = <$fh>) { } close $fh;
知っておいたほうがよい文法
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;
配列スライスとハッシュスライス
配列スライスとハッシュスライスを使うと指定した要素のみを配列として取得できます。
# 配列スライス @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 ($@) { }
よく使用する関数・モジュール一覧
現代的なPerlの記述方法
- 2000 http://b.hatena.ne.jp/
- 732 http://b.hatena.ne.jp/hotentry
- 470 http://reader.livedoor.com/reader/
- 220 http://b.hatena.ne.jp/hotentry/it
- 189 http://www.sleipnirstart.com/
- 188 http://ig.gmodules.com/gadgets/ifr?view=home&url=http://www.hatena.ne.jp/tools/gadget/bookmark/bookmark_gadget.xml&nocache=0&up_display_item=5&up_display_thumbnail=true&up_display_summary=true&up_category_all=true&up_category_general=true&up_category_soci
- 182 http://www.google.com/reader/view/
- 181 http://www.google.co.jp/reader/view/
- 170 http://ig.gmodules.com/gadgets/ifr?view=home&url=http://choichoi.sakura.ne.jp/hatena_bookmark.xml&nocache=0&up_num_feed=10&lang=ja&country=jp&.lang=ja&.country=jp&synd=ig&mid=42&ifpctok=-3426623299131673352&exp_split_js=1&exp_track_js=1&exp_new_js_flags=1
- 122 http://twitter.com/