つれづれ日記
ぶいよんブイロク?
GA | G | A / amL | S | おとなり | つれづれ日記 RSS: RDF Site Summary
最新 | 2009年 12月 11月 10月 9月 8月 7月 | もっと前 [ 携帯版 | IPv6版 ]
この日記はよしいまいち コメント

Effective Perl のメモは、たいへんよい 。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2009年06月06日(土) | あめのちくもり | 5/6 | カテゴリ: Perl

正規表現のコメント文は //x;のように すれば、// の間に改行できて、# の後ろにコメントが書ける

正規表現のコメント文は //x; のように すれば、// の間に改行できて、# の後ろにコメントが書ける 。 (?# ... ) でもコメント文になる。しかし、やはり、コメント文の 中に / が入ると、文法エラーになる。

perl -e '$a="abc";$a=~/(a)(?# comment / )bc/;'

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2009年05月11日(月) | はれ | 4/5 | カテゴリ: Perl

use utf8のとき、split()は全角スペースも分割に使う

use utf8のとき、split()は全角スペースも分割に使う 。

#!/usr/bin/perl
use utf8;
binmode STDOUT => ":utf8";	# これがないと警告される
my $str ="全角 ス ペ ー ス が入った テキ\tス\nト";
print join(",", split(/\s/, $str), "\n");

実行結果:

全角,ス,ペ,ー,ス,が入った,テキ,ス,ト,

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年12月19日(金) | はれ | 2/2 | カテゴリ: Perl

WindowsでPerl 5.8/5.10を使うためのファイルI/Oテンプレートソース

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年12月17日(水) | あめ | 5/8 | カテゴリ: Perl

SH706iwと赤外線通信するため、Windows 用のPerlをインストールした

SH706iwと赤外線通信するため、Windows 用のPerlをインストールした 。 Strawberry Perlが新しい印象がしたけれど、Tkがインストールできない。 Windows上でg++を使ってコンパイルするらしいが、Tkにはいろいろ ヘッダやライブラリがあるので、そんなものはTkのソースがないと コンパイルがまったく通らないので無理。

ActivePerlは古いようだが、ちゃんとPerl 5.10.0のWin32バイナリがあるし、 32bitバージョンも64bitバージョンもあって、イチゴよりも強い感じがする。 また、ActivePerlのPPMはGUIが用意されていてたいへんわかりやすい。 また、ActivePerl 5.10.0 build 1004は、標準でTkxという、 簡易なTkが装備されているので、シンプルなUIを使いたいだけなら PPMをいじる必要もない。

しかし、ActivePerlのPPMは簡単なので、使わない手はない。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年12月17日(水) | あめ | 6/8 | カテゴリ: Perl

自宅サーバのマシンを変えて、CGIが軽くなった

自宅サーバのマシンを変えて、CGIが軽くなった 。 当然、CPUクロックが400MHzから900MHzになったのもある。が、 1秒以上かかっていたような処理も、0.5秒未満になったりして、 CPUだけではない要因がある。どうもディスクをフラッシュ化した 効果もあるらしい。今はOS環境がSSDで、webのコンテンツ関係は すべて外部の4GB SDカード上にある。なので、SSDというわけではなく、 SSDよりも遅いフラッシュメモリカード上にデータがある、という 形だ。

Perl の DProf で実行時プロファイルをとって確認してみると、

  • 400MHz PenII + HDD利用のときよりも、全般に処理時間が一桁少なくなっている。
    上の結果も、下の結果も、0.8から1.7秒ぐらいかかっていたもの。
  • Encodeあり、utf8で記述したソース、UTF-8で正規表現多数
  • 上のプロファイルはファイル一つを読み込んで変換するPerlスクリプト
  • 下のプロファイルは複数ファイルを読み込んで抽出するPerlスクリプト
  • Perl Module の BEGIN が重いのは、いつも最初からロードしているから。 しかし、前の環境ではmod_perlを使ってもあまり速くならなかった。
  • utf8::AUTOLOADが10%の時間を使っている
  • Encode, Storableは使わないで済む方法はないものか ...
  • POSIX(mktime)はしかたないか

