Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

Perl

サブルーチンプロトタイプ(&)にしたらサブルーチンを渡せと怒られた

いや渡したんですどね。 サブルーチンプロトタイプ(&)を定義してるサブルーチンに 無名サブルーチンを変数に入れて渡したら怒られたんですよ。 use strict; use warnings; use utf8; sub run(&@) { my ($cb, @list) = @_; @list = map ++$_, @list; $cb->(@l…

shift,shiftの罠

おやと思ったのでメモ。 sub point { my $x = shift; my $y = shift; ... } point(20, 30); #=> $x = 20, $y = 30 これはいい。 sub point { my ($x, $y) = (shift, shift); ... } point(20, 30); #=> $x = 20, $y = 30 これもまだわかる。 sub run { shift-…

なんでもPSGIで考えるのはやめようという話【5/25追記しました】

昔作ったCGIでこんなのがあった。(あの頃は若かった) #!/usr/bin/perl use Furl; my $furl = Furl->new; use CGI; print CGI->header; print "<html>\n"; print "<head>\n"; print "<title>image</title>\n"; print "</head>\n"; print "<body>\n"; for my $i (1..10) { # 画像ファイル名 $image_fi</body></html>…

__PACKAGE__::hoge()は間違い

タイトルで終わった。 __PACKAGE__->hoge()の__PACKAGE__はコンパイラがカレントパッケージ名に置換してくれるけれど、 「::」をつかって完全修飾でサブルーチンを呼ぶと__PACKAGE__::hoge()の左側は「__PACKAGE__」というパッケージ名ととられるのでエラー…

ScanSnapでスキャンしたPDFをページごとに回転する

ScanSnapを使ってコミックスをスキャンしてPDFにしている。 縦に紙をセットするよりも、横にした方がスキャンが早く終わるのでそうしているけれど、 そうするとPDFが横向きになって、向きも表裏でばらばらになる。 ScanSnapを買うとAdobe Reader Professiona…

UNITCHECKと他復習

Perl5.10からBEGIN、CHECK、INIT、ENDの特別ブロックにUNITCHECKが追加されていたのを昨日知ったのでメモ。 あとそのほかまとめ復習。 perlmodにあったのを並び替えてみた。 #!/usr/bin/env perl # use 5.010; # begincheck BEGIN { print " 1. BEGIN blocks…

読み込んだモジュールを全削除するClass::Unload::Allというのを書いてみた

前回の若干続き。 @aloelightさんからClass::Unloadなるものがあることを教えてもらった。 http://search.cpan.org/~ilmari/Class-Unload-0.07/lib/Class/Unload.pm podに use Class::Unload; use Class::Inspector; use Some::Class; Class::Unload->unload…

別の場所で読み込んだモジュールが他でも無条件に使えるのはイヤなところである

まあPerlに限らずなんだけど。 Cacooで画像作ってみた。 ここでB.pmはCに関してまったく無関係のはずなんだけど、実際にはCパッケージの関数を使用できる。 どうも他人の庭の道具を無断使用しているみたいで気持ち悪い。 このへんも完全にスコープ切り分けで…

Text::Hamlの実行コードをキャッシュして高速化した話

Text::Haml - search.cpan.org Perl版HamlのText::Hamlだが毎回$haml->render_fileで 構文解析→出力用package作成→出力用サブルーチン実行 という手順を踏んでいるので、Hamlファイルが大きくなればなるほど、 実行速度がどんどん遅くなっていやだなーと思っ…

ごく一部の頭のいいアホにしか読めない文章のつくりかた

$str =~ tr/TIESAO/713540/; ごく一部の頭のいいアホにしか読めないらしい on Twitpic

コンパイル時にリテラルだと最適化してくれる組み込み関数

length('rightgo09')みたいにすると、コンパイルの時点で9にしてくれていることを知った。 my $len = length('rightgo09'); $ perl -MO=Deparse len.pl my $len = 9; len.pl syntax OK演算結果なんかはしていると聞いてたけど、関数でもなるのかーへーと思っ…

printとstatでつまづいた話

statの挙動なんだっけーと思いつつ以下のようにしたらエラーになった。 $ perl -le 'print (stat("test.pl"))[9]' syntax error at -e line 1, near ")[" え、statは配列を返すからそのスライスってことであってるでしょーと文句を言いたくなったけれど、 右…

Text::Hamlでできること、できないこと

RubyのHamlのつもりでPerlのText::Hamlを使うとつまづいてしまうメモ。 http://search.cpan.org/~vti/Text-Haml-0.990104/lib/Text/Haml.pm インデントは半角スペースのみ インデントにタブは使用できず、常に半角スペースでインデントしないとだめ。 いきな…

Mo.pmを読んだ

こんばんは。 面白そうだったのでMoを読んでみた。 http://search.cpan.org/~ingy/Mo-0.30/lib/Mo.pod Moとは Moose is huge. Moose led to Mouse led to Moo led to Mo. M is nothing. Mo is more. Not much.Moose、Mouse、Mooからできたlessなやつ。 VERSI…

SUPERは@ISAを探ってくれてるわけではない

これが動かなかったので調べたメモ。 strictはなしで。 *{"Foo::aiueo"} = sub { print "aiueo.\n" }; # Fooクラスのaiueoメソッド *{"Bar::new"} = sub { bless {}, "Bar" }; # Barクラスのコンストラクタ push @Bar::ISA, "Foo"; # BarはFooを継承 *{"Bar:…

"package"の代わりに"class"を使うclass.pm作った

再発明かな。 use strict; use warnings; use class; class "Foo" => ( bar => sub { my $self = shift; if (@_) { $self->{bar} = shift; } $self->{bar}; }, ); my $foo = Foo->new(bar => 'baz'); print $foo->bar, "\n"; #=> 'baz' $foo->bar('hoge'); p…

マスタデータを取り扱う

DBに入れるまでもないマスタデータをアプリケーションで取り扱うときの最近やってること。 DBに入れないからといって、設定ファイルには相応しくないデータ。 ハッシュで入れるだけだと、たとえばそのデータでセレクトボックスを作るときに取り出し順が保証…

評価の+は何個つけてもよい

適当にやってたら動いてびっくりしたのでメモ。 よくある評価用の+は無名ハッシュのあれである。 sub foo { +{ bar => 'baz' } } この+は++にしない限り何個でも置ける。 sub foo { + + + + + +{ bar => 'baz' } } ところで、数値の正負を逆にしたいとき…

Teng::Schema::Loaderを使ったらTengオブジェクトが返るので

その後Teng->newする必要なかった。 0.14から0.14_01での変更点みたい。 以下Amon2での使用の例。 MyApp.pm use Teng; use Teng::Schema::Loader; use Test::DB; my $schema; sub db { my $self = shift; if ( !defined $self->{db} ) { my $conf = $self->c…

Digest::SHAはマルチバイト文字列でも大丈夫だけどDigest::MD5だとエラーになる

同じDigest::*だと思ったら大間違いという話。 -MDigest::SHA=sha512_hexだと use Digest::SHA qw/ sha512_hex /; use utf8; use Encode qw/ encode_utf8 /; print sha512_hex("あいうえお"),"\n"; #=> ed8ad6b03b7cb459... print sha512_hex(encode_utf8("…

カッコを含む文字列を置換するところではまった話と別解とのベンチマーク

すごく長い文字列から、最初にでてきた指定文字を削除したかったのだけど、 その指定文字に開きカッコだけか、閉じカッコだけが入っているとエラーで死んだ。 my $str = q!1qaz2wsx(3edc4rfv5tgb)6yhn7ujm!; my $del = q!4rfv5tgb)6yhn!; $str =~ s/$del//; …

引数が格納される配列@_はローカル変数です

これまでまったく意識したことなかったけれど @_はlocalだと知ったのでメモ。 sub speak { my $w = &_speak_word; # ←引数なし print $w,"\n"; } sub _speak_word { my $type = shift; # ←でも引数が取り出せる if ($type eq 'laugh') { return 'HAHAHA'; } …

最近はandやorより&&や||を使うようにしている

Perlを使い出した頃は「and」や「or」の論理演算子の方が 『「&&」や「||」の記号よりもそのまま単語として読めるからよい!』 みたいなのがどこかに書いてあったのをずっと覚えていて、 実際優先順位も低いから書きやすくて使っていたけれど 最近は「&&」「…

perldoc perlperfに宮本武蔵の言葉があった

... If you want the condensed version, perhaps the best advice comes from the renowned Japanese Samurai, Miyamoto Musashi, who said: "Do Not Engage in Useless Activity" in 1645. 役に立たないことはするな 五輪書 - Wikipedia

最近のPerl WAFをベンチマークした

試したのは以下。 Catalyst -- 元祖WAF Mojolicious -- 軽量WAF Dancer -- 軽量WAF Amon2 -- シンプルWAF Amon2::Lite Amon2(Flavor::Minimum) Kossy -- ISUCONのWAF Web Application Frameworkなので、HTMLの出力を測定。 またテンプレートエンジンにはText…

decode(utf8=>$str)とdecode_utf8($str)のちがい

昨日のエントリで文字化けした件についてもう少し調べてみた。 Devel::Peekで文字化けした文字をダンプしたところ、面白いことがわかった。 UTF-8フラグがついていない文字列のはずなのに、FLAGSの欄に"UTF8"が出ていた。 FLAGS = (PADMY,POK,pPOK,UTF8) # <…

Perl5.8.5から5.14.2にしたら文字化けした話

RHEL4のサポート期間が延長なしだと今日で最後。 Red Hat Enterprise Linux - Wikipedia 標準のPerlのバージョンは5.8.5。 というわけで先日RHEL5にすると同時に5.14.2にしてやるぜ!、と意気込んでperlbrewで入れたら(RHEL5のデフォはPerl5.8.8)、既存のシ…

技術評論社の新刊書籍RSSから元ページを辿ってサムネイル画像を取得する

RSSに配信されたWEB+DB PRESS Vol.67のリンク先が404だったので、scrapeするとcroakしてしまうのをevalした。 初gist。

use utf8しても全角記号は使えない

らしい。 日本語Perl第2課 確かに失敗する。 use utf8; my $数1 = 0; sub 数1に入れる→ { $数1 = $_[0]; } sub 改行 { "\n" } my $数2 = 6; 数1に入れる→ $数2; print $数1, 改行; Illegal declaration of subroutine main::数1に入れる at te.pl l…

perlbrewとrvmその2

Perlのperlbrewのlocal::libと、Rubyのrvmのgemsetを管理する方法の対応関係。 モジュールをインストールするための別空間作り。 perlbrew rvm 作成 $ perlbrew lib create catalyst59007 $ rvm gemset create rails31 既存一覧 $ perlbrew list $ rvm gemse…