ブログトップ 記事一覧 ログイン 無料ブログ開設

サンプルコードによる「Perl入門」 - 未経験からプロの技術が身につくPerl講座

★★ 未経験から初めて、プロの実力がどんどん身につく、Perl入門講座 ★★
テキスト処理ならPerlが最適。if文,for文,配列,ハッシュ,正規表現を覚えれば、ログ解析も自由自在。大量のExcelデータを高速に集計。Webサイトを作成して、独自のサービスの展開も! 関数とモジュールを覚えれば業務効率が劇的に改善。初級から上級まで、Perlのすべてが学べます。「へぇー、こうすればこんなに簡単にできるんだ!!」プログラミングの面白さを実感しよう。
プロとして第一線で活躍し続けるために、プログラミングの確かな実力を「サンプルコードによるPerl入門」で身に着けてみませんか。 学び続けることで、あなたのエンジニアとしての価値が5倍、10倍に高まります。

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


目次

tokuhiromtokuhirom 2010/01/24 00:49 Perl5 において forとforeachは同義なので、その点についてふれた方が親切かとおもいます。

for my $field (@fields) { }

foreach (my $i = 0; $i < 5; $i++) { }
もうごきます。

名無しさん名無しさん 2010/01/24 01:20 "配列スライスとハッシュスライス"の項が色々とおかしいです。
ハッシュの例と配列の例が反対&この状況なら、a, b, cはクオートするべき。

名無しさん名無しさん 2010/01/24 01:40 shift()は呼び出し元に応じてもう一つ意味があって、shift(@_)

laclefdorlaclefdor 2010/01/24 04:47 Learning Perlに準じた解説記事ですね。大変分かりやすいです。

perlcodesampleperlcodesample 2010/01/24 07:30 >tokuhiromさん
foreach と for がPerlでは実は同じという点を追記しました。

>名無しさん
配列スライスとハッシュスライスのサンプルを修正しました。

ありがとうございます。

fuge-fuge- 2010/01/24 08:26 蜜からなった

oooooooooooooooo 2010/01/24 10:36 grep のサンプルが
@select = map { $_ =~ 'cat' } @array;
と map になってるよ

chaichanPaPachaichanPaPa 2010/01/24 11:46 「配列の操作」のとこで、%hash宣言の残骸がありますよ

konisimplekonisimple 2010/01/24 14:48 わかりやすかったです!
日本語の解説読むよりサンプルコード見た方が早いですもんね!
ありがとうございます!

perlcodesampleperlcodesample 2010/01/24 14:49 >ooooooooさん
mapの間違い修正しました。

>chaichanPaPaさん
残骸を削除しました。

ありがとうございます。

kobachankobachan 2010/12/19 11:41 大変興味深く拝読いたしました。
fuge- さんからもご指摘されておりますが
> # 見つかった場合はその位置、蜜からなった場合は-1が返る
 # 見つかった場合はその位置、見つからなかった場合は-1が返る
分かりやすさに努めた解説なので明らかな誤字が殊更に目立ってしまいます。

perlcodesampleperlcodesample 2010/12/20 21:59 >kobachan
 修正しました。ありがとうございます。

kenchan505050kenchan505050 2012/08/28 23:01 助かります。ありがとうございます。Perlをこれで覚えられそうです。

perlcodesampleperlcodesample 2012/08/30 14:39 よかったです。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/perlcodesample/20091226/1264257759