Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. よく使う関数・モジュール

よく使用する関数・標準モジュール一覧

よく使用する関数・標準モジュールの一覧です。これらの関数を覚えておけば、Perlをより便利なものにすることができます。詳細な解説は避け、簡単なサンプルを紹介しています。戻り値のあるものについては$retという記号で表しています。 

また、よく使用する特殊変数、標準モジュールについても、解説しています。各項目から、関数の詳細にもリンクしていますので、便利にご利用ください。

  1. 数学関数
  2. 文字列操作
  3. 配列操作
  4. ハッシュ操作
  5. ファイル入出力
  6. ファイル・ディレクトリ操作
  7. 時刻・時間
  8. その他の重要な関数
  9. 関数とモジュールのドキュメントの調べ方
  10. よく使用する特殊変数
  11. よく使用する標準モジュール

数学関数

abs

絶対値を求めるにはabs関数を使用します。

$ret = abs $num;

abs(-3)は3になります。

sqrt

正の平方根を求めるには、sqrt関数を使います。

$ret = sqrt $num;

sqrt(4)は2になります。

int

小数点を含む数値の整数部を取り出すにはint関数を使用します。

$ret = int $num;

int(1.5)は1に、int(-1.5)は-1になります。

ceil(POSIX)

小数点を切り上げるには、POSIXモジュールのceil関数を使用します。

use POSIX 'ceil';
$ret = ceil $num;

floor(POSIX)

小数点を切り下げるには、POSIXモジュールのfloor関数を使用します。

use POSIX 'floor';
$ret = floor $num;

rand

乱数を生成するにはrand関数を使用します。引数で指定した数より小さい数値がランダムで生成されます。

$ret = rand $num;

looks_like_number(Scalar::Util)

数値であるかどうかの判定を行うにはScalar::Utilモジュールのlooks_like_number関数を使用します。

use Scalar::Util 'looks_like_number'; 
$ret = looks_like_number $num;

2 文字列操作

join

区切り文字を指定して文字列を連結するにはjoin関数を使用します。

$ret = join(',', @array);

第1引数は、区切り文字です。この例では区切り文字としてカンマを指定しています。第2引数以降で与えられた文字列が区切り文字で連結されます。

length

文字列の長さを取得するには、length関数を使用します。

$ret = length $str;

substr

指定した位置の文字を抽出・置換するにはsubstr関数を使用します。

[A]指定した位置の文字を抽出する

$ret = substr($str, 2, 4);

第1引数は対象の文字列です。第2引数は抽出したい文字列の開始位置です。第3引数は抽出したい文字列の長さです。

[B]指定した位置の文字列を置換する

substr($str, 0, 2, $replace);

指定した位置の文字列を置換するには、第4引数に置換後の文字列を指定します。この例では$strの先頭から2文字が$replaceで置き換わります。

index

文字列を検索するにはindex関数を使用します。

$ret = index($str, $search);

第1引数には検索対象の文字列、第2引数には検索したい文字列を指定します。戻り値には文字列が見つかった位置が返却されます。見つからなかった場合は-1が返却されます。

$ret = index($str, $search, $pos);

第3引数に検索開始位置を指定することができます。

rindex

文字列の末尾から文字列を検索するにはrindex関数を使用します。

$ret = rindex($str, $search);

split

区切り文字で文字列を分割するにはsplit関数を使用します。

@ret = split(/,/, $str);

第1引数には区切り文字を正規表現で指定します。第2引数には分割したい文字列を指定します。戻り値は分割された文字列の配列です。

reverse

文字列の順序を逆順にするにはreverse関数を使用します。

$ret = reverse $str;

またreverse関数は配列に対して使用すると配列の順序を逆順にします。

uc

文字列を大文字に変換するにはuc関数を使用します。

$ret = uc $str;

ucfirst

文字列の先頭だけを大文字に変換するにはucfirst関数を使用します。

$ret = ucfirst $str;

lc

文字列を小文字に変換するにはlc関数を使用します。

$ret = lc $str;

lcfirst

文字列の先頭だけを小文字に変換するにはlcfirst関数を使用します。

$ret = lcfirst $str;

