はじめに
perlでスクリプトを書く際に調べたことを健忘録としてまとめます。
- perlの実行方法
- 引数
- ファイルの入出力
- エラー処理
- 文字列操作
など
目次
perlの実行方法
perl スクリプト名.pl [引数...]
スクリプト名の取得
$0にスクリプト名が格納される
print "$0\n";
コマンドライン引数
コマンドライン引数は@ARGV配列に格納される。
例)引数の取り出し
my $arg1 = $ARGV[0];
my $arg2 = $ARGV[1];
引数の個数のチェック
- 配列を数値(スカラー)として評価すると、その要素数を返す。
文脈(スカラコンテキスト) - die関数はメッセージを出力しPerlスクリプトを終了する。
if (@ARGV < 2) {
die "引数が2つありません\n";
}
変数と配列の宣言
$var #変数
@var #配列
グローバル変数
my $var #変数
our $var #変数 # グローバル変数
ファイルの入力-open関数
ファイルの入力はopen関数を使用する。
書式
open(ファイルハンドル, モード, ファイル)
- ファイルハンドル
ファイルを扱う変数 - モード
読み込み専用など - ファイル
入力ファイル
例)data.datを取り出す
open(my $fh_data, '<', "data.dat");
ファイルの入力のエラー処理
エラー処理はorとdieを組み合わせたor dieを使用する。
例)エラー処理
open(my $fh_data, '<', "data.dat") or die "'data.dat' を開けませんでした: $!";
-
or
処理が成功(真)なら右側は無視し、失敗(偽)なら実行する -
$!
OSからのエラーメッセージが格納される特殊変数
ファイルがない場合:No such file or directory
権限がない場合:Permission deniedなど
ファイルを一行ずつ取り出して処理する
- while文を使用する
-
<ファイルハンドル>とすると一行読み込む - ファイルの終端(EOF)でwhile文が終了する。
while (my $data_line = <$fh_data>) {
print $data_line
}
ファイルを閉じる-close関数
- ファイルを閉じるにはclose関数を使用する。
- open関数で作成したファイルハンドルを指定する。
例)
close($fh_data);
ファイルの出力-open関数
open関数の出力モードにすることで、ファイルの出力をする。
例)カンマ区切りのデータを作成する
open(my $fh, '>', 'data.dat') or die("error :$!");
binmode($fh); # バイナリモードに設定
print $fh "1aaa,bbb,123,date\n";
print $fh "2aaa,\"a,b,c\",123,date\n";
print $fh "3aaa,b',123,date\n";
print $fh "4a\0a,b,123,date\n";
print $fh "5aaa,,123,date\n";
文字列操作
文字列の連結-ドット演算子 (.) 変数展開 join関数
例)ドット演算子 (.)
my $str1 = "aaa";
my $str2 = "20240520";
my $ext3 = ".txt";
my $filename = $str1 . "_" . $str2 . $str3; # aaa_bbb.sql
例)変数展開(ダブルクォート内)
my $str1 = "aaa";
my $str2 = "20240520";
my $ext3 = ".txt";
my $filename = "${str1}_${str2}.${str3}";
例)join関数
my @parts = ("aaa", "20240520", "txt");
my $filename = join("_", @parts); # aaa_20240520_txt
末尾の改行を削除するchomp関数
末尾の改行を削除するにはchomp関数を使用する
例)
chomp($data_line);
文字列の分割split関数
文字列を指定のパターンで分割する。
例)カンマ区切りのデータを分割する
my $line = "a,b,c";
@linelist = split(/,/, $line);
例)カンマ区切りのデータを分割して2個目のデータを取得する。
my $line = "a,b,c";
$var = (split(/,/, $line))[1];
文字列から1文字ずつ取得する
文字列から1文字ずつ取得するにはsplit関数を使用して配列に格納する。
例)
my $str = "Hello"
my @chars = split(//, $str);
foreach my $char (@chars) {
print "$char\n";
}
# 結果
#H
#e
#l
#l
#o
引用符「""」を考慮してデータを分割する quotewords関数
ダブルクォーテーションや区切り文字を考慮して、テキストを行や配列に解析するPerlの標準モジュール
カンマ区切りのデータに"a,b,c"の様なデータがありspritで正しく分割できないときに使用する。
use Text::ParseWords;
my $line = 'aaa,bbb,"ccc,ddd",eee';
my @words = quotewords(',', 0, $line);
# 結果: @words = ('aaa', 'bbb', 'ccc,ddd', 'eee')
日付
日付の取得-strftime関数
例)
use POSIX 'strftime';
my $date = strftime("%Y%m%d", localtime); #YYYMMDD 形式で取得
print $date;
# 結果: 20260506
参考
Perl の公式ドキュメント
https://perldoc.jp/
open関数
https://perldoc.jp/func/open