Help us understand the problem. What is going on with this article?

Path::Tinyでテキストファイルを扱おう

More than 1 year has passed since last update.

はじめに

みなさんPerl書いてますかー!

今回は、Path::Tinyというモジュールを紹介します。

このモジュールを使うことで・・・

  • テキストファイルの読み書きが簡単に!
  • ファイルの扱いが簡単に!

いろいろできるので試しつつ順に紹介していきます。

長くなりそうなので・・・

今回は、
「テキストファイルの読み書きが簡単に!」の部分をお送りします。

Path::Tiny

http://search.cpan.org/perldoc?Path%3A%3ATiny

入れてない人は、まずいれましょう!

$ cpanm -v Path::Tiny

事前準備

まずテキストファイルをメモ帳とかで適当に作ります。

250cc_SS.txt
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R

今回は、上記の4行のテキストファイルを元に話をしていきます。

ファイル名や内容はなんでも良いです。数行書いといてください。
※この後のコードや実行結果などは適宜読み替えてください
※文字化け(エンコード問題)がややこしい人は、半角英数字で何か書いておくといいです

同じディレクトリにPerlプログラムを書いて、
このテキストファイルを読み書きしていきましょう。

250cc_SS.txt
program.pl

テキストファイルの読み込み

path(ファイルパス)と書くことで「Path::Tinyオブジェクト」が返ってきます。

program.pl
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で改行を挟む

書き込んだテキストファイルを見てみると…

250cc_SS.txt
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);

250cc_SS.txt(実行後)
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);
250cc_SS.txt(実行後)
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");

250cc_SS.txt(実行後)
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);

という書き方も可能です。

まとめ

今回は、テキストファイルの読み書きについて紹介しました。

いままで数行書いてた処理が、
このモジュールでサクッと書けるようになるので便利だと思います。

是非試してみてくださいね!

次回は、続きな感じで
「ファイルの扱いが簡単に!」の部分を書きます。

次回:https://qiita.com/hiro_nico/items/20d435055b8957e7fdac

hiro_nico
見習いエンジニア Go / Perl など勉強中
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした