よく使用する関数・標準モジュール一覧
Perl
›
よく使う関数・モジュール
よく使用する関数・標準モジュールの一覧です。これらの関数を覚えておけば、Perlをより便利なものにすることができます。詳細な解説は避け、簡単なサンプルを紹介しています。戻り値のあるものについては$retという記号で表しています。
また、よく使用する特殊変数、標準モジュールについても、解説しています。各項目から、関数の詳細にもリンクしていますので、便利にご利用ください。
- 数学関数
- 文字列操作
- 配列操作
- ハッシュ操作
- ファイル入出力
- ファイル・ディレクトリ操作
- 時刻・時間
- その他の重要な関数
- 関数とモジュールのドキュメントの調べ方
- よく使用する特殊変数
- よく使用する標準モジュール
数学関数
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引数以降で与えられた文字列が区切り文字で連結されます。
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引数に検索開始位置を指定することができます。
split
区切り文字で文字列を分割するにはsplit関数を使用します。
@ret = split(/,/, $str);
第1引数には区切り文字を正規表現で指定します。第2引数には分割したい文字列を指定します。戻り値は分割された文字列の配列です。
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 引数に与えられた変数のメモリ上のアドレスに変換
クォート演算子「q」
シングルクォートの中でシングルクォートをエスケープしないで使用したい場合はクォート演算子を使用します。
q(aaa'bbb)
機能はシングルクォートで囲んだ場合と同じです。変数展開は行われません。
# これと同じ 'aaa\'bbb'
ダブルクォート演算子「qq」
ダブルクォートの中でダブルクォートをエスケープしないで使用したい場合はダブルクォート演算子を使用します。
qq(aaa"bbb)
機能はダブルクォートで囲んだ場合と同じです。変数展開が行われます。
# これと同じ "aaa\"bbb"
3 配列操作
配列の最後の要素番号
配列の最後の要素番号を取得するには$#arrayとします。
$ret = $#array;
splice
配列に対する複数の要素の操作を行うにはsplice関数を使用します。
[A]複数の要素を取り出す
複数の要素を取り出すことができます。
@ret = splice(@array, $pos, $size)
第1引数に対象の配列、第2引数に開始位置、第3引数に抜き出したいサイズを指定します。
[B]複数の要素を置換する
複数の要素を置換することができます。
splice(@array, $pos, $size, @items);
第4引数に置き換えたい配列を指定します。
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;
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;
4 ハッシュ操作
each
ハッシュのキーと値のペアを順に取得するにはeach関数を使用します。
($key, $value) = each %hash;
すべてのキーと値のペアを順に処理するためにはwhileループと一緒に使用します。
while (my ($key, $value) = each %hash) { ... }
5 ファイル入出力
open
ファイルをオープンするにはopen関数を使用します。
open(my $fh, "<", $file) or die "Cannot open $file: $!";
ファイルオープンが成功した場合は$fhにファイルハンドルが代入されます。($fhを宣言すると同時にopen関数に渡しています。)
ファイルオープンが失敗した場合のエラー処理は必ず行う必要があります。
[A]オープンモード
よく使用されるオープンモードの一覧です。
読み込み < 書き込み > 追加書き込み >>
ファイル入力演算子
ファイルから1行を読み込むにはファイル入力演算子を使用します。
$line = <$fh>;
通常はwhileループと一緒に使用します。
while (my $line = <$fh>) { ... }
[A]すべての行を配列に読み込む
すべての行を配列に読み込むにはリストコンテキストでダイヤモンド演算子を使用します。
@lines = <$fh>;
6 ファイル・ディレクトリ操作
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: $!";
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引数には削除したいディレクトリを指定します。最後の引数にはオプションを指定できます。この例ではエラーの内容を取得するようにしています。
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 時刻・時間
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);
usleep(Time::HiRes)
マイクロ秒単位でスリープするにはTime::HiResモジュールのusleep関数を使用します。
use Time::HiRes 'usleep'; usleep $microsec;
8 その他の重要な関数
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;
evalブロック
例外をキャッチするにはevalブロックを使用します。(例外処理を参照)
eval { 例外が発生する可能性のある処理 }; if ($@) { 例外が発生した場合の処理 }
例外が発生した場合は$@にエラーの内容が設定されます。
__PACKAGE__
現在のパッケージ名は__PACKAGE__で取得することができます。
$ret = __PACKAGE__;
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;
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);
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);
Perl
›
よく使う関数・モジュール