Perl日記

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

2012-01-01から1年間の記事一覧

退職しました

2008年4月に入社したコンピュータ関係の中小企業を昨日退職しました。 かれこれ4年と9ヶ月くらいお世話になりました。 元々僕は文系だったのですが、(卒論はドイツ文学とかだった) 色々あったというか色々なかったというか IT関係の職業に就くことになって…

Perlの世代格差を感じた話

昨日ローカルな勉強会に参加してきた。 初回だったので、簡単なペアプロをすることになったのはいいものの、僕ともうひとかたのペアだけPerlであとのペアはRubyで実装ということになった。イエ-Perlで実装だぜーと思ってたけれど、以下の理由により、いろいろ…

2ch画像スレ風画像ビューア「Gazosure」作った

https://github.com/rightgo09/Gazosureデフォルトで、config/deployment.plに 'BASE_DIRECTORY' => File::Spec->catdir($ENV{'HOME'}, 'Pictures'), ってしてある。Mac用。startupで起動して http://localhost:9091/ にアクセス。こんな感じ。

Perlのいいところについて考えてみた。

変数 シジル(ファニー文字)で大体分かる 特殊変数も例に漏れない $ならスカラ変数 ->ならデリファレンスかメソッド(サブルーチン) @とか[]なら配列 %とか{}ならハッシュ &とか()ならサブルーチン ついてなくて小文字ならサブルーチン 大文字なら定数かファイ…

substrの開始番号

ハマったのでメモ。 Perlのsubstrは substr(文字,開始位置,長さ) の開始位置は0オリジンで、 SQLのsubstrも同じく SUBSTR(文字,開始位置,長さ) と同じ使い方ができるが、1オリジンである。 Perl print substr('string!!!', 2, 1); #=> 'r' SQL -- MySQL SELE…

podは式をぶったぎる(コードは死ぬ)

よくpackageの途中で改行されてるのを見る。 Try::Tiny package # hide from PAUSE Try::Tiny::ScopeGuard; でもこれをpod形式でぶったぎると死ぬ。つまりトークンとトークンの間。 package =pod hide from PAUSE =cut My::Module; Invalid version format (…

どこまで分割する?

「PerlのWebプログラミング効率化のTips」を読んだ感想 - サンプルコードによるPerl入門 http://d.hatena.ne.jp/perlcodesample/20120609/1339246531 短くて再利用性がなく、細かくしてもメリットがないような処理は、処理2のように直接書いてしまっても良い…

()の中に何かいる

一度勉強した覚えがあるけど忘れてたので、プログラミングPerlを参照したメモ。 $x = (7, 7, 7); #=> 7 $x = () = (7, 7, 7); #=> 3 <6/8追記> $x = (7, 7, 7); #=> 3 となっていたのは誤りです! @akajiro thanks! </追記>下はなぜ3なんだろう? プロ…

Amon2にStreaming機能をつけようとした話

PSGIのStreamingなやり方がわかったので、一番触ってたAmon2でもできないかと思ってforkして書いてpull requestまでしてみた。 イメージとしては、 any '/' => sub { my ($c) = @_; $c->render('index.tt'); }; といういつものスタイルを壊さないような感じ…

Perlのバージョン毎のqr//速度

久しぶりにモダパー読み直してたらqr//と文字列の正規表現マッチ速度が出てたので、新しい5.16とかも出てきてるし、やってみた。 Mac OS X 10.7.4 (Intel Core i7) perl-5.8.9 perl-5.10.1 perl-5.12.4 perl-5.14.2 perl-5.16.0 perl-5.17.0 use strict; use…

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

いや渡したんですどね。 サブルーチンプロトタイプ(&)を定義してるサブルーチンに 無名サブルーチンを変数に入れて渡したら怒られたんですよ。 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("…