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

# はじめに

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

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

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

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

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

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

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

# Path::Tiny

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

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

```text
$ cpanm -v Path::Tiny
```

## 事前準備

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

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

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

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

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

```:例
250cc_SS.txt
program.pl
```

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

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

```Perl: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;
}

```

```text:実行結果
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
-----
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
```

どちらも同じ内容が出力されるはずです！

続いて、テキストファイルの最初と最後の行を取得してみましょう！

```perl
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;
```

```text:実行結果
1.CBR250RR
4.GSX250R
```

`lines()`の中に`{count => *}`と書くだけ！

最初から2行とりたかったら`lines({count => 2})`って感じですね！

ちなみに、読み込むついでに改行を削除することもできますよ！
`lines({chomp => 1})`

```perl
use Path::Tiny

my $path_obj = path("250cc_SS.txt");

# 改行を消して配列で取得
my @lines = $path_obj->lines({chomp => 1});

foreach my $line (@lines) {
    print $line;
}

```

```text:実行結果
1.CBR250RR2.YZF-R253.Ninja2504.GSX250R
```

改行がなくなって表示されます。

他の文字と組み合わせたりするときとか
処理の邪魔になるときに便利ですね！

ちなみに指定した行数の読み込みと組み合わせることもできますよ！
`lines({chomp => 1, lines => 3})`

## テキストファイルの書き込み

読み込んだら表示するだけでなく、書き込みたいですよね！

```perl
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で改行を挟む

```

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

```text:250cc_SS.txt
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
5.CBR250R
```

`5.CBR250R`が追加されました！

配列を結合して1つの文字列として書き込みをしましたが、
配列のまま入れることもできますよ！

```perl
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);

```
```text:250cc_SS.txt(実行後)
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
```

改行がないと1行となるので注意です。
(配列1つの要素が1行になるわけではない)

```perl
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);
```
```text:250cc_SS.txt(実行後)
1.CBR250RR2.YZF-R253.Ninja2504.GSX250R
```

すでにあるファイルに追加で書き込む方法は、
以下の方法でも可能です。

```perl
use Path::Tiny;

my $path_obj = path("250cc_SS.txt");

$path_obj->append("\n");        # 見やすくするために改行を追加
$path_obj->append("5.CBR250R");

```
```text:250cc_SS.txt(実行後)
1.CBR250RR
2.YZF-R25
3.Ninja250
4.GSX250R
5.CBR250R
```

最後に追加されます！
こちらも配列での追加もできます。

## 別のファイルに保存する

別ファイルに保存したい場合は、もう1個オブジェクトを作りましょう。

```perl
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()`からいろんな関数を読んでやることで一気にいろいろ処理できます！

もちろん書き込みだって

```perl
path("250cc.txt")->spew(@lines);
```

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

## まとめ

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

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

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

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

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