始めに
最近、周りの人からよく言われます。
Perlってだせぇよな~
帰ってPythonやろうぜ!
その理由の1つが「Perlは可読性が低い」ということらしいのです。
しかし個人的には、書き方によっては読みやすくも読みづらくもなり、それは言語に依存しないはずだと思います。
そこで、そんな悪評を吹き飛ばすために、可読性の高いコードを見てもらおうと考えました。
例: 関数の引数を受け取る場合
可読性が低い例
Perlでは関数の引数は、全てデフォルト配列に格納します。
「デフォルト配列...う、頭が」と思った方は、恐らく@_
を想像していると思います。
print_arg1("text");
sub print_arg1 {
my ($argv1) = @_;
print $argv1;
}
text
正直読みづらいです。
これでは初心者さよならと言われても仕方ありません。
問題点
先ほどのコードの問題点を上げます。
-
@_
という謎の記号 - 配列なのに、なぜかスカラへの代入に配列の要素数ではなく要素を入れている?
2つ目については少し説明します。
Perlでは、配列をスカラに代入しようとすると、配列の要素数を入れます。
my @three_elements = ("first", "second", "third");
my $count = @three_elements;
print $count;
3
ですが、先ほどのコードでは、@_
をスカラに代入しようとしたら、なぜか配列の0番目の要素を入れているように見えます。
print_arg1("text");
sub print_arg1 {
my ($argv1) = @_;
print $argv1;
}
これに関してですが、調べても詳しい説明は出てきませんでした。
仕様として考えるのが妥当かもしれません。
根本的な書き方を間違えてました。
print_arg1("text");
sub print_arg1 {
my $argv1 = @_;
print $argv1;
}
1
my $argv1 = @_
と書くと要素数を入れてしまいますが、my ($argv1) = @_
と書くことで、配列の1番目の要素を$argv1
に入れることができます。
実行結果をちゃんと見ていなかった僕が悪いので、反省の意も込めて残しておきます。
解決策への事前知識
別の道を探りましょう。
PerlにはFIFOを簡単に実行できる組込み関数があります。
shift @args
と書くことで、その戻り値に配列@args
の先頭を渡し、@args
にはその先頭が無くなった配列が残ります。
それを利用して、サブルーチンを見やすくしてみましょう。
sub print_arg1 {
my ($argv1) = @_;
# ...
}
sub print_arg1 {
my $argv1 = shift @_;
# ...
}
更に、Perlではデフォルト変数やデフォルト配列は、明記してする必要がない場合は省略できます。
これでもっと可読性が上がるに違いありません。
結果
print_arg1("text");
sub print_arg1 {
my $argv1 = shift;
print $argv1;
}
text
......
おわりに
僕はそれでもPerlが好きです。
もし何か気づいたこと、気になったことがあれば教えてください!