Upgrade to Pro — share decks privately, control downloads, hide ads and more …

他言語ユーザから見たPerlのおもしろさ / YAPC::Nagoya::Tiny 2019

utagawa kiki
November 03, 2019

他言語ユーザから見たPerlのおもしろさ / YAPC::Nagoya::Tiny 2019

YAPC::Nagoya::Tiny 2019

utagawa kiki

November 03, 2019
Tweet

More Decks by utagawa kiki

Other Decks in Programming

Transcript

  1. コンテキスト my @arr = (20, 30); my $x; $x =

    @arr; # $x == 2 $x = scalar @arr; # $x == 2 ($x) = @arr; # $x == 20 wantarray コンテキストによって評価結果が変わる
  2. ハッシュ my %hash = ( foo => 10, bar =>

    20, ); $hash{foo}; # => 10 ハッシュテーブルとか辞書とか 確かにそれっぽい
  3. ハッシュ? my %hash = ( foo => 10, bar =>

    20, ); my (@a) = %hash; @a; # => ('foo', 10, 'bar', 20) ン?!
  4. ハッシュ?? my @arr = ('foo', 10, 'bar', 20); my %hash

    = @arr; $hash{foo}; # => 10 ハハーン…
  5. 引数受け取り方いろいろ shift $_[0], $_[1] my ($a, $b) = @_ my

    ($arg, %opts) = @_ args my $a => 'Str' 関数の引数情報を静的解析するの難しそう
  6. リファレンス my $matrix = [ [1, 2], [3, 4], ];

    $matrix->[1]->[1] # => 4 2行2列の行列 ⭕これは正しい
  7. そういえばPythonでも matrix = [ [1, 2], [3, 4], ] matrix[1][1]

    # => 4 dic = { 'foo': 1, 'bar': 2, } dic['foo'] # => 1 どちらも参照でしたね
  8. Perlのオブジェクト指向 package Foo; sub new { my ($class, $hoge) =

    @_; bless +{hoge => $hoge}; } sub hoge { shift->{hoge}; } 1; use Foo; my $foo = Foo->new(5); $foo->hoge; # => 5
  9. Try::Tiny use Try::Tiny; my $filename = 'notfound'; try { open

    my $out, $filename or die "Cannot open $filename"; } catch { print STDERR "!!!!!!ERROR!!!!!!!\n"; print STDERR $_; } モダンな例外処理ぽい try,catchっていう関数に ブロック渡してる
  10. Scope::Guard use Scope::Guard; open my $in, '/tmp/hoge'; my $guard =

    guard { close $in }; # do something ... 用が済んだら close $in が呼ばれる
  11. これってあれですよね import "os" func main() { file, err := os.Open("/tmp/hoge")

    if err != nil { panic(err) } defer file.Close() // do something ... }
  12. Scope::Guard use Scope::Guard; open my $in, '/tmp/hoge'; my $guard =

    guard { close $in }; # do something ... $guard は何?
  13. perldoc (日本語訳) my wantarray scalar perldata perlsub perlobj bless use

    require perlref 参考資料 CPAN Scope::Guard Try::Tiny