$ dprofpp
Total Elapsed Time = 0.371562 Seconds
  User+System Time = 0.371562 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 10.7   0.040  0.040      1   0.0400 0.0400  utf8::AUTOLOAD
 8.07   0.030  0.257      6   0.0050 0.0428  main::BEGIN
 5.38   0.020  0.039      6   0.0033 0.0065  Encode::BEGIN
 5.38   0.020  0.059      5   0.0040 0.0118  Storable::BEGIN
 5.38   0.020  0.029      7   0.0028 0.0042  IO::File::BEGIN
 5.38   0.020  0.020     37   0.0005 0.0005  utf8::SWASHNEW
 5.11   0.019  0.095      1   0.0190 0.0951  main::doConvert
 4.84   0.018  0.017    191   0.0001 0.0001  Encode::utf8::decode_xs
 2.69   0.010  0.010      1   0.0100 0.0100  POSIX::AUTOLOAD
 2.69   0.010  0.010      4   0.0025 0.0025  AutoLoader::import
 2.69   0.010  0.010      3   0.0033 0.0033  vars::BEGIN
 2.69   0.010  0.010      3   0.0033 0.0033  Exporter::as_heavy
 2.69   0.010  0.010      3   0.0033 0.0033  POSIX::SigRt::BEGIN
 2.69   0.010  0.010      8   0.0012 0.0012  warnings::import
 2.69   0.010  0.010      2   0.0050 0.0050  main::getEntryParam

$ dprofpp
Total Elapsed Time = 0.414425 Seconds
  User+System Time = 0.334425 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 11.9   0.040  0.040      1   0.0400 0.0400  utf8::AUTOLOAD
 5.98   0.020  0.020      5   0.0040 0.0039  IO::Seekable::BEGIN
 5.98   0.020  0.039      6   0.0033 0.0065  Encode::BEGIN
 5.98   0.020  0.069      5   0.0040 0.0138  Storable::BEGIN
 5.98   0.020  0.039      7   0.0028 0.0056  IO::File::BEGIN
 5.98   0.020  0.059      8   0.0025 0.0073  encoding::BEGIN
 5.98   0.020  0.020     30   0.0007 0.0007  Encode::utf8::encode_xs
 5.98   0.020  0.048      1   0.0198 0.0484  main::doCategoryPage
 5.98   0.020  0.256      6   0.0033 0.0427  main::BEGIN
 2.99   0.010  0.010      1   0.0100 0.0100  POSIX::AUTOLOAD
 2.99   0.010  0.010      4   0.0025 0.0025  AutoLoader::import
 2.99   0.010  0.010      3   0.0033 0.0033  vars::BEGIN
 2.99   0.010  0.010      3   0.0033 0.0033  Exporter::as_heavy
 2.99   0.010  0.010      2   0.0050 0.0049  DynaLoader::BEGIN
 2.99   0.010  0.010      2   0.0050 0.0050  base::import

ということでStorableだけ、使う関数に限定してロードしたところ、 dprofppのトップ15に出ないか、出ても順位が下がった。

Total Elapsed Time = 0.344435 Seconds
  User+System Time = 0.344435 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 14.5   0.050  0.256      6   0.0083 0.0427  main::BEGIN
 11.6   0.040  0.040      1   0.0400 0.0400  utf8::AUTOLOAD
 8.71   0.030  0.059      8   0.0037 0.0073  encoding::BEGIN
 5.81   0.020  0.029      6   0.0033 0.0049  Encode::BEGIN
 5.81   0.020  0.039      7   0.0028 0.0056  IO::File::BEGIN
 5.81   0.020  0.020      7   0.0028 0.0028  POSIX::BEGIN
 5.81   0.020  0.020     29   0.0007 0.0007  Encode::utf8::encode_xs
 5.81   0.020  0.048      1   0.0198 0.0484  main::doCategoryPage
 2.90   0.010  0.010      1   0.0100 0.0100  POSIX::bootstrap
 2.90   0.010  0.010      1   0.0100 0.0100  IO::bootstrap
 2.90   0.010  0.010      5   0.0020 0.0020  vars::import
 2.90   0.010  0.010      3   0.0033 0.0033  Exporter::as_heavy
 2.90   0.010  0.020      5   0.0020 0.0039  IO::Seekable::BEGIN
 2.90   0.010  0.059      5   0.0020 0.0118  Storable::BEGIN
 2.90   0.010  0.060     21   0.0005 0.0028  Exporter::import

不要な関数と、正規表現の宣言を消すと、10msぐらい早くなったかもしれない。 90回ほど、不要な読み込みをしていた関数を、メモリ上にキャッシュ したら、やはりトータルで10msぐらい早くなったかもしれない。 あと、やはり90回ぐらい不要な正規表現による文字列置き換えを 呼ばないようにしたら、やはり10msぐらい早くなったかもしれない。

