読者です 読者をやめる 読者になる 読者になる

togatttiのエンジニアメモ

過度な期待はしないでください。旧麹町で働くエンジニアのメモ帳です。

Perl Beginners#12 に参加してきた

昨日Perlの初心者から〜中級者を対象にしているというPerl Beginnersに 参加してきたので、勉強メモをつらつら、だらだらと残しておく。

ちなみに今回のテーマは"イケてない"と"クール"とだった。

早速、基調講演とLTに分けて、書いていく。

基調講演

  • dokechin: テストでハマったお話

自作のソート関数を書いて、それをテストしたときにハマったこと。 具体的にはTest::Moreのis関数で配列同士を比較しようとしたときに、返り値のgotとexpectedが一致しない。

コードで再現しながら、説明する。

use strict;
use warnings;
use Test::More;

my @my_return = (1, 10, 100);
is(@my_return, (1, 10, 100), 'Each arr are equal');
done_testing();

これは失敗する。

#   Failed test 'Each arr are equal'
#   at test2.pl line 7.
#          got: '3'
#     expected: '100'
# Looks like you failed 1 test of 1.
test2.pl .. Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/1 subtests 

Test Summary Report
-------------------
test2.pl (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
Files=1, Tests=1,  0 wallclock secs ( 0.03 usr  0.00 sys +  0.02 cusr  0.00 csys =  0.05 CPU)
Result: FAIL

失敗する要因はTest::Moreのis関数のソースコードの中を見ると分かる。

  • Test/More.pmから抜粋
sub is ($$;$) {
    my $tb = Test::More->builder;

    return $tb->is_eq(@_);
}

isではプロトタイプが使われている。

上記のプロトタイプについて(簡単に)説明しよう。(何の呪文だよ...昨日初めて知った...)

  • is関数には二つのスカラー変数を引数で与える必要があるという意味。
  • また、スカラーでないもの(配列変数やハッシュ変数など)が渡された場合、スカラー変数として処理する。
  • ちなみにセミコロン以降の記述は第三引数は必須ではないという意味になるらしい。

後プロトタイプはモダンなPerlプログラマはあまり使わないということなので、 意味だけ覚えておくことにする。

話しを戻すと、第一引数、第二引数がスカラー値としてis関数に渡されている。

だから、先ほどのコードは下記と等価だ。

use strict;
use warnings;
use Test::More;

my @my_return = (1, 10, 100);
my $got = @my_return; # => 3 配列変数をスカラー変数に代入すると、配列の要素数を返す。
my $expected = (1, 10, 100); # => 100 リスト値をスカラー変数に代入すると、配列の最後の要素を返す。
is($got, $expected, 'Each arr are equal'); # => 3 != 100
done_testing();

ではどうすればいいのか。

is_deeplyを使おう。

is_deeplyでは、構造を比較してくれる。

use strict;
use warnings;
use Test::More;

my @my_return = (1, 10, 100);
# is_deeplyではリファレンスを渡す。
is_deeply(\@my_return, [1, 10, 100], 'Each arr are equal');
done_testing();

isとis_deeplyの使い分けやプロトタイプとか、リスト値、コンテキストとか一つのテーマで色々学べた気がする。

次はさらっとLTの話し。

LT

  • papix: イケてな"くても"クール"に行こう!

    • 今では有名なPerlモンガーも最初は初心者だったので、今できなくても いづれできるようになるので、心配しなくても大丈夫。
    • 上達するコツは分からないことは分かる人に聞く。
    • 後、発表会とかブログとかアウトプットすることが大事など、スピリッツ的、心構え的な内容。
  • tsucchi: 異常な努力をする前に

    • 何かを実現したいときに、自作のモジュール、関数等でガリガリ用意するよりも、 cpan等で既にモジュールになっているかどうかまず調べて、そっちを使った方が 幸せになれるという話し。セキュリティ面でも安全だし、コスト的にも、、
  • ytnobody: 「べからず」にどう立ち向かうか

発表用スライドがあがってくるとは思うので、しっかり復習しておこう。