perl

suid が利かなくてはまった

perl スクリプトの中で secure ログを cat するような処理を書いていて、secure ログを cat するには root 権限が必要なので、 その perl スクリプトを suid すればいいよね、と軽く考えていた。 suid はほぼ使う機会が無いので知らなかったのだけど、実はス…

RE:RE:RE: Perl5 の signal 処理と DBI と Q4M

kazuhooku さんにコメント頂いてしまい、恐縮っす。この件、kazuhooku さんのおっしゃることは理解できたと思う。kazuhooku さんの元記事はこれ。 Re: Perl5 の signal 処理と DBI と Q4M - kazuhoのメモ置き場 まず、現象はこう。 シグナルハンドラをセット…

RE:RE: Perl5 の signal 処理と DBI と Q4M

queue_wait() を呼んでいる間って他のことは何もしてないんだから、シグナルハンドラセットする必要ないよね、というのが基本的な考え方です。他のところでシグナルハンドラをセットしているならシグナルハンドラをデフォルト ('DEFAULT') に戻してください…

given-when はやっぱり強力

5.10 からの新構文 given-when はやっぱりなかなか強力。foreach-when とあわせ、使えるところは多そうだ。内容は結構豊富なので書ききれないが・・・。

ファイルテストを積み重ねる

これも 5.10 から。 if (-r $file and -w _) { # read and write とやっていた(_ は読み込み済みのstat を参照)ところを・・・ if (-w -r $file) { # read and write と書けるようになる。評価はファイル名に近い順に行われる。おーこれは地味に便利。

デフォルトを設定する // 演算子

こちらも、5.10 から。defined-or 演算子というらしい。 $a = $b // 1; $b が undef の場合、1 が $a にセットされる。 しかし // とはまた違和感のあるものを・・・。

名前付きキャプチャ

こちらも Perl 5.10 から、ついに、キャプチャが名前付きで指定できるように。 use 5.10.0; my $a = "aaefbbbaacde"; if ($a =~ m/(?<name>.)\g{name}{2}/) { say "match: $&"; say "name: $+{name}"; } 実行すると、 match: bbb name: b上記は、(? で、name とい</name>…

each() のイテレータのリセット方法

each() ってこういうやつである。 while (my ($k, $v) = each %hash) { say $k, $v; } ハッシュはそれぞれイテレータを持っていて、上記のように each() を次々に呼ぶことで違う値が返る。まずこれで問題が起きることは無いと思うが、まれに、while ループ中…

&& と and の違い

今更の話ではあるんだけど、まとめ。Perl では、 && と and と or という同じ意味の演算子が用意されている。 and、or は使わない方がいい、&& と || を使いなさいと教える場合もあるかもしれない。違いは、 「代入と三項演算子より優先順位が高いか低いか」…

正規表現の文字クラスの追加

Perl 5.10 からいくつか便利なものが追加されているが、中でも、\R は便利そう。あらゆる種類の行末文字にヒットする。どのOSを使ってても安心である。 今までからも存在したが、TIPS 的なもの。 \d → 数字 \D → 非数字 [\d\D] → (改行を含む)すべての文字…

正規表現の後方参照の方法

Perl 5.10 から、後方参照の方法が追加された。 use 5.10.0; my $a = "aefbbacde"; if ($a =~ m/(.)\1/) { # 今まではこう say "match $&"; } if ($a =~ m/(.)\g{1}/) { # この書き方も出来るように。 say "match $&"; } \1 の書き方だと、パターンのリテラ…

初めてのPerl 第5版 再読

初めてのPerl 第5版作者: Randal L. Schwartz,Tom Phoenix,brian d foy,近藤嘉雪出版社/メーカー: オライリージャパン発売日: 2009/10/26メディア: 大型本購入: 22人 クリック: 293回この商品を含むブログ (41件) を見るということで、「初めてのPerl」の第5…

undef の意味。

print $a if $a; print $a if defined $a; 上の文と下の文の違いはほとんど無い。一点だけ違うのは、0 もしくは、"0" が $a に設定されていた場合。「if $a」 と書いた場合は、0、"0" は偽と判断されるので、何も表示されない。「if defined $a」と書いた場…

substr() の地味に便利な使い方

my $string = "hello world!"; substr($string, 0, 5) = "Goodbye"; # $string -> "Goodbye world!" 普通はとっさに s/// を使ってやっちゃいそうだが、これ結構使えるとこありそうだ。速度はこっちの方が速かろう。(それを気にするのはよっぽどシビアな状…

state 変数

以下のように使う。プライベートな永続的変数になる。 &countup for(1..10); # 1 から 10 までカウントアップ sub countup { state $num = 0; $num++; say $num; }

Perl でのプロファイル情報の取り方

今回お世話に。本番でパフォーマンスの出ないスクリプトがあったのだが、テスト環境で再現したため、5 分で修正が終わった・・・。 % perl -d:DProf Map.pm % dprofpp ちょっとしたスクリプトであればこれで事足りる。複雑なものであればもうちょっとビジュ…

ハッシュに値が1件でも登録されているか、知りたい場合

追記2009-11-5: 初めてのPerl第5版には、スカラコンテキストでは keys は要素の個数を返すだけでハッシュの全要素にアクセスしたりはしないと書いてある。なので、以下の例なら問題ないはずなんだけど・・・。どーも Perl スクリプトの動作が重ったるい。1…

グローバル変数のローカル化

「Perl ベストプラクティス」より。グローバル変数 $a をローカル化しようとした場合、以下のようにすると、正しく動きそうだが、実際は期待通りの結果にならない。 1 $a = 'aaa'; 2 { 3 warn $a; 4 local $a; 5 6 warn $a; 7 } 8 warn $a; 実行結果は下記:…

DBI のデバッグ

SQL が表示される。 % DBI_TRACE=2 perl script.pl or % DBI_TRACE=2=trace.log perl script.pl 下は trace.log というファイルに出力する例。 便利。 % DBI_PROFILE=2 perl script.pl 簡易なプロファイル表示。なんてのもあるらしい。

一括削除

ほんとは別にこれを探したわけじゃないんだけど、404 Blog Not Found:あわてるな ディスクはそんなに 速くないから辿って、ちょろちょろと見たので、備忘。 以下に示す例は一週間以上前のファイルを効率的に全て消去する方法です。find . -mtime +7 -print |…

直接起動出来ないようにする

Perl にて。 パッケージの中に関数だけを入れたファイルを誰かが直接実行しちゃった場合、無言で終了してしまうため、実行されたのかされてないのか分かりにくい。caller() がスカラコンテキストで false を返した場合、直接実行されていることになるため、…

特殊変数 $^I の使い方

1つのディレクトリに含まれる大量のファイルに対して、一括で変更を行いたい場合 my $target = "*.dat"; @ARGV = glob $target or die; $^I = ".bak"; # これがスイッチ while(<>) { s/(^Date:).*/\1 2009-8-10/; # Date ヘッダを 8/10 にして s/^Phone: .*\…

グロブ

シェルの * の展開と同じことが perl でも出来る。カレントディレクトリのグロブを展開すると以下のような感じ。(join で結合してるだけで、glob 自体は、単なるファイル名のリストを返す) % perl -e "warn join ',', glob '*';" a,b,c,d,do.pl,e at -e li…

stat バッファ

perl でファイルのテスト等を行うと、システムコールが発行されるが、そのstatの結果はバッファに格納される。 そのバッファから値を読み込むためには、"_" ファイルハンドルにアクセスする。例えば、引数に指定されたファイル名のファイルが自分が作成した…

perl には2種類の select がある

詳しくは、 % perldoc -f select 一個目の select は、デフォルトの出力ファイルハンドルを変更するもの。 select MYOUT; print "Hi! My name is Kameid.\n"; select STDOUT; # 標準出力に出力ファイルハンドルを戻す 上記の print は標準出力ではなくて、MY…

ダイヤモンド演算子(<>)の動き

Larry の娘さんが名づけたというダイヤモンド演算子、"<>"。標準入力を受け取るものだと今まで思っていた。実際簡単なスクリプトを書くときには良く使用してもいた。・・・が、実は相当違うものだった。 ==> a <== file a ==> b <== file b ==> c <== file c…

while と foreach の違い

while(<STDIN>) { print; } と foreach (<STDIN>) { print; } の違いをあんまり意識していなかったが、while は、一行ずつこれを解釈し、print するのに対して、foreach はリストコンテキストで使われる。つまり、ループの実行を始める前に、リストの内容をすべて読み込む</stdin></stdin>…

perl には連想配列がもう存在しない

連想配列(associative array)という呼び方は長すぎる!ということで、1995年ごろに変更されたらしい。今はハッシュ(hash) というらしい。・・・いやー、自分でも自然にハッシュといっていたが、まさかこんな昔に変更があったとは。私が Perl を勉強したころ…

mktime と timelocal に速度差がある。

perl スクリプトをちょろちょろと書いていて、Time::Local の timelocal が変に遅いなにこれ遅い、と思って調べてみたところ、POSIX の mktime でも同じことが出来る、とあった。 my $count = 500000; timethese($count, { 'timelocal' => sub { my $today =…

cpan モジュールを CPAN シェル使わないでインストール

全く面倒くさいが、外部との通信が出来ないサーバなんで仕方ない。 Search the CPAN - metacpan.orgより、インストールしたい tar.gz をダウンロード。後の手順はどれも一緒で、 % tar zxvf xxx.tar.gz % cd xxx % perl Makefile.PL % make % make test % su…