Total Elapsed Time =   7.7591 Seconds
  User+System Time = 0.519100 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 18.6   0.097  0.302      1   0.0974 0.3019  main::doConvert
 17.1   0.089  0.089    357   0.0002 0.0002  Encode::utf8::encode_xs
 7.71   0.040  0.040     89   0.0004 0.0004  main::parseEntry
 7.51   0.039  0.038    134   0.0003 0.0003  Encode::utf8::decode_xs
 5.78   0.030  0.030     17   0.0018 0.0018  utf8::SWASHNEW
 5.78   0.030  0.039      6   0.0050 0.0066  Encode::BEGIN
 3.85   0.020  0.020      3   0.0067 0.0066  Exporter::as_heavy
 3.85   0.020  0.040      7   0.0028 0.0056  IO::File::BEGIN
 1.93   0.010  0.010      1   0.0100 0.0100  AutoLoader::find_filename
 1.93   0.010  0.010      1   0.0100 0.0100  IO::bootstrap
 1.93   0.010  0.010      2   0.0050 0.0050  Tie::Hash::BEGIN
 1.93   0.010  0.010      8   0.0012 0.0012  warnings::unimport
 1.93   0.010  0.010      8   0.0012 0.0012  warnings::import
 1.93   0.010  0.020      5   0.0020 0.0040  IO::Seekable::BEGIN
 1.93   0.010  0.010     20   0.0005 0.0005  Exporter::import

上の処理は、最初にキャッシュを作る前の処理なので時間がかかっている。 また、キャッシュ前のため、http client端末に対して、生データを 送っているのだが、これが340KBぐらいある。圧縮すると1/10の48KB。 ということもあり、トータルとして遅いかもしれない。 doConvertという関数は450msぐらいあったのが、302msにまでなった (その先で呼び出した関数も含む, CumulS)。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年10月26日(日) | くもり | 2/3 | カテゴリ: Perl Software Hardware

上のような、「漢字の羅列の抽出」も、 PerlのUTF-8対応正規表現だと簡単にできる

上のような、「漢字の羅列の抽出」も、 PerlのUTF-8対応正規表現だと簡単にできる 。

/(?: [^\p{Han}]+ (\p{Han}+) )+ /x

[^\p{Han}]+は、漢字ではない文字の1文字以上の羅列。 \p{Han}+は、漢字(\p{Han})の1文字以上の羅列(+)だ。 後半の(\p{Han}+)の括弧のくくりで、この範囲の 文字列を、正規表現のキャプチャ文字列として返す。 さらに大きな外側の (?: ... ) 括弧では、このカッコ内が 繰り返しパターンとして(+)照合する形になっている。 ここで、+の特徴として、最後に照合して合致した文字列だけを 返すので、最後の漢字の羅列が取り出せる。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年10月08日(水) | あめ | 7/7 | カテゴリ: Perl Regex

久しぶりにperl_moduleを試す

久しぶりにperl_moduleを試す 。httpd内にperlインタープリタが 常駐しているイメージ。そのためメモリを食う。VIRTサイズで、 9MBのところが12MBに。実行時は16MBまで膨らむ。 実際の物理メモリ上のRSSサイズは、2.5MBのところが6MBぐらいになる。 CGIで実行すると、CGIプロセスだけで4MBぐらいあるので、 その分が上乗せされるイメージ。問題は、クロック400MHzというのも あるのか、あまり速くなったように見えないところ。うぐぐ。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年10月02日(木) | はれ | 2/9 | カテゴリ: Perl Web

Perlのコメント文入りの正規表現内では、 コメント文内で / を使うと文法エラーまたは divided by 0

Perlのコメント文入りの正規表現内では、 コメント文内で / を使うと文法エラーまたは divided by 0 。

Perlの正規表現で、/x オプションを指定すると、正規表現内の スペース、タブ、改行は無視され、自由にスペースを入れたり 改行したり、インデントして記述でき、たいへんわかりやすい。 また、# に続けてコメント文も記述でき、これまたたいへん わかりやすい正規表現コーディングが可能になる。

が、正規表現内のコメント文内に / が現れると、 文法エラーになったり、0除算例外になったりするので注意。

0除算例外になる例:

% perl -e '$a="abc";$a=~/(b) #/co
/x;'

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月28日(日) | くもり | 3/9 | カテゴリ: Perl Regex

