LoginSignup
6
1

More than 5 years have passed since last update.

Perlの可読性はそんなに悪くない ~ 関数の引数編

Last updated at Posted at 2018-02-19

始めに

最近、周りの人からよく言われます。

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が好きです。

もし何か気づいたこと、気になったことがあれば教えてください!

6
1
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
6
1