はじめに
みなさんPerl書いてますかー!
今回は、Path::Tinyというモジュールを紹介します。
このモジュールを使うことで・・・
- テキストファイルの読み書きが簡単に!
- ファイルの扱いが簡単に!
いろいろできるので試しつつ順に紹介していきます。
長くなりそうなので・・・
今回は、
「テキストファイルの読み書きが簡単に!」の部分をお送りします。
Path::Tiny
入れてない人は、まずいれましょう!
$ cpanm -v Path::Tiny
事前準備
まずテキストファイルをメモ帳とかで適当に作ります。
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
今回は、上記の4行のテキストファイルを元に話をしていきます。
ファイル名や内容はなんでも良いです。数行書いといてください。
※この後のコードや実行結果などは適宜読み替えてください
※文字化け(エンコード問題)がややこしい人は、半角英数字で何か書いておくといいです
同じディレクトリにPerlプログラムを書いて、
このテキストファイルを読み書きしていきましょう。
250cc_SS.txt
program.pl
テキストファイルの読み込み
path(ファイルパス)と書くことで「Path::Tinyオブジェクト」が返ってきます。
use Path::Tiny;
# ファイルのPath::Tinyオブジェクトを作る
my $path_obj = path("250cc_SS.txt");
# 1つの文字列として取得したいとき
my $string = $path_obj->slurp;
print $string . "\n"; # 文字列の最後に改行をつけて表示
print "-----\n";
# 配列として取得したいとき
my @lines = $path_obj->lines;
# 1行ずつまわせる
foreach my $line (@lines) {
print $line;
}
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
-----
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
どちらも同じ内容が出力されるはずです!
続いて、テキストファイルの最初と最後の行を取得してみましょう!
use Path::Tiny
my $path_obj = path("250cc_SS.txt");
# 最初の1行を取得
my ($head) = $path_obj->lines({count => 1});
# 最後の1行を取得
my ($tail) = $path_obj->lines({count => -1});
print $head;
print $tail;
1.CBR250RR
4.GSX250R
lines()の中に{count => *}と書くだけ!
最初から2行とりたかったらlines({count => 2})って感じですね!
ちなみに、読み込むついでに改行を削除することもできますよ!
lines({chomp => 1})
use Path::Tiny
my $path_obj = path("250cc_SS.txt");
# 改行を消して配列で取得
my @lines = $path_obj->lines({chomp => 1});
foreach my $line (@lines) {
print $line;
}
1.CBR250RR2.YZF-R253.Ninja2504.GSX250R
改行がなくなって表示されます。
他の文字と組み合わせたりするときとか
処理の邪魔になるときに便利ですね!
ちなみに指定した行数の読み込みと組み合わせることもできますよ!
lines({chomp => 1, lines => 3})
テキストファイルの書き込み
読み込んだら表示するだけでなく、書き込みたいですよね!
use Path::Tiny
my $path_obj = path("250cc_SS.txt");
# 改行を消して読み込み
my @lines = $path_obj->lines({chomp => 1});
# 文字列を配列に追加する
push @lines, "5.CBR250R";
# ファイルに書き込み
$path_obj->spew(join "\n", @lines); # joinで改行を挟む
書き込んだテキストファイルを見てみると…
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
5.CBR250R
5.CBR250Rが追加されました!
配列を結合して1つの文字列として書き込みをしましたが、
配列のまま入れることもできますよ!
use Path::Tiny;
my $path_obj = path("250cc_SS.txt");
my @lines = (
"1.CBR250RR\n", # 改行付き
"2.YZF-R25\n", # 改行付き
"3.Ninja250\n", # 改行付き
"4.GSX250R",
);
# ファイルに書き込み
$path_obj->spew(@lines);
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
改行がないと1行となるので注意です。
(配列1つの要素が1行になるわけではない)
use Path::Tiny;
my $path_obj = path("250cc_SS.txt");
my @lines = (
"1.CBR250RR",
"2.YZF-R25",
"3.Ninja250",
"4.GSX250R",
);
# ファイルに書き込み
$path_obj->spew(@lines);
1.CBR250RR2.YZF-R253.Ninja2504.GSX250R
すでにあるファイルに追加で書き込む方法は、
以下の方法でも可能です。
use Path::Tiny;
my $path_obj = path("250cc_SS.txt");
$path_obj->append("\n"); # 見やすくするために改行を追加
$path_obj->append("5.CBR250R");
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
5.CBR250R
最後に追加されます!
こちらも配列での追加もできます。
別のファイルに保存する
別ファイルに保存したい場合は、もう1個オブジェクトを作りましょう。
use Path::Tiny;
# 一気に配列に読み込む
my @lines = path("250cc_SS.txt")->lines;
# 書き込み先のPath::Tinyオブジェクトを作る
my $dist_file = path("250cc.txt"); # この時点では、まだファイル作成されない
# 書き込み
$dist_file->spew(@lines); # ここでファイル「250cc.txt」が作成される
上記を実行することで別ファイルに同じ内容が出力されます。
path()からいろんな関数を読んでやることで一気にいろいろ処理できます!
もちろん書き込みだって
path("250cc.txt")->spew(@lines);
という書き方も可能です。
まとめ
今回は、テキストファイルの読み書きについて紹介しました。
いままで数行書いてた処理が、
このモジュールでサクッと書けるようになるので便利だと思います。
是非試してみてくださいね!
次回は、続きな感じで
「ファイルの扱いが簡単に!」の部分を書きます。