sironekotoroの日記

Perl で楽をしたい

Perl入学式 YAPC::2013 の復習 その2

workshop-YAPC-Asia/slide.md at master · perl-entrance-org/workshop-YAPC-Asia · GitHub

引数をハッシュにして受け取る'GetOpt::Long'のところでしばし詰まる。スライドでは、existsを使ってkeyの有無を確認、となっている。

しかし、

use Data::Dumper;
use Getopt::Long qw/:config posix_default no_ignore_case bundling auto_help/;

my %opt;
Getopt::Long::GetOptions(
    "t|time=s"    => \$opt{time},
    "o|orderby=s" => \$opt{orderby},
);

print Dumper %opt;

# $VAR1 = 'orderby';
# $VAR2 = undef;
# $VAR3 = 'time';
# $VAR4 = undef;

この時点でハッシュにkeyが生成されており、値のほうがundefになっている。この場合はkeyの有無を確認するexistsではなく、値の有無を確認するdefinedではないだろうか・・・

use strict;
use warnings;
use Data::Dumper;
use WebService::Simple;
use Getopt::Long qw/:config posix_default no_ignore_case bundling auto_help/;

#引数から複数のパラメータをゲットする
my %opt;
Getopt::Long::GetOptions(
    "t|time=s"    => \$opt{time},
    "o|orderby=s" => \$opt{orderby},
);

# 引数が空だった場合のデフォルト値を設定する
if ( !defined $opt{time} ) {
    $opt{time} = 'all_time';
}

if ( !defined $opt{orderby} ) {
    $opt{orderby} = 'relevance';
}


my $service = WebService::Simple->new(
    base_url        => 'http://gdata.youtube.com/feeds/api/videos',
    response_parser => 'JSON'
);

# 複数のキーワードが設定されたときは+で連結する
my $query = join "+", @ARGV;

print $query;

my $res
    = $service->get( { q => "$query", time => $opt{time}, alt => 'json' } );
my $ref = $res->parse_response();

# タイトル、URI、カテゴリを表示
for my $entry ( @{ $ref->{feed}->{entry} } ) {
    my $url   = $entry->{link}->[0]->{href};
    my $title = $entry->{'media$group'}->{'media$title'}->{'$t'};
    my $category
        = $entry->{'media$group'}->{'media$category'}->[0]->{'label'};
    print "$title\n $category\n $url\n";
}