sprintf

書式を指定した文字列を作成するにはsprintf関数を使用します。
$ret = sprintf($format, @strs);

第1引数は書式を表現した文字列です。第2引数以降は書式指定子の部分に埋め込まれる文字列です。

[A]書式指定のサンプル

$numを整数として解釈して8桁でフォーマットします。8桁に満たない部分は0で埋められます。

$ret = sprintf("%08d", $num);

$numを浮動少数点と解釈して小数点2桁で丸めます。

$ret = sprintf("%.2f", $num);

[B]書式指定子一覧

%c 数値をASCIIコードに対応する文字に変換
%s 引数を文字列として解釈
%d 引数を符号付整数として解釈
%u 引数を符号なし整数として解釈
%o 正数を8進文字列に変換
%x 正数を16進文字列に変換(小文字表記)
%X 正数を16進文字列に変換(大文字表記)
%b 正数を2進文字列に変換 
%f 引数を浮動少数点として解釈
%e 引数を浮動小数点として解釈(指数表記(小文字)でフォーマット)
%E 引数を浮動小数点として解釈(指数表記(大文字)でフォーマット)
%g 引数を浮動小数点として解釈(指数表記(小文字)でフォーマット。末尾の0は削除される)
%G 引数を浮動少数点として解釈(指数表記(大文字)でフォーマット。末尾の0は削除される)
%p 引数に与えられた変数のメモリ上のアドレスに変換 

chomp

末尾の改行を取り除くにはchomp関数を使用します。

chomp $str

クォート演算子「q」

シングルクォートの中でシングルクォートをエスケープしないで使用したい場合はクォート演算子を使用します。

