Perl

Module::Buildを使ってると勝手にshebangが書き換わる

Module::Build::fix_shebang_line がshebangを #!/usr/bin/perl.exe eval 'exec /usr/bin/perl.exe -S $0 ${1+"$@"}' if 0; # not running under some shell って置き換えてくれるんだけど、もともと #! /usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"…

tiarraのSystem::SendMessage(ControlPort経由)でnick宛に送信するパッチ

どうやらSystem::SendMessageはチャンネル宛にしか送れないらしい。IRC(仕様)もtiarraもNICK宛に送れるので処理が抜けてる気がする。ホントやっつけなんだけど、でっち上げた。 NOTIFY System::SendMessageのChannel部分にカンマ区切りでNICKを指定すると…

tiarraのSystem::SendMessage(ControlPort経由)のログをLog::Channel経由で記録する

tiarraの普通の使い方は「(自分 → tiarra)同マシン → IRCサーバー」なのだと思いますが、主に社内IRCサーバーのログ取り用に「皆 → (IRCサーバー ← tiarra)同マシン」の構成になっており、Log::Channelでログを記録しています。ところが(上記構成が原因…

Re: Time::Piece::MySQL とタイムゾーン - Yet Another Hackadelic

Time::Piece::MySQL とタイムゾーン (訂正あり) - Yet Another Hackadelic Unix timeにタイムゾーンの概念を持ち込むのは気持ち悪いです。 得られたUnix timeに対してタイムゾーンに対応する目的で数値を加算減算してはいけないと思います。 何故ならUnix ti…

colordiffの文字単位版ccdiffを作ったid:yappo++

diffに色付けしたかったけど、colordiffみたいな行単位じゃなくて、文字単位で色付けしたい。 id:yappoのString::Diff - Simple diff to String - metacpan.org使ってccdiff(charactor color diff)というのをでっちあげた。 ってか後から単語単位の方がいい…

月名を月に変換

$mon = { Jan => 0, Feb => 1, Mar => 2, Apr => 3, May => 4, Jun => 5, Jul => 6, Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec => 11, }->{$mon}; ↓ $mon = (index 'JanFebMarAprMayJunJulAugSepOctNovDec', $mon) / 3;

Thunderbirdのabook.mabなどのわけ分からん内容のファイルはFile::Morkを使って復元できる

2011-11-14 バグを見つけたので追記 あー。これ書いたのid:hakobe932だったのね。 File::Morkモジュールのマルチバイト対応 - はこべにっき ♨ - Thunderbirdのabook.mabなどのわけ分からん内容のファイルはFile::Morkを使って復元できる。 ところがFile-Mork…

Template-ToolkitでURI Unescape

URI Escapeするときはuriフィルタ(urlフィルタ)でいいんだけど、その逆のURI Unescapeのやり方が(TT標準内には)見つけられなかった。 のでCGI.pmにやらせてみた。 #! /usr/bin/perl use Template; Template->new->process(\*DATA); __DATA__ [% SET link…

PHPで配列を連想配列に一発変換したい

PHPで"a=1,b=2,c=3"という文字列を連想配列にする場面があった。 Perlで書くとこんな感じ。 $data = "a=1,b=2,c=3"; $r = {split /[,=]/, $data}; PHPの場合、検索してみてもどうも一発でできないっぽいんだけど。 $data = 'a=1,b=2,c=3'; foreach (array_ch…

voidコンテキストの使われ方

まあ、PP のモジュールが void context であることを判定につかってるケースってほとんどないんですけどね。 ないですねぇ。自分もそんなの書かないし。ちなみにClass-MOPではlib/Class/MOP/Method/Wrapped.pmでvoidコンテキスト関連の処理が書かれてますね…

動的パッチは一つのモジュールにまとめてuseした方が良いかも

言語的に云々という話ではなくて、複数人で開発するときにハマりそうなので(というかハマったので) 動的にパッチを当てるには # gotoするよ版 BEGIN { use UNIVERSAL::require (); if ( Foo->require ) { my $orig = Foo->can('func'); no warnings qw(red…

MANIFEST.SKIPを、最新のもの+自前のものにする

色々書きたいもの溜まってるけど、さっきやったExtUtilsに関する修正を書いてみる。 自前のMANIFEST.SKIPが無い場合、ExtUtils-Manifestに同梱されているものが使われる。で、自前のMANIFEST.SKIPを普通に作ってしまうと、ExtUtils-Manifestの方で更新されて…

Catalyst::Runtimeのバージョンチェックをしているようでしていない件

Catalyst::Helperが出力するMyApp.pmに、 use Catalyst::Runtime '5.70'; ってあるじゃないですか。 あまりHelper使わないから気付かなかったけど、良く見たら文字列になってるんですよね。ってことは、Catalyst::Runtimeバージョン5.70以上を要求してるわけ…

Module-Install-0.86のModule::AutoInstallが壊れてるくさい

Module-Install-0.87が出ました。この件直ってます。 Diff from Module-Install-0.86 to Module-Install-0.87 Module-Install-0.86 - Standalone, extensible Perl module installer - metacpan.orgperl Makefile.PLしたときに、 *** Module::AutoInstall ve…

CPAN封印

CPANPLUSに最大の敬意を示すため、CPANを使わないという信念に沿ったシステム(なんじゃそりゃ)では、 % rm -rf $HOME/.cpan % touch $HOME/.cpan % chmod 0000 $HOME/.cpan として、CPANを封印すると良いでしょう。(最後のchmodは余分だけど、CPANPLUSへ…

Perlから外部コマンドを実行する

最近Perlから外部コマンドを実行する場合は、openやsystemなどを使わずにIPC::Cmdを良く使っている。 特に深い理由はないんだけど、 IPC::Cmdは5.009005からコアモジュールに入っている それなりに綺麗に書ける $IPC::Cmd::VERBOSEを真にしておけば、実行す…

Debian_CPANTS.txtって何だ〜解決篇〜

http://wassr.jp/user/holidaysl/statuses/A1naJAQqnO ってつぶやいた事があるんだけど、犯人はModule/CPANTS/Kwalitee/Distros.pmでした。 こんな感じの t/04kwalitee.t を使ってます。 #! /usr/bin/env perl # # $Id$ # use strict; use warnings; use utf…

DBIx-Class-Schema-Loader-0.04005がインスコできない

テストがエラーになるんだけども、原因はDBIx::Class::ResultSetManagerが消えるからのようです。 http://blog.hide-k.net/archives/2008/10/dbixclassresult_1.phpめんどくせーのでDEVELOPER RELEASE入れてやったぜヒャッハー! % cpanp -i I/IL/ILMARI/DBIx-Clas…

CX::P::E::FastCGI::LighttpdをCPANに上げた

もう1年以上前からになりますが、 lighttpdでファイルが存在しない場合にFastCGI-Catalystへ飛ばす設定とプラグイン - ヒルズで働く@robarioの技ログ このようなプラグインを使っていました。この度(主に自分都合により)このプラグインをCPANに0.0.1として…

PadWalkerという呪文でレキシカル変数を外から見る

Re: http://d.hatena.ne.jp/tokuhirom/20090319/1237428528 PadWalker(PadWalker - play with other peoples' lexical variables - metacpan.org) という呪文でも、こざかしいテクニックを打ち破る事ができます。 コードはこちら。 { package F; use stric…

Catalystのバージョンを上げたら文句言われた。

Catalystのバージョンを5.71にしたらこんなメッセージが出るようになりました。 [warn] Used regexp fallback for $c->model('View::TT'), which found 'MyApp::Web::View::TT=HASH(0x21d44d0)'. Relying on regexp fallback behavior for component resolut…

Re: Shipwrightちょっとだけ使ってみたよ - holidays-l開発ブログ

Shipwrightちょっとだけ使ってみたよ - ヒルズで働く@robarioの技ログ 本当にちょっとだけ使って、その後一切使ってないっす。 コミットされまくるのが嫌だ。

Re: ギークなお姉さんは好きですか 不正なメールアドレスを見抜く正規表現

ギークなお姉さんに初めてのトラックバック。 DTIブログ サービス終了のお知らせ の最後にあるfubaさんのnegative wordsを見て猛烈に最適化してみたくなった。 use utf8; use Regexp::Assemble; binmode STDOUT=>'utf8'; @words = split /\|/, 'ヘルプ|へる…

うっかりScalar::Util::weakenが"Weak references are not implemented"で落ちるのを防ぐ

Scalar::Utilで、"Weak references are not implemented"とかいわれて落ちる問題 - Kentaro Kuribayashi's blog 解決:Scalar::Util::weakenを使おうとするとWeak references are not implementedで落ちる - ヒルズで働く@robarioの技ログ CPAN経由での再イ…

B::Deparseで隠し演算子がどのように解析されたかを見る

Perl の“隠し演算子”ドライバー、テスラ、モンゴル… Kawanet Blog II/ウェブリブログB::Deparseを使えば分かり易いかも? % perl -MO=Deparse -e '!%!' use Errno (); not %!; -e syntax OK なお、perldoc Errnoには "Errno" also makes "%!" magic と書かれ…

CPANモジュールのアンインストール(改良版)

信じられない間違いを犯していましたぁ!!(><) aliasを書き直しました。 もし以前のaliasを持っていたら、見比べてニヤニヤしてくださいヽ(;´Д`)ノ 何かCPANPLUSでdistroprefsが使えない(CPANモジュールのオレオレパッチ - ヒルズで働く@robarioの技ログ)…

CPANモジュールのオレオレパッチ

distroprefs使ってる? 簡単に言うと、cpanの設定の${prefs_dir}/prefsにyamlをゴニョゴニョ書いておけば、cpanコマンドでインスコする時に勝手にパッチ当ててくれたりするやつ。 例えばhttp://d.hatena.ne.jp/tokuhirom/20080630/1214785904のパッチを自前…

Template-ToolkitのWRAPPERを一時的に解除する

{ local $c->view->template->service->{WRAPPER} = []; $c->forward( $c->view ); }

SubversionのプロパティリストをPerlのデータ構造に変換する方法

% svn proplist --verboseで出てくるプロパティリストをPerlのデータ構造に変換しようと思ったんだけど、解析がちょっと面倒くさそう。 じっと見てるとYAMLっぽく見えてきたので、YAML::Syckでやったら割と簡単に変換できました。 #!/usr/bin/env perl # デ…

Re: EmacsでPerl開発する上で必須な設定 #2 - flymake - antipop

EmacsでPerl開発する上で必須な設定 #2 - flymake - Kentaro Kuribayashi's blog Catalystで、C::E::HTTP::Restarterを使ってると、flymakeが作ったFoo_flymake.pmを検出して勝手に再起動しまくるので超困る。 C::E::HTTP::RestarterがFoo_flymake.pmを認識…