ゆきのぶ日記
2008/08/04(Mon)
■ [Perl] Crypt::SSLeay のインストールメモ
WWW::Mechanize で SSL 通信をするときに必要になる Crypt::SSLeay モジュールのインストールメモ。
今回の対象は ActivePerl 5.8.8 Build 820 だったので ppm でインストール。下記のコマンドでうまくいった。
ppm install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd
ssleay32.dll については、特に必要なかった。
Fetch ssleay32.dll? [no] Aborting download of ssleay32.dll.
なお、cmd.exe 上からはすんなり行くけど、cygwin の bash 上からでは下記のエラーとなり、ダメだった。
Can't locate ActivePerl/PPM/limited_inc.pm in @INC
以上、やる度に一から調べている気がするので、ここにメモ。
■ [Perl] 正規表現マッチを一行で
正規表現で文字列を取り出して変数に代入するような時、下のように数行で書いていた。
my $code; if( decode('shiftjis',$mech->content) =~ /code=([\d\w]+)/ ) { $code = $1; }
もっと省略したいと思って色々やってみたが、下のようにすると一行で書けるようだ。カンマ演算子の左結合が ポイント。
my $code = ( decode('shiftjis',$mech->content) =~ /code=([\d\w]+)/, $1 );
しかしこの方法も、リストコンテキストで評価される時にはうまく動かない(下の場合だと、key と value の関係が意図したとおりにならない)。
my $codes = { code1 => ( decode('shiftjis',$mech->content) =~ /code1=([\d\w]+)/, $1 ), code2 => ( decode('shiftjis',$mech->content) =~ /code2=([\d\w]+)/, $1 ), };
こんな時にも、scalar をつけると、意図したように動くようになった。
my $codes = { code1 => scalar ( decode('shiftjis',$mech->content) =~ /code1=([\d\w]+)/, $1 ), code2 => scalar ( decode('shiftjis',$mech->content) =~ /code2=([\d\w]+)/, $1 ), };
いや、やっぱりダメなようだ。あとで考える。
追記
頂いたコメントを参考に、下記のように書いたら、意図したとおりに動くようになった。
my $codes = { code1 => (decode('shiftjis',$mech->content) =~ /code1=([\d\w]+)/)[0], code2 => (decode('shiftjis',$mech->content) =~ /code2=([\d\w]+)/)[0], };
調べてみると、リストコンテキストでパターンマッチを行った場合には、結果がリストとして返されるようだ。 今回はその 0 番目の要素を抽出することで、意図したとおりの動きになった模様。
しかしこの方法も、マッチ対象がなかった場合には、key と value の関係が崩れてしまうようなので、注意し て使いたい。
drry さん、ありがとうございました。
● たっきー [なんか過去のブログ読んでるとワクワクしてきますねー。 思い立ってから実行までが早!さすがプログラマさんです。 関係な..]