q(aaa'bbb)

機能はシングルクォートで囲んだ場合と同じです。変数展開は行われません。

# これと同じ
'aaa\'bbb'

ダブルクォート演算子「qq」

ダブルクォートの中でダブルクォートをエスケープしないで使用したい場合はダブルクォート演算子を使用します。

qq(aaa"bbb)

機能はダブルクォートで囲んだ場合と同じです。変数展開が行われます。

# これと同じ
"aaa\"bbb" 

quotemeta

正規表現の中で使用される特別な文字列をエスケープするにはquotemeta関数を使用します。

$ret = quotemeta $str;

chr

数値を対応するASCII文字に変換するにはchr関数を使用します。

$ret = chr $num;

ord

ASCIIコードの文字を内部表現である数値に変換するにはord関数を使用します。

$ret = ord $char;

oct

8進文字列を対応する数値に変換するにはoct関数を使用します。

$ret = oct $octal;

hex

16進文字列を対応する数値に変換するにはhex関数を使用します。

$ret = hex $hex;

3 配列操作

配列の個数の取得

配列の個数を取得するにはスカラーコンテキストで配列を評価します。

$ret = @array;

配列の最後の要素番号

配列の最後の要素番号を取得するには$#arrayとします。

$ret = $#array;

shift

配列の先頭の要素を取り出すにはshift関数を使用します。

$ret = shift @array;

unshift

配列の先頭に要素を追加するにはunshift関数を使用します。

unshift(@array, @items);

pop

配列の末尾の要素を取り出すにはpop関数を使用します。

$ret = pop @array;

push

配列の末尾に要素を追加するにはpush関数を使用します。

push(@array, @items);

splice

配列に対する複数の要素の操作を行うにはsplice関数を使用します。

[A]複数の要素を取り出す

複数の要素を取り出すことができます。

@ret = splice(@array, $pos, $size)

第1引数に対象の配列、第2引数に開始位置、第3引数に抜き出したいサイズを指定します。

[B]複数の要素を置換する

複数の要素を置換することができます。

splice(@array, $pos, $size, @items);

第4引数に置き換えたい配列を指定します。

配列スライス

配列から複数の要素を取得するには配列スライスを使用します。

@ret= @array[0, 1, 3];

この例では@arrayの0,1,3番目の要素が@retに代入されます。

grep

条件にマッチした要素だけを取り出したい場合はgrep関数を使用します。

@ret = grep { 条件 } @array; 

3より大きい値を抜き出すサンプルです。

@ret = grep { $_ > 3 } @array; 

配列の要素は順番に$_に代入されます。$_ > 3 を満たすものだけが@retに代入されます。

map

配列のすべての要素を処理するにはmap関数を使用します。

@ret = map { 要素の操作 } @array; 

すべての要素を2倍するサンプルです。

@ret = map { $_ * 2 } @array; 

配列の要素は順番に$_に代入されます。$_ * 2 の結果が@retに代入されます。

max(List::Util)

配列の要素の最大値を求めるにはList::Utilモジュールのmax関数を使用します。

use List::Util 'max';
$ret = max @array;

min(List::Util)

配列の要素の最小値を求めるにはList::Utilモジュールのmin関数を使用します。

use List::Util 'min';
$ret = min @array;

sum(List::Util)

配列の要素の合計を求めるにはList::Utilモジュールのsum関数を使用します。

use List::Util 'sum';
$ret = sum @array;

sort

配列の要素を並び替えるにはsort関数を使用します。

@ret = sort { 並び替える条件 } @array;

[A]数値で比較して昇順で並び替える

数値で比較して昇順で並び替えるサンプルです。

@ret = sort { $a <=> $b } @array;

数値で比較するには<=>を使用します。昇順で並べかえる場合は$a <=> $b とします。

[B]数値で比較して降順で並び替える

数値で比較して降順で並び替えるサンプルです。

@ret = sort { $b <=> $a } @array;

数値で比較するには<=>を使用します。降順で並べかえる場合は$b <=> $a とします。

[C]辞書順で比較して昇順で並び替える

辞書順で比較して昇順で並び替えるサンプルです。

@ret = sort { $a cmp $b } @array;

辞書順で比較するにはcmpを使用します。昇順で並べかえる場合は$a cmp $b とします。

[D]辞書順で比較して降順で並び替える

辞書順で比較して降順で並び替えるサンプルです。

@ret = sort { $b cmp $a } @array;

辞書順で比較するにはcmpを使用します。降順で並べかえる場合は$b cmp $a とします。

shuffle(List::Util)

配列をランダムに並べ替えるにはList::Utilモジュールのshuffle関数を使用します。

use List::Util 'shuffle';
@ret = shuffle @array;

reverse

配列の要素を逆順にするにはreverse関数を使用します。

@ret = reverse @array;

文字列リスト演算子

文字列リスト演算子を使えばカンマやクォートなしで文字列のリストを表現できます。

@array = qw(cat dob mouse);

4 ハッシュ操作

keys

ハッシュのすべてのキーを取得するにはkeys関数を使用します。

@ret = keys %hash;

values

ハッシュのすべての値を取得するにはvalues関数を使用します。

@ret = values %hash;

each

ハッシュのキーと値のペアを順に取得するにはeach関数を使用します。

($key, $value) = each %hash;

すべてのキーと値のペアを順に処理するためにはwhile文を使用します。

while (my ($key, $value) = each %hash) {
  ...
}

exists

ハッシュのキーの存在を確認するにはexists関数を使用します。

$ret = exists($hash{$key});

delete

ハッシュのキーを削除するにはdelete関数を使用します。

delete $hash{$key};

reverse

ハッシュのキーと値を入れ替えるにはreverse関数を使用します。

%ret = reverse %hash;

5 ファイル入出力

open

ファイルをオープンするにはopen関数を使用します。

open(my $fh, "<", $file)
  or die "Cannot open $file: $!";

ファイルオープンが成功した場合は$fhにファイルハンドルが代入されます。($fhを宣言すると同時にopen関数に渡しています。)

ファイルオープンが失敗した場合のエラー処理は必ず行う必要があります。

[A]オープンモード

よく使用されるオープンモードの一覧です。

読み込み <
書き込み >
追加書き込み >>

close

ファイルハンドルをクローズするにはclose関数を使用します。

close $fh;

ファイル入力演算子

ファイルから1行を読み込むにはファイル入力演算子を使用します。

$line = <$fh>;

通常はwhile文と一緒に使用します。

while (my $line = <$fh>) {
  ...
}

[A]すべての行を配列に読み込む

すべての行を配列に読み込むにはリストコンテキストでダイヤモンド演算子を使用します。

@lines = <$fh>;

fileno

ファイルディスクリプタを取得するにはfileno関数を使用します。

$ret = fileno $fh;

opendir

ディレクトリをオープンするにはopendir関数を使用します。

opendir(my $dh, $dir)
  or die "Cannot open $dir: $!";

$dhにオープンされたディレクトリハンドルが代入されます。ディレクトリオープンが失敗した場合のエラー処理は必ず行う必要があります。

closedir

ディレクトリハンドルをクローズするにはclosedir関数を使用します。

closedir $dh;

readdir

ディレクトリの中のファイル名を1つずつ読みこむにはreaddir関数を使用します。

$file = readdir $dh;

通常はwhile文と一緒に使用します。

while (my $file = readdir $dh) {
  ...
}

6 ファイル・ディレクトリ操作

unlink

ファイルを削除するにはunlink関数を使用します。

unlink $file
  or die "Cannot remove $file: $!";

copy(File::Copy)

ファイルをコピーするにはFile::Copyモジュールのcopy関数を使用します。

use File::Copy 'copy';
copy($file_from, $file_to)
  or die "Cannot copy $file_from to $file_to: $!";

move(File::Copy)

ファイルを移動するにはFile::Copyモジュールのmove関数を使用します。

use File::Copy 'copy';
move($file_from, $file_to)
  or die "Cannot move $file_from to $file_to: $!";

chdir

カレントディレクトリを変更するにはchdir関数を取得します。

chdir $dir
  or die "Cannot change directory $dir: $!";

mkdir

ディレクトリを作成するにはmkdir関数を使用します。

mkdir $dir
  or die "Cannot create directory $dir: $!";

rmdir

ディレクトリを削除するにはrmdir関数を使用します。

rmdir $dir
  or die "Cannot remove directory $dir: $!";

mkpath(File::Path)

複数階層のディレクトリを作成するにはFile::Pathモジュールのmkpath関数を使用します。

use File::Path 'mkpath';
eval {
  mkpath $dir
};

if ($@) {
  die "Cannot create $dir: $@";
}

mkpathが失敗した場合は例外が発生するので、evalブロックでキャッチします。例外が発生した場合のエラーの内容は$@に格納されます。

rmtree(File::Path)

中にファイルを含むディレクトリを削除したい場合はFile::Pathモジュールのrmtree関数を使用します。

use File::Path 'rmtree';

rmtree($dir, {error => \my $errors});
for my $diag (@$errors) {
  my ($file, $message) = each %$diag;
  warn "problem unlinking $file: $message\n";
}

第1引数には削除したいディレクトリを指定します。最後の引数にはオプションを指定できます。この例ではエラーの内容を取得するようにしています。

getcwd(Cwd)

カレントディレクトリを取得するにはCwdモジュールのgetcwd関数を使用します。

use Cwd 'getcwd';
$ret = getcwd;

chmod

ファイルのパーミッションを変更するにはchmod関数を使用します。

chmod($permission, $file)
  or die "Cannot change permission $file: $!";

basename(File::Basename)

ファイルのベース名を取り出すにはFile::Basenameモジュールのbasename関数を使用します。

use File::Basename 'basename';
$ret = basename $file;

/a/b/c.txt というファイル名の場合はc.txtがベース名に当たります。

dirname(File::Basename)

ファイルが含まれるディレクトリ名を取得するにはFile::Basenameモジュールのdirname関数を使用します。

use File::Basename 'dirname';
$ret = dirname $file;

/a/b/c.txt というファイル名の場合は/a/bがディレクトリ名に当たります。

ファイルテスト演算子

ファイルテスト演算子を使用するとファイルやディレクトリの存在確認を行うことができます。

# 通常ファイルの存在確認
$ret = -f $file;

# ディレクトリの存在確認 
$ret = -d $dir;

通常は条件文と一緒に使用されます。

if (-f $file) {
  ...
}

[A]よく使用されるファイル演算子一覧

-e  ファイルが存在するかの確認(ディレクトリも含む)
-f  ファイルが通常ファイルかどうかを確認
-d  ディレクトリが存在するかを確認
-r  読み込み可能かどうかの確認
-w  書き込み可能かどうかの確認
-x  実行可能かどうかの確認
-M  最終更新から経過した日数を取得
-A  最終アクセスから経過した日数を取得
-s  ファイサイズを取得(単位はバイト)

7 時刻・時間

time

エポック時から現在までの経過秒を取得するにはtime関数を使用します。

$ret = time;

エポック時とは1970年1月1日のことです。

localtime

現在の日付と時刻を取得するにはlocaltime関数を使用します。

($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime;
$year += 1900;
$mon += 1;

先頭から「秒、分、時、日、月、年、曜日」の順になります。年は1900年からの経過年ですので、取得した年に1900を加える必要があります。月は0から始まりますので、実際の月を取得するには1を加える必要があります。

timelocal(Time::Local)

日付と時刻の情報からエポック時からの経過秒を取得するにはTime::Localモジュールのtimelocal関数を使用します。

use Time::Local 'timelocal';
$ret = timelocal($sec, $min, $hour, $mday, $mon, $year);

sleep

スリープするにはsleep関数を使用します。スリープする時間は秒で指定します。

sleep $sec;

スリープするとプログラムはその間停止します。

usleep(Time::HiRes)

マイクロ秒単位でスリープするにはTime::HiResモジュールのusleep関数を使用します。

use Time::HiRes 'usleep';
usleep $microsec;

8 その他の重要な関数

defined

値が定義されているかを確認するにはdefined関数を使用します。

$ret = defined($val);

kill

プロセスにシグナルを送るにはkill関数を使用します。

kill($signal_number, $child_process_id);

caller

呼び出し元の関数の情報を取得するにはcaller関数を使用します。

($package, $filename, $line, $subroutine) = caller(0);

引数には何階層上の呼び出し元の情報を取得するかを指定します。戻り値は順にパッケージ名、ファイル名、行番号、サブルーチン名になります。

getpwuid

実行ユーザ名を取得するにはgetpwuid関数を使用します。

$ret= getpwuid($>);

第1引数にはユーザIDを指定します。実行ユーザIDは$>という特殊変数に格納されているのでこれを指定します。

hostname(Sys::Hostname)

ホスト名を取得するにはSys::Hostnameモジュールのhostname関数を使用します。

use Sys::Hostname 'hostname';
$ret = hostname;

die

エラーメッセージを表示してプログラムを終了するにはdie関数を使用します。

die $message;

warn

警告メッセージを表示するにはwarn関数を使用します。

warn $message;

evalブロック

例外をキャッチするにはevalブロックを使用します。(例外処理を参照)

eval {
  例外が発生する可能性のある処理
};

if ($@) {
  例外が発生した場合の処理
}

例外が発生した場合は$@にエラーの内容が設定されます。

__PACKAGE__

現在のパッケージ名は__PACKAGE__で取得することができます。

$ret = __PACKAGE__;

__LINE__

スクリプト上の行番号は__LINE__で取得することができます。

$ret = __LINE__;

__FILE__

スクリプトのファイル名は__FILE__で取得することができます。

$ret = __FILE__;

9 関数とモジュールのドキュメントの調べ方

関数のドキュメントは

perldoc -f 関数名

で見ることができます。

モジュールのドキュメントは

perldoc モジュール名

で見ることができます。

ドキュメントをファイルに出力したい場合はリダイレクトを使用するとよいでしょう。

perldoc -f 関数名 > ファイル名

10 よく使用する特殊変数

$.    読み込んでいるファイルの行番号
$$    プロセスID
$>    実行ユーザID
$)    実行グループID
$0    実行しているプログラム名
$^O   OS名
$^T   プログラムが起動した時刻
@INC  モジュールの検索パス
%INC  読み込まれているモジュールの情報
%ENV  環境変数
%SIG  シグナルハンドラ
@ARGV コマンドライン引数
@_    サブルーチンの引数
$!    OSのエラー
$@    evalのエラー

11 よく使用するモジュール

File::Spec

File::Specモジュールを使用すればOSに応じたファイル名を作成することができます。

use File::Spec;
my $file_name = File::Spec->catfile( 'dir', 'file.txt' );

Windows系のOSでは、$file_nameは dir\file.txt になり、Unix系のOSではファイル名は dir/file.txtになります。

FindBin

FindBinモジュールを使用すれば、実行しているスクリプトが存在するディレクトリ名を取得することができます。

use FindBin;
my $script_dir = $FindBin::Bin;

$FindBin::Bin に実行しているスクリプトが存在するディレクトリ名が格納されます。

lib

libモジュールを使用すればモジュールの検索パスを追加することができます。

use lib qw/. lib/;

カレントディレクトリとカレントディレクトリのlibディレクトリをモジュールの検索パスに追加する例です。

Carp

呼び出し元から見た観点でエラーを報告するにはCarpモジュールを使用します。croakをdieの代わりに、carpをwarnの代わりに使用します。

use Carp qw/croak carp/;

# dieと同じ
croak($message);

# warnと同じ
carp($message);

Get::Options

コマンドライン引数でオプションを受け取りたい場合はGet::Optionsモジュールを使用します。たとえば次のようなオプションを受け取りたいとします。

perl script_name --length=100 --file=test.txt --verbose

このオプションを受け取るためには以下のように記述します。

use Getopt::Long 'GetOptions';

# デフォルト値の設定
my $data   = 'file.dat';
my $length = 24;
my $verbose;

# コマンドラインオプションから値を受け取る
# (数値, 文字列, 真偽値)
GetOptions(
  'length=i' => \$length,
  'file=s' => \$data,
  'verbose' => \$verbose
);

URI

URLの操作を便利に扱うにはURIモジュールを使用します。

use URI;

my $url = URI->new('http://www.perl.com/index.html');

# URLのスキーマ名 http
my $scheme = $url->scheme;

# URLのホスト名 www.perl.com
my $host = $url->host;

# URLのパスの部分 /index.html
my $path = $url->path;

# URLのクエリ文字列の設定
$url->query_form(name => 'taro', age => 13);

# URLのクエリ文字列 name=taro&age=13
my $query = $url->query;

# URLを文字列で取得 http://www.perl.com/index.html?name=taro&age=13
my $url_str = $url->as_string;

Data::Dumper

配列やハッシュの内容を出力するにはData::Dumperモジュールを使用します。

use Data::Dumper;
my $hash = {a => 1, b => 2};
print Data::Dumper->Dump([$hash], ['$hash']);

XML::Simple

XMLをPerlのデータ構造に変換するにはXML::Simpleモジュールを使用します。

use XML::Simple;
my $xml = XML::Simple->new;
my $hash = $xml->XMLin($xml_file);

XMLinメソッドでXMLファイルを解析してPerlのデータ構造に変換することができます。

LWP::UserAgent

インターネットから情報を取得するにはLWP::UserAgentモジュールを使用します。

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $response = $ua->get($url);

my $content; # 取得した内容
if ($response->is_success) {
  $content = $response->content;
}
else {
  die($response->status_line);
}

getメソッドに取得したいページのURLを取得します。HTTP::Responseオブジェクトが返却されますので、is_successメソッドで成功したかどうかを調べます。成功した場合はcontentメソッドで取得したページの内容を取得します。

Net::FTP

FTPを行いたい場合はNet::FTPモジュールを使用します。

use Net::FTP;

# ホスト名(あるいはIPアドレス)を指定してFTPサーバに接続
my $ftp = Net::FTP->new($host)
  or die "Cannot connect to $host: $@";

# ユーザ名とパスワードを指定してログイン
$ftp->login($user, $password)
  or die "Cannot login ", $ftp->message;

# カレントディレクトリの変更
$ftp->cwd($dir)
  or die "Cannot change working directory ", $ft

# ファイルの取得
$ftp->get($file)
  or die "get failed ", $ftp->message;

# FTPの切断
$ftp->quit;

Text::Diff

ファイル間の差分を調べたい場合はText::Diffモジュールを使用します。

use Text::Diff 'diff';
my $diff = diff($file1, $file2);
Giblog