Hatena::Groupperl

最適事後対応実践所 RSSフィード

2010-07-02

Perl近況

23:09 | はてなブックマーク - Perl近況 - 最適事後対応実践所

XSに片足を突っ込み始めた。

KaylanKaylan2011/06/05 17:53I feel so much hpiaper now I understand all this. Thanks!

yxvhwfyxvhwf2011/06/06 18:367TkqkA <a href="http://vczqxrylwguo.com/">vczqxrylwguo</a>

jfgaxzjfgaxz2011/06/06 23:21YLYH4f , [url=http://fzmsoxvseari.com/]fzmsoxvseari[/url], [link=http://tnrlqhqdlchj.com/]tnrlqhqdlchj[/link], http://phnzptgwiqer.com/

eqlfsgszeqlfsgsz2011/06/06 23:221keSIq , [url=http://jitzasaeitsb.com/]jitzasaeitsb[/url], [link=http://piwyhugunjcb.com/]piwyhugunjcb[/link], http://yzhwxarceget.com/

zwfoaozwfoao2011/06/07 17:57YTBjFn <a href="http://wfmvcvbakhwj.com/">wfmvcvbakhwj</a>

btywvaedmybtywvaedmy2011/06/09 19:18gZNvYU , [url=http://fubrnkibwjjr.com/]fubrnkibwjjr[/url], [link=http://yogfkdfkubli.com/]yogfkdfkubli[/link], http://oqpytjpbhoor.com/

2010-03-25

無題

03:02 | はてなブックマーク - 無題 - 最適事後対応実践所

Perlをまともに触っていた期間が去年の6月の終わりから12月ぐらいなので、俺のPerl歴は半年という感じです。

2010-03-20

PerlのQuizを解いてみた

04:04 | はてなブックマーク - PerlのQuizを解いてみた - 最適事後対応実践所

なんか面白い問題見つけたので解いてみました。


問題

Perl Quiz 2010-03-19 - Quill.to/yoshiki

#XXX を埋めよ(できれば1行)
use strict;
use Data::Dumper;

sub foo {
    my ( $a_ref, $key, $value ) = @_;
    #XXX
    return $a_ref;
}

my $ref = {
    foo => {
        bar => {
            baz  => 1,
        },
    },
};

$ref = foo( $ref, 'foo.bar.baz', 100 );
warn Dumper $ref;

# 結果
# $VAR1 = {
#     'foo' => {
#         'bar' => {
#             'baz' => 100,
#         },
#     },
# }; 

解答

sub foo {
    my ( $a_ref, $key, $value ) = @_;
    #XXX
    $a_ref->{$_[0]}->{$_[1]}->{$_[2]} = $value if (@_ = split /[.]/, $key);
    return $a_ref;
}

簡単でした。

gotoで手動最適化

00:59 | はてなブックマーク - gotoで手動最適化 - 最適事後対応実践所

こんな感じらしい。

#!/usr/bin/perl
use strict;
use warnings;

# 事前に$hogeを宣言しておく必要あり
my $hoge;
$hoge = sub {
    my $foo = shift;

    print "$foo\n";
    if ($foo >= 100) {
        return;
    }

    # 引数を渡せないので直接@_に引数を送り込む
    push @_, ++$foo;
    goto &$hoge;
};

$hoge->(1);
# 循環参照になるので明示的に$hogeをundefにしてやる
undef $hoge;

こうすると確かにDeep recursionにはならない。

末尾再帰最適化するモジュール

15:53 | はてなブックマーク - 末尾再帰最適化するモジュール - 最適事後対応実践所

tokuhiromさんがブクマコメントで指摘されていたモジュールは、Sub::Recursiveのことっぽいですね。

勉強になりました。

2010-03-18

Perlって末尾再帰最適化してるのかな?

00:20 | はてなブックマーク - Perlって末尾再帰最適化してるのかな? - 最適事後対応実践所

【追記】

ブクマのコメントで指摘されているように$numは$startの誤記です。

コード貼り付けてから変数名がキモいと思って変えたのですが変え忘れてました。

恥ずかしい…。


コード自体には意味はないですが少し気になったので。

#!/usr/bin/perl
use strict;
use warnings;

sub fizzbuzz {
    my $start = shift;
    my $end = shift;
    if ($start > $end) {
        return;
    }
    if ($start % 15 == 0) {
        print "FizzBuzz\n";
    }
    elsif ($start % 3 == 0) {
        print "Fizz\n";
    }
    elsif ($start % 5 == 0) {
        print "Buzz\n";
    }
    else {
        print "$start\n";
    }
    fizzbuzz($start + 1, $end);
}

fizzbuzz(1, 100);

これを実行すると途中で

Deep recursion on subroutine "main::fizzbuzz"

って出てくるからたぶん末尾再帰最適化ってされてないのかなと思うんですがどうなんでしょう。