前回のマッチ位置から処理する
2007-02-09-2 / カテゴリ: [perl][正規表現] / [permlink]
単に繰り返したい場合は
けど、ある正規表現にマッチした場合、その内容によって以降の処理が変化させたい、などのちょっと複雑(?)な場合は、/c /g によって、マッチ箇所を記憶させ、次に \G でその位置を参照できる。
/regexp/g;/g オプションで、繰り返し処理される。
けど、ある正規表現にマッチした場合、その内容によって以降の処理が変化させたい、などのちょっと複雑(?)な場合は、/c /g によって、マッチ箇所を記憶させ、次に \G でその位置を参照できる。
《続きを読む》
エスケープされていないダブルクォート
2007-02-09-1 / カテゴリ: [perl][正規表現] / [permlink]
こんな感じかな。
否定後読みの (?<!\\) がないと、奇数個の逆スラッシュは、偶数個分だけが(?:\\\\)*にマッチしてしまうので NG。
$reg = qr/(?<!\\)(?:\\\\)*\"/;手前に \ がなくて、\\ が0個以上あって " の場合。
否定後読みの (?<!\\) がないと、奇数個の逆スラッシュは、偶数個分だけが(?:\\\\)*にマッチしてしまうので NG。
ActivePerlはワイルドカード&<>が使えん
2006-12-14-2 / カテゴリ: [win][programming][perl] / [permlink]
解析用使い捨てコードを書くときにいつもtypeするテンプレート↓
面倒だけど、引数に正規表現を指定してもらって、内部は opendir/readdir で代替。
と思ったけど、@ARGV をループさせて glob/open すればよさげ。
案外これのほうが、<> の $. で行数が得られない(ひたすら加算される)とこが回避されていいかも。
while (<>) { }普段 cygwin only だから気付かなかったけど、(配布用にコード書いた時に気付いたけど)ActivePerl だとこの構文を使ったソース&次の使い方
> test.pl *.cppが無効ね。
Can't open *.cpp: Invalid argument at C:\Documents and Settings\hmiyazaki\My Documents\prog\perl\test.pl line 4.
面倒だけど、引数に正規表現を指定してもらって、内部は opendir/readdir で代替。
と思ったけど、@ARGV をループさせて glob/open すればよさげ。
foreach my $file (map { glob } @ARGV) { open F, $file or die; while (<F>) { # ここにコード } close F; }
案外これのほうが、<> の $. で行数が得られない(ひたすら加算される)とこが回避されていいかも。
ActivePerlでLF(0x0a)単体の出力
2006-12-14-1 / カテゴリ: [win][programming][perl] / [permlink]
ActivePerlだと、"\n"は当然、"\x0a"でも、出力時に 0x0d が着いちゃうんだよね。
0x0a 単体を出力するには、(UNIX/Linux作業時は半ばおまじないと化していた) binmode を使用する。
ファイルハンドル出力なら
もはや Windows 上での開発(C/C++)のソース解析・修正用にしか使ってないな・・・<Perl
0x0a 単体を出力するには、(UNIX/Linux作業時は半ばおまじないと化していた) binmode を使用する。
binmode STDOUT; print "\n";これで 0x0a 単体。
ファイルハンドル出力なら
open F, "> file.txt" or die; binmode F; print F "\n"; close F;
もはや Windows 上での開発(C/C++)のソース解析・修正用にしか使ってないな・・・<Perl
GD::Barcode::QRcodeでQRコード作成
2006-12-12-1 / カテゴリ: [携帯][win][cygwin][perl] / [permlink]
約1年明けての検証…[2006-01-10-2]
基本
ただし何のオプションも指定しない場合は、デフォルトのQRコードバージョン:1 になり、128bit以上の元データに対して
この状態でエンコードできるデータ量は単純に128/8==16バイトではなく、数値を与えるかasciiを与えるか等で指定可能バイト数が変化する。モジュール内部で対象データを自動判別している模様。
コンストラクタ時にQRコードバージョン・誤り訂正レベル・出力画像サイズが指定できるので、ハッシュのリファレンスでパラメタを与えてやる。
Ecc は誤り訂正レベル
未指定時は M になるっぽい。誤り訂正レベルを上位にすると、符号化できるデータ量は減少する。
Version は QR コードのバージョン
未指定時は1になるっぽい。バージョンをあげると符号化できるデータ量が増加し、画像も細かくなる。バージョン増加に伴い、出力画像のピクセル数も増加する。GD::Barcode::Qrcode では、縦横4ピクセルずつの余白が付加される。
バージョン(n)に対する出力画像の1辺のピクセル数(pixel)は次のよーな感じ。
pixel = 21 + ((n - 1) * 5)
バージョン1で21x21(余白を入れた画像の解像度は29x29)。以降、バージョンを1上げるごとに5ピクセル増加。1から40まで指定可能。
バージョン・誤り訂正レベルの組み合わせによる最大入力サイズはここ。
バージョンを上げると、生成するのにそれなりに負荷がかかる^^;
ModuleSize は出力画像の解像度の指定。余白を含めた画像サイズの倍率になる。未指定時・0指定時は1と同じ。縦横均等。
CGIでブラウザへの出力として使うには、(PNGであれば)HTTPヘッダで "Content-Type: image/png" を吐いて、plot()->png() を出力させれば良い(はず。未確認)。
参考
CPAN: http://search.cpan.org/~kwitknr/GD-Barcode-1.15/Barcode.pm
QRコードの作り方〜バージョンの決定〜: http://www.denso-wave.com/qrcode/qrgene2.html
V603SHのQRコード認識能力はイマイチ。au(BREW3.1)は結構高速…。デコードエンジンのつくりかな…
cpan> install GD::Barcode::QRcode cpan> install GDcygwin環境での GD のビルドには libgd-devel パッケージ(cygwinパッケージ)が必要(gdも?)
基本
use GD::Barcode::QRcode; binmode STDOUT; print GD::Barcode::QRcode->new('foobarbaz')->plot->png;とりあえずこれで、PNGのバイナリが出力される。(結果はリダイレクトする)
ただし何のオプションも指定しない場合は、デフォルトのQRコードバージョン:1 になり、128bit以上の元データに対して
Overflow error. version 1 total bits: 132 max bits: 128とエラーになる(ので使い物にならない)。
この状態でエンコードできるデータ量は単純に128/8==16バイトではなく、数値を与えるかasciiを与えるか等で指定可能バイト数が変化する。モジュール内部で対象データを自動判別している模様。
コンストラクタ時にQRコードバージョン・誤り訂正レベル・出力画像サイズが指定できるので、ハッシュのリファレンスでパラメタを与えてやる。
my $qr = new GD::Barcode::QRcode->new( 'http://www.jp-z.jp/', { Ecc=>'L', Version=>2, ModuleSize=>2} ); print $qr->plot()->png();
Ecc は誤り訂正レベル
レベル | 訂正能力 |
L | 約7% |
M | 約15% |
Q | 約25% |
H | 約30% |
Version は QR コードのバージョン
未指定時は1になるっぽい。バージョンをあげると符号化できるデータ量が増加し、画像も細かくなる。バージョン増加に伴い、出力画像のピクセル数も増加する。GD::Barcode::Qrcode では、縦横4ピクセルずつの余白が付加される。
バージョン(n)に対する出力画像の1辺のピクセル数(pixel)は次のよーな感じ。
pixel = 21 + ((n - 1) * 5)
バージョン1で21x21(余白を入れた画像の解像度は29x29)。以降、バージョンを1上げるごとに5ピクセル増加。1から40まで指定可能。
バージョン・誤り訂正レベルの組み合わせによる最大入力サイズはここ。
バージョンを上げると、生成するのにそれなりに負荷がかかる^^;
ModuleSize は出力画像の解像度の指定。余白を含めた画像サイズの倍率になる。未指定時・0指定時は1と同じ。縦横均等。
CGIでブラウザへの出力として使うには、(PNGであれば)HTTPヘッダで "Content-Type: image/png" を吐いて、plot()->png() を出力させれば良い(はず。未確認)。
参考
CPAN: http://search.cpan.org/~kwitknr/GD-Barcode-1.15/Barcode.pm
QRコードの作り方〜バージョンの決定〜: http://www.denso-wave.com/qrcode/qrgene2.html
V603SHのQRコード認識能力はイマイチ。au(BREW3.1)は結構高速…。デコードエンジンのつくりかな…
Referrer (Inside):
[2007-02-27-1]
ショートネーム・ロングネーム変換
2006-11-15-1 / カテゴリ: [win][perl] / [permlink]
Win32モジュール使用
あまり高速ではないみたいなので、一度に大量(フォルダ内の数千のファイルとか)を変換するときは、"dir /x"の結果を一度ハッシュに取得して、それを変換テーブルとして変換したほうがはるかに速い。
ただし、cygwin がインストール済み、coreutil パッケージがインストール済み、cygwin に$PATHを通している場合は、/bin/dir.exe を実行してしまってwindowsネイティブの"dir /x"が実行できないので、リネームするなどして実行できないようにしておく必要あり。
ひょっとしたら"あまり高速ではない"のは、数千のファイルがあるフォルダで実行したからかもしんない…が、時間がないので未検証…
use Win32; use Cwd; $pwd = cwd(); print $pwd, "\n"; $pwd = Win32::GetShortPathName($pwd); # ショートネーム(8.3形式)に変換 print $pwd, "\n"; $pwd = Win32::GetLongPathName($pwd); # ロングネームに変換 print $pwd, "\n";結果
C:/Documents and Settings/hmiyazaki/My Documents/prog/perl C:/DOCUME~1/HMIYAZ~1/MYDOCU~1/prog/perl C:/Documents and Settings/hmiyazaki/My Documents/prog/perl
あまり高速ではないみたいなので、一度に大量(フォルダ内の数千のファイルとか)を変換するときは、"dir /x"の結果を一度ハッシュに取得して、それを変換テーブルとして変換したほうがはるかに速い。
ただし、cygwin がインストール済み、coreutil パッケージがインストール済み、cygwin に$PATHを通している場合は、/bin/dir.exe を実行してしまってwindowsネイティブの"dir /x"が実行できないので、リネームするなどして実行できないようにしておく必要あり。
ひょっとしたら"あまり高速ではない"のは、数千のファイルがあるフォルダで実行したからかもしんない…が、時間がないので未検証…
日毎のファイルで「続きを読む」(タイトル修正)
2006-07-31-1 / カテゴリ: [perl][programming][changelog][chalow] / [permlink]
(タイトル間違えた… デフォルトの「アイテム毎で続きを読む」を改造、だ)
できた^^;
というか、かなり無理矢理;
できた^^;
というか、かなり無理矢理;
《続きを読む》
DESで暗号化
2006-07-25-2 / カテゴリ: [programming][暗号][perl] / [permlink]
Crypt::DES で。超概略。
暗号化
復号
暗号化
use Crypt::DES; my $data = ...; my $key = ...; my $cipher = Crypt::DES->new($key); my $encdata = $cipher->encrypt($data);
復号
my $encdata = ...; my $key = ...; my $data = $cipher->decrypt($encdata);平文($data)と鍵($key)は8バイトであること。
(数字の)文字列を16進のバイト列とみなして変換
2006-03-14-1 / カテゴリ: [programming][perl] / [permlink]
文字列 "616263640a" を "0x61 0x62 0x63 0x64 0x0a" として処理
きっと,もっとウマい方法があるはず…(/_-)
$str = "616263640a"; $str2 = join "", map { chr oct "0x".$_} ($str =~ /.{2}/g);($str2 は "abcd\n")
きっと,もっとウマい方法があるはず…(/_-)
クリップボード操作
2006-03-08-3 / カテゴリ: [win][perl] / [permlink]
Win32モジュール使用
テキストをセット
テキストのゲット
テキスト以外でもとにかくクリップボードの中をゲット
クリップボードの内容の消去
ターミナルへの表示をマウスでコピペするのが嫌で STDIN をクリップボードにセットするスクリプトを書いたが、cygwin 環境のためか割りと重い…
というか、悲しいくらいデリファレンスの書き方を忘れてる orz
テキストをセット
use Win32::Clipboard; Win32::Clipboard("foo\nbar");または
$clip = Win32::Clipboard(); $clip->Set("foo\nbar");
テキストのゲット
$getstring = $clip->GetText();
テキスト以外でもとにかくクリップボードの中をゲット
$buffer = $clip->Get();
クリップボードの内容の消去
$clip->Empty();
ターミナルへの表示をマウスでコピペするのが嫌で STDIN をクリップボードにセットするスクリプトを書いたが、cygwin 環境のためか割りと重い…
というか、悲しいくらいデリファレンスの書き方を忘れてる orz
Referrer (Inside):
[2010-01-31-1]
ループ制御
2006-02-03-1 / カテゴリ: [c][perl][programming] / [permlink]
ループを抜ける
ループ条件を再評価(次のループ)
あれ、Perl にも continue あったような…
man perlfunc "continue BLOCK"
C にも unless が欲しいな…
break (C) last (Perl)
ループ条件を再評価(次のループ)
continue (C) next (Perl)
あれ、Perl にも continue あったような…
man perlfunc "continue BLOCK"
C にも unless が欲しいな…
printfのフォーマットで桁数を変数指定
2005-11-04-1 / カテゴリ: [programming][perl][c] / [permlink]
* を使う
width を負の数にすれば,左寄せも可.
Perl でもまったくおんなじ
printf("%*d", width, val);で,width で桁数を指定できる.
width を負の数にすれば,左寄せも可.
Perl でもまったくおんなじ
printf("%0*d\n", $width, $val);こっちはゼロ詰指定
Perlプログラミング救命病棟
2005-10-08-1 / カテゴリ: [perl][diary][本] / [permlink]
半月ぶりくらいの休日だ! 明日の結婚式に備えて美容院へ〜
ついでに本屋へ行ってみると、変わったタイトルの本をみつけた。
Perlはごぶさただけど、立ち読みした感じではかなり面白かったのでそのまま購入(笑)
「過去のコードをどう引き継ぐか」というサブタイトルどおり、引き継いだコードのメンテナンスなどの話が載ってて業務で Perl 読み書きするなら読んでためになるかも。
また、新規に作成する場合でも、保守性を高めるための視野が増えてよいかも知んない。
あと2年早く出会いたかったなぁ〜(笑)
これかな http://www.amazon.co.jp/exec/obidos/ASIN/4798109401/249-2487193-7726755
ついでに本屋へ行ってみると、変わったタイトルの本をみつけた。
Perlはごぶさただけど、立ち読みした感じではかなり面白かったのでそのまま購入(笑)
「過去のコードをどう引き継ぐか」というサブタイトルどおり、引き継いだコードのメンテナンスなどの話が載ってて業務で Perl 読み書きするなら読んでためになるかも。
また、新規に作成する場合でも、保守性を高めるための視野が増えてよいかも知んない。
あと2年早く出会いたかったなぁ〜(笑)
これかな http://www.amazon.co.jp/exec/obidos/ASIN/4798109401/249-2487193-7726755
Referrer (Inside):
[2005-10-31-1]
POST されるデータサイズの制限
2005-09-21-1 / カテゴリ: [programming][CGI][perl] / [permlink]
CGI.pm では、$CGI::POST_MAX に値(byte単位)を設定することで、そのサイズを超えた POST データのハンドリングができる。
指定サイズを超えるデータが POST された場合は、cgi_error() にエラーメッセージがセットされるので、
$CGI::POST_MAX = 1024 * 1024 * 5; # 5MB $obj_cgi = new CGI; :CGI を new するより前にセットしないと無効。
指定サイズを超えるデータが POST された場合は、cgi_error() にエラーメッセージがセットされるので、
if ($msg = $obj_cgi->cgi_error) { print "Error: ", $msg, "\n"; exit; }みたいなかんじで。
Perl 5.005 (以下)でファイルハンドルをスカラ変数に保持
2005-08-26-1 / カテゴリ: [programming][perl] / [permlink]
ぺるりめも - ハンドル名を変数に入れる の方法では、undef のスカラ変数を open の引数にしても
で、version 5.005_03 built for sun4-solaris で試した結果、
いいのかな。
で、これだと気持ち悪いので、FileHandle モジュールを使う方法。
Can't use an undefined value as filehandle reference at ./test.pl line 11. Can't use an undefined value as a symbol reference at ./test.pl line 11. (use strict時)で、実行できない。
で、version 5.005_03 built for sun4-solaris で試した結果、
my $fh = "";と、とりあえず空文字にしておけばクリアできた…
いいのかな。
で、これだと気持ち悪いので、FileHandle モジュールを使う方法。
use FileHandle; my $fh; $fh = new FileHandle "sample.txt", "r" or die "cannot open: $!\n"; while (<$fh>) { print; } $fh->close;書式が C 言語っぽい…
プロトタイプを使ってサブルーチンに複数の配列を渡す
2005-08-23-1 / カテゴリ: [programming][perl] / [permlink]
コード
結果
プロトタイプとして \@ を指定することで、配列のリファレンスとして受け取ることを強制できる。
サブルーチン内では結局配列のリファレンスをいじるハメになるけど、呼び出し側は引数を配列のまま渡すことができる。
sub print_a_list(\@\@) { my $list1 = shift; my $list2 = shift; foreach my $a (@$list1) { print "$a\n"; } } @array1 = (1,2,3); @array2 = (4,5,6); print_a_list(@array1, @array2);
結果
% ./test.pl 1 2 3
プロトタイプとして \@ を指定することで、配列のリファレンスとして受け取ることを強制できる。
サブルーチン内では結局配列のリファレンスをいじるハメになるけど、呼び出し側は引数を配列のまま渡すことができる。
Odd number of elements in anonymous hash at xxx line yyy.
2005-08-21-1 / カテゴリ: [debian][perl] / [permlink]
コード書いていたら、warning だけど、そんなメッセージが出た。英単語の vocabulary にはうといんで、とりあえず google につっこむと、Movable Type (Blog??) の導入時エラーで未解決の記事ばっかりヒット。ダメじゃん。
ってことで、
man perl はあるけど(巨大なPerlのマニュアルの目次みたいなモン)、ほかは全然インストールされてないっぽい。
http://www.debian.org/distrib/packages でみると、perl-doc パッケージに含まれるみたいだけど、なにやらすさまじい量のドキュメントがインストールされるっぽいのでパス^^;
なので、エラーメッセージの文意そのもの、、、というより "Odd" の意味を調べる。「奇数」
あぁ、ハッシュ内のリストの要素が奇数っていってるのね…。馬鹿だな>自分
該当コード
まぁ、後々不便なので、perl-doc はインストールしておきませう。
man perldiag(1) より該当部分を引用
えーと、ハッシュのリファレンスのときが↑のメッセージになって、通常のハッシュの場合のメッセージは "Odd number of elements in anonymous hash at xxx.pl line N." と出るみたいね。
2005/08/23 追記
ってことで、
$ man perldiag マニュアル perldiag は登録されていませんって、おい^^;
man perl はあるけど(巨大なPerlのマニュアルの目次みたいなモン)、ほかは全然インストールされてないっぽい。
http://www.debian.org/distrib/packages でみると、perl-doc パッケージに含まれるみたいだけど、なにやらすさまじい量のドキュメントがインストールされるっぽいのでパス^^;
なので、エラーメッセージの文意そのもの、、、というより "Odd" の意味を調べる。「奇数」
あぁ、ハッシュ内のリストの要素が奇数っていってるのね…。馬鹿だな>自分
該当コード
$self->{testCase} = { 0 => plainSent(), 1 => dataIncNull(), };作りかけだったので、plainSent サブルーチンは値を返していたけど、dataIncNull は何も return してなかったのね。
まぁ、後々不便なので、perl-doc はインストールしておきませう。
man perldiag(1) より該当部分を引用
Odd number of elements in anonymous hash (W misc) You specified an odd number of elements to initialize a hash, which is odd, because hashes come in key/value pairs.
えーと、ハッシュのリファレンスのときが↑のメッセージになって、通常のハッシュの場合のメッセージは "Odd number of elements in anonymous hash at xxx.pl line N." と出るみたいね。
2005/08/23 追記
奇数: odd number
偶数: even number
SMTPでNULL(0x00)文字を送信する
2005-08-20-2 / カテゴリ: [programming][perl][SMTP] / [permlink]
MUA(メーラ)や telnet じゃちょっと無理だけど、プログラム書いちゃえば簡単。
Net::SMTP, Mail::Sender, Mail::Sendmail の3つを試したが、どれも送信可能。RFC的にはコントロールコードを含むascii文字を送信して良いと読めるので、MTAは処理しなければならない…と思う。少なくとも、MTA が core 吐いて死んだりとかは NG でしょう。
RFC2821 4.5.2 Transparency より引用
Net::SMTP版
Mail::Sender版
Mail::Sendmail版
Mail::Sender は、デフォルトでは(MIME::QuotedPrintが使えれば)quoted-print エンコードして送信するので、mailcfg{mime} を false に設定する。
Net::SMTP, Mail::Sender, Mail::Sendmail の3つを試したが、どれも送信可能。RFC的にはコントロールコードを含むascii文字を送信して良いと読めるので、MTAは処理しなければならない…と思う。少なくとも、MTA が core 吐いて死んだりとかは NG でしょう。
RFC2821 4.5.2 Transparency より引用
The mail data may contain any of the 128 ASCII characters. All
characters are to be delivered to the recipient's mailbox, including
spaces, vertical and horizontal tabs, and other control characters.
Net::SMTP版
use Net::SMTP; $smtp = Net::SMTP->new("localhost", Debug => 1) or die; $smtp->mail('from@mail.example.org'); $smtp->to('to@mail.example.org'); $smtp->data(); $smtp->datasend("\x1\x0\x1"); $smtp->dataend(); $smtp->quit();
Mail::Sender版
use Mail::Sender; $sender = new Mail::Sender{smtp => 'localhost', from => 'from@mail.example.org'}; $sender->MailMsg({ to => 'to@mail.example.org', msg => "\x1\x0\x1" });
Mail::Sendmail版
use Mail::Sendmail; $Mail::Sendmail::mailcfg{mime} = 0; sendmail( To => 'to@mail.example.org', From => 'from@mail.example.org', Message => "\x1\x0\x1" ) or die $Mail::Sendmail::error;
Mail::Sender は、デフォルトでは(MIME::QuotedPrintが使えれば)quoted-print エンコードして送信するので、mailcfg{mime} を false に設定する。
最終更新時間: 2013-05-02 16:12