3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-14

はじめに

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

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

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

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

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

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

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

Path::Tiny

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

$ 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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?