"man perlre" でGoogle検索したら自分の日記が 先頭候補になってしまった 。げげ。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月28日(日) | くもり | 4/9 | カテゴリ: Perl Regex

日ごろ不思議に思っていることを書いてみる- 04.10.5 正規表現の先頭にある $ マークは

日ごろ不思議に思っていることを書いてみる - 04.10.5 正規表現の先頭にある $ マークは ?

/$\d+\.txt$/

とあるのは、正規表現の最後に /ms オプションがついていればよさそうな気もしたが、

/$\d+\.txt$/ms

やはり正規表現最初の文字が ^ でないと、マッチしない。

/^\d+\.txt$/ms

これなら、マッチする

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月28日(日) | くもり | 5/9 | カテゴリ: Perl Regex

Perlの配列の一部参照で、$array[0 .. 2]は最後の[2]だけ、 @array[0 .. 2]が3要素の配列を返す 。splice()もある。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月28日(日) | くもり | 6/9 | カテゴリ: Perl

Perlでシンボリックリンクの先にあるファイルのファイル名を調べるには、 readlink($filename) する 。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月28日(日) | くもり | 9/9 | カテゴリ: Perl

Perlのuse utf8;tr [A-Za-z0-9] [A-Za-z0-9];できる 。 感動。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月20日(土) | はれ | 1/14 | カテゴリ: Perl Regex

Perl 5.10 の Perl 正規表現の \K について

Perl 5.10 の Perl 正規表現の \K について 。 「このあとの文字列削除 (kill)」みたいな意味なんだろうけれども、 いまいち直観的でないような。もう、かなり言語化してしまって いるので、\{KillAfterHere}とかでいいんじゃない だろうか。man perlreには Keep the left of this operator とあった。$& とかの変数に保管することなく、Keepする ので、コストが低いですよ、ということか。

この一文字オペレータはどこか来た道。あ、sendmail.cf か。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月15日(月) | くもり | 2/8 | カテゴリ: Perl Regex

正規表現のグループ (...)+を使って 同一パターンの繰り返しを全部キャプチャしようとしたけれど よくわからず

正規表現のグループ (...)+ を使って 同一パターンの繰り返しを全部キャプチャしようとしたけれど よくわからず 。split() した。しかし、split() はたくさんの 配列を変えさせると重くなる。かといって小さな split() を 繰り返すと、トータルではもっと遅くなる。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月15日(月) | くもり | 4/8 | カテゴリ: Perl Regex

Net::SMTP::TLSで、$/=undef したまま呼び出すと、 new()したときにハングアップして先に進まなくなる

Net::SMTP::TLSで、$/=undef したまま呼び出すと、 new()したときにハングアップして先に進まなくなる 。 もしかしてselect()とかもあぶないかも。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月15日(月) | くもり | 5/8 | カテゴリ: Perl

Storableのファイルの中身を見るときは読んでDump

Storableのファイルの中身を見るときは読んでDump 。
% perl -MStorable -MData::Dumper \
  -e 'print Dumper(retrieve shift)' \
    cache/category.perfileo

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月15日(月) | くもり | 6/8 | カテゴリ: Perl

Pebug::DProfが表示する大半の関数はBEGINとかutf8::beginとか

Pebug::DProfが表示する大半の関数はBEGINとかutf8::beginとか 。 自分の関数は 2 本しか入っていない。ということは、そういうのを 自分で書いて最適化せよ、ということかな。use utf8 とか :encoding(utf-8) は処理が重いらしい。ファイルの読み書きと 文字列の表示(print) で使っているが、元のファイルの大きさが 30KB で、変換しても45KB 程度なのだけれども。

さすがに、文字コードの変換よりも 何度も繰り返し行っている utf-8の正規表現処理のほうが重い。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月15日(月) | くもり | 8/8 | カテゴリ: Perl

Perlでは、改行を含む文字列の行頭、行末に ^, $でマッチしたいときは /mを使う

Perlでは、改行を含む文字列の行頭、行末に ^, $でマッチしたいときは /m を使う 。

  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • はてなブックマークに追加
  • Livedoorクリップ
  • Yahooブックマーク
| 2008年09月14日(日) | くもり | 1/6 | カテゴリ: Regex Perl
Perlカテゴリ
1ページ >>

お便りはこちらへ (sshida@gmail.com)
見出し一覧は RSS で つれづれ日記 RSS: RDF Site Summary