名前付き引数のお話

自己紹介

絶賛発売中!

「Amon2によるWebアプリケーションの高速開発」が載ってます!

WEB+DB PRESS Vol.72

今日のお題

名前付き引数とは?

こんな関数を作ったことありませんか?

write_thumb( 'foo.jpg', 320, 240, 'bar.jpg' );

名前付き引数とは?

これならどうですか?

use strict;
use warnings;
use Imager;

write_thumb( 'foo.jpg', 320, 240, 'bar.jpg' );

sub write_thumb {
    my ( $dst, $w, $h, $src ) = @_;

    my $image = Imager->new();
    $image->read( file => $src )
        or die $image->errstr;
    my $thumb = $image->scale(
        xpixels => $w, ypixels => $h, type => 'nonprop' );
    $thumb->write( file => $dst )
        or die $thumb->errstr;
}

名前付き引数とは?

こういう風に書きたい場合はどうしたらいいの?

# write_thumb( 'foo.jpg', 320, 240, 'bar.jpg' );
write_thumb(
    dst     => 'foo.jpg',
    width   => 320,
    height  => 240,
    src     => 'bar.jpg'
);

ハッシュで渡す

use strict;
use warnings;
use feature 'say';

test( a => 1, b => 2 );

sub test {
    my %args = @_;
    say $args{a}; # 1
    say $args{b}; # 2
}

ハッシュで渡す

"=>"はコンマ演算子

左側が裸の場合は文字列として扱ってくれる

# aとbを文字列として扱ってくれる
my %args1 = ( a => 1, b => 2 );

# なので、次と同じ
my %args2 = ( "a" => 1, "b" => 2 );
my %args3 = ( "a" ,  1, "b" ,  2 );

ハッシュリファレンスで渡す

use strict;
use warnings;
use feature 'say';

test( {a => 1, b => 2} );

sub test {
    my $args_ref = shift;
    say $args_ref->{a}; # 1
    say $args_ref->{b}; # 2
}

ハッシュリファレンスで渡す

Perlベストプラクティスに載っている方法

こういう場合を考慮しているらしい

# 第2引数はオプションを想定
test( 'hoge', {a => 1, b => 2} );

どっちを使えばいいの?

みなさんはどちらを使ってますか???

どっちを使えばいいの?

どっちにも対応するならこんな感じ?

use strict;
use warnings;
use feature 'say';

test( {a => 1, b => 2} );
test( a => 1, b => 2 );

sub test {
    my $arg_ref = ( ref $_[0] ) ? shift : +{ @_ };
    foreach my $key (keys $arg_ref) {
        say $key . ' => ' . $arg_ref->{$key};
    }
}

Hokkaido.pm Casualのご案内

みたいな感じの内容で開催している、ゆるふわな勉強会を紹介します!!1

Hokkaido.pm Casualのご案内

Hokkaido.pm Casualのご案内

ご静聴、ありがとうございました

/

#