トップ «前の日記(2008/08/02(Sat)) 最新 次の日記(2008/08/06(Wed))» 編集

ゆきのぶ日記


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 さん、ありがとうございました。

本日のツッコミ(全3件) [ツッコミを入れる]
drry (2008/08/04(Mon) 04:00)

my $codes = { code1 => (decode('shiftjis', $mech->content) =~ /code1=(\w+)/)[0], code2 => (decode('shiftjis', $mech->content) =~ /code2=(\w+)/)[0] };

ゆきのぶ (2008/08/04(Mon) 08:03)

ありがとうございました! 追記しました!

joan (2008/08/04(Mon) 12:48)

my $code = decode('shiftjis',$mech->content) =~ /code=(\w+)/ ? $1 : undef;<br>とかじゃダメでしょうか?<br>ちなみに[\d\w]は\wでいいような気がします。