読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

カッコを含む文字列を置換するところではまった話と別解とのベンチマーク

すごく長い文字列から、最初にでてきた指定文字を削除したかったのだけど、 その指定文字に開きカッコだけか、閉じカッコだけが入っているとエラーで死んだ。 my $str = q!1qaz2wsx(3edc4rfv5tgb)6yhn7ujm!; my $del = q!4rfv5tgb)6yhn!; $str =~ s/$del//; …

引数が格納される配列@_はローカル変数です

これまでまったく意識したことなかったけれど @_はlocalだと知ったのでメモ。 sub speak { my $w = &_speak_word; # ←引数なし print $w,"\n"; } sub _speak_word { my $type = shift; # ←でも引数が取り出せる if ($type eq 'laugh') { return 'HAHAHA'; } …

最近はandやorより&&や||を使うようにしている

Perlを使い出した頃は「and」や「or」の論理演算子の方が 『「&&」や「||」の記号よりもそのまま単語として読めるからよい!』 みたいなのがどこかに書いてあったのをずっと覚えていて、 実際優先順位も低いから書きやすくて使っていたけれど 最近は「&&」「…

perldoc perlperfに宮本武蔵の言葉があった

... If you want the condensed version, perhaps the best advice comes from the renowned Japanese Samurai, Miyamoto Musashi, who said: "Do Not Engage in Useless Activity" in 1645. 役に立たないことはするな 五輪書 - Wikipedia

最近のPerl WAFをベンチマークした

試したのは以下。 Catalyst -- 元祖WAF Mojolicious -- 軽量WAF Dancer -- 軽量WAF Amon2 -- シンプルWAF Amon2::Lite Amon2(Flavor::Minimum) Kossy -- ISUCONのWAF Web Application Frameworkなので、HTMLの出力を測定。 またテンプレートエンジンにはText…

decode(utf8=>$str)とdecode_utf8($str)のちがい

昨日のエントリで文字化けした件についてもう少し調べてみた。 Devel::Peekで文字化けした文字をダンプしたところ、面白いことがわかった。 UTF-8フラグがついていない文字列のはずなのに、FLAGSの欄に"UTF8"が出ていた。 FLAGS = (PADMY,POK,pPOK,UTF8) # <…

Perl5.8.5から5.14.2にしたら文字化けした話

RHEL4のサポート期間が延長なしだと今日で最後。 Red Hat Enterprise Linux - Wikipedia 標準のPerlのバージョンは5.8.5。 というわけで先日RHEL5にすると同時に5.14.2にしてやるぜ!、と意気込んでperlbrewで入れたら(RHEL5のデフォはPerl5.8.8)、既存のシ…

技術評論社の新刊書籍RSSから元ページを辿ってサムネイル画像を取得する

RSSに配信されたWEB+DB PRESS Vol.67のリンク先が404だったので、scrapeするとcroakしてしまうのをevalした。 初gist。

use utf8しても全角記号は使えない

らしい。 日本語Perl第2課 確かに失敗する。 use utf8; my $数1 = 0; sub 数1に入れる→ { $数1 = $_[0]; } sub 改行 { "\n" } my $数2 = 6; 数1に入れる→ $数2; print $数1, 改行; Illegal declaration of subroutine main::数1に入れる at te.pl l…

perlbrewとrvmその2

Perlのperlbrewのlocal::libと、Rubyのrvmのgemsetを管理する方法の対応関係。 モジュールをインストールするための別空間作り。 perlbrew rvm 作成 $ perlbrew lib create catalyst59007 $ rvm gemset create rails31 既存一覧 $ perlbrew list $ rvm gemse…

perlbrewとrvm

PerlのperlbrewとRubyのrvmでの対応関係メモ。 公式サイト perlbrew http://perlbrew.pl/ rvm http://beginrescueend.com/ インストール perlbrew curl -kL http://install.perlbrew.pl | bash echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bash_profil…

言語のクラス変数は違うはなし

「初めてのRuby(P151)」を読んでいたら以下のような記述があった。 class Foo @@class_variable = 'foo' def print p @@class_variable end end class Bar < Foo p @@class_variable #=> "foo" @@class_variable = 'bar' def print p @@class_variable end e…

@ISAでの継承は読込が要る

会社の後輩に教えていて普通に分からなかったので赤裸々メモ。 わたしって、(ry PerlでのOOのチュートリアルにperlbootとかperltootみていたら同一ファイル内での継承ばかりだったので、分割してみたら、動かなかった。 Animal.pm package Animal; sub speak…

5.8.5での正規表現とクラス名ではまる

メモ。 5.8.5を使用しなければならない中で、簡易なViewクラス作ったら見事に動かなかった。 __PACKAGE__が正規表現内でクラス名にならない いや、正確には取れるんだけど、その中でeオプションで更に評価したらとれない感じ。 正規表現内で正規表現を使う(…

Amon2をCGIで動かした...えっCGI!?

はい、CGIです。 さくらのレンタルサーバースタンダードプランでまだ借りていて、 PerlでちゃんとWebサイトを動かすのにCGIくらいしかないのでまあやってみた。 最近東方の自作アレンジというジャンルがおもしろいなーと思い、公式のタグ検索だけだとどうも…

配列への論理和代入での注意

ちょっと悩んだのでメモ。 あるメソッドにおいて、引数を全部配列に入れる、ただし引数がなかったらデフォルトのリストを配列に入れる、ということをしたかった。 sub my_method { my ($self, @list) = @_; @list ||= @DEFAULT; … } しかしこれはエラーで怒…

wantarrayは伝播する

タイトル通り。 というか今まで意識してなかったけど、試したらそうだったのでメモ。 #!/usr/bin/env perl use strict; use warnings; sub a { return b() } sub b { return c() } sub c { return d() } sub d { return e() } sub e { return wantarray? 1..…

Text::Xslate::Bridge::TT2Likeの改行のやつ

いつのまにかText::Xslate::Bridge::TT2Likeのhtml_line_break()他3つがデフォルトでHTMLエスケープされるようになってた。 もうこんなことしなくていいんだね。やったね。 [% html_line_break(html_escape(report.item1 || "")) %]↓ [% html_line_break(rep…

CGIのベンチマーク

時代に逆らいCGIでのベンチマーク。 さくらレンタルサーバのスタンダードプランでPerlを使うにはCGIの選択肢しかないので、 効率のいい書き方を考えてみる。 その前に素の状態のベンチマークを測ってみた。 さすがに共有サーバでベンチマークをとるのは迷惑…

Apache+Starman+Amon2とApache単体の静的ファイル出力ベンチマーク

メモ。 環境は最後に。 Apache+Starman+Amon2 $ starman --disable-keepalive app/app.psgi$ ab -c 100 -n 1000 http://127.0.0.1/app/static/img/ttt/1/sss/thum.jpg … Document Path: /app/static/img/ttt/1/sss/thum.jpg Document Length: 120369 bytes C…

iMac(Mid 2011)にPerl5.14.1でmod_perl2.0.5を入れたメモ

タイトルのとおり入れてみたので未来の自分用。 $ curl -LO http://perl.apache.org/dist/mod_perl-2.0-current.tar.gz $ tar zxvf mod_perl-2.0-current.tar.gz $ cd mod_perl-2.0.5/apxsを使ってmod_*.soのところに入れてもらう。 $ which apxs /usr/sbin/…

WEB+DB PressのOAuthコードをPerlで書いてみた

WEB+DB PRESS Vol.63作者: 竹迫良範,和田卓人,じゅんいち☆かとう,太田昌吾,小野修司,ミック,嶋田裕二,個々一番,みやけん,清水亮,おにたま,中島聡,角田直行,はまちや2,上谷隆宏,青木俊介,大塚知洋,生尾剛士,大和田純,WEB+DB PRESS編集部出版社/メーカー: 技術…

顔に見える計算式

use strict; use warnings; my $i = 0; # ||||||||||||| my $j = -- $i - $i --; # \ / print "$j\n"; 途中で心折れた。

system()とコマンド入力演算子(逆クオート演算子)の出力

system()と``は似たようなものかと思っていたら、今日唐突にはまったのでメモ。 system()は出力をそのままにしてくれるけど、``は出力結果がreturnされる。 called.pl #!/usr/local/bin/perl print "called!!\n"; caller.pl #!/usr/local/bin/perl print "sy…

MooseのBUILDARGSで

URIオブジェクト作るんだけど、プロパティとしても同じことができないかなんとかしたい。おお、何言ってるのか分からない。 package WWW::ImagePager; use Any::Moose; use URI; has 'basepage' => (is=>'rw', isa=>'URI'); sub BUILDARGS { my ($self, %arg…

mainをnewする

といったことができるか試してみた。 #!/usr/bin/env perl package main; use strict; use warnings; use feature qw/ say /; use Any::Moose; has 'x' => ( is => 'rw', 'isa' => 'Int' ); has 'y' => ( is => 'rw', 'isa' => 'Int' ); no Any::Moose; # ma…

少なくとも4種類入ったパスワードを作成

要件定義 以下の種類が少なくとも1文字は存在するパスワードを作成する。 英大文字 英小文字 数字 記号(!,#,$,%,&,@,?,*,+,-) 実装 MyPassword.pm package MyPassword; use strict; use warnings; my $DEFAULT_PASSWORD_LENGTH = 8; my @c = ('a'..'z'); # l…

ベンチマーク・無限ループと再帰呼び出し

ある条件に満たない場合、それを中でもう一度再帰的に呼ぶのがいいのか、 あるいは最初から無限ループにして、条件が満たされたら脱出するのがいいのか、 分からなかったのでベンチマークしてみた。 ただ、サブルーチン呼び出しのコストは高いとどこかで見た…

namespace::autocleanについて調べた

読んでます。 Perl CPANモジュールガイド作者: 冨田尚樹,タナカユカリ出版社/メーカー: ワークスコーポレーション発売日: 2011/04/08メディア: 単行本(ソフトカバー)購入: 20人 クリック: 2,028回この商品を含むブログ (20件) を見る その中でずっとなんと…

use libについて

lib.pmのPODを読んだメモ。 lib - search.cpan.org @INCに追加する use lib LIST; は、 BEGIN { unshift(@INC, LIST) } とほぼ同じである。 サーチパスである@INCの末尾ではなく、先頭に(unshift)追加される。 もしこの際、 パスを指定しない 存在しないパス…

サブルーチン名に「!」「?」を使えるようにがんばった

昨日の続き。 ソースフィルタを使って作った。 Xubname.pm package Xubname; use strict; use warnings; use Filter::Simple; my %IDENT = ( '?' => __PACKAGE__.'_is_', '!' => __PACKAGE__.'_destroy_or_danger_', ); FILTER_ONLY code => sub { s[ ( sub …

サブルーチン名に「!」「?」を使おうとしてうまくできていない

Rubyでは「!」がつくメソッド名は、破壊的を意味する。「?」がつくメソッド名は、真偽値を返却する。 逆輸入的にPerlでも同じことができないか考えてみた。(CPANなしで考えてみた) なんか…あんまり綺麗じゃないけれどこんな感じでやっつけた。 package Xubna…

配列内要素のシャッフルを考える【図】

.array_explain{border:1px solid #cccccc;border-collapse:collapse;margin:0;} .array_explain th,.array_explain td{border:1px solid #cccccc;} .array_explain td{text-align:center;width:40px;} .array_explain th.dollar_n{background-color:#5555dd…

配列内要素のシャッフルを考える

先にグッドプラクティス。 use List::Util; my @shuffled = shuffle(@array); さてこの中はどのように実装されているのだろうか。 まずシャッフルとは 配列内の要素をランダムに順番を入れ替える(シャッフル)場合、大きく2種類の方法がある。 偏りのあるシャ…

exitを捕捉する

通常は、Youがdeadならdieしちゃいなよ、ということでdie→evalして例外を捕捉する。 が、常識外れのexitで勝手に終わっちゃっているプログラムをなんとかする。 最初はシグナルハンドラというか疑似シグナルでなんとかなるかなーと思っていたけれど、それで…

呼び出し位置によるインクリメント挙動

ファイルを連番に変換するスクリプトを書いていたところ、「001」から始めたかったのに、なぜか「000」から始まっていて警告も出ていなかったのでメモ。 #!/usr/bin/env perl use strict; use warnings; use feature qw/ say /; { my $num = 1; sub closure1…

最近使用Perlモジュール自分まとめ

カテゴリ 多機能|重い|非推奨 軽い テンプレートエンジン Template Text::Xslate WAF Catalyst Mojo WWWアクセス LWP Furl CPAN cpan cpanm OOP Moose Mouse 継承 base parent ORマッパ DBIx::Class DBIx::Skinny|Teng ログ Log::Log4perl Log::Minimal …

サブルーチンリファレンスの実行方法

よく考えたら…よく考えなくても当たり前だったんだけれど、メモ。 my $code_ref = sub { print "実行しました。\n" }; $code_ref->(); &{$code_ref}(); デリファレンスはそういえば2種類あったと思い出した。 「->」で取り出すか、「頭にファニー文字つける…

stdClassをやってみた

PHPのstdClassがシンプルだったので、Perlでやってみた。 PHP first_name = 'Taro'; $obj->family_name = 'Yamada'; print $obj->first_name; //=> Taro print $obj->family_name; //=> Yamada Perl stdClass.pm package stdClass; use strict; use warnings…

for(each)のカッコ省略の謎

CGI::Sessionに以下のコードを見つけた。 Session.pm ... for my $plug qw(driver serializer id) { ... あれ?、このループさせる配列はカッコでくくらないといけないんじゃなかったっけ? for my $plug qw(driver serializer id) { # ↓ for my $plug (qw(d…

XML-RPCの文字列パース

XML-RPC形式で送られてきたレスポンスをパースする。 use LWP::UserAgent; use RPC::XML::Parser; my $url = 'http://localhost/test.cgi'; my $ua = LWP::UserAgent->new; my $res = $ua->post($url); my $parser = RPC::XML::Parser->new; my $xml_rpc = $…

abstract メソッド

Mojo.pmを見ていて、Perlでもabstract(抽象)メソッドとして定義する方法が分かったのでメモ。 まあ厳密には違うのだけれども。 親となるクラス内で、 sub handler { croak 'Method "handler" not implemented in subclass' } このように死ぬだけのサブルーチ…

packageについて3

packageはブロックであり、クラスであるので、クラスにインポートされた関数は他のクラスで使うことはできない。 #!/usr/bin/env perl use strict; use warnings; package Foo; use Digest::MD5 qw/ md5_hex /; package main; print md5_hex('aiueo'), "\n";…

packageについて2

packageとはクラスである。 #!/usr/bin/env perl use strict; use warnings; package X; sub new { bless {}, $_[0] } sub x { print "x\n" } package Y; use base 'X'; sub y { print "y\n" } package Z; use base 'Y'; sub z { print "z\n" } package main…

packageについて1

packageとはブロックである。 #!/usr/bin/env perl use strict; use warnings; my $main_lex = 'main_lex'; our $main_our = 'main_our'; package Foo; print $main_lex, "\n"; print $main_our, "\n"; __END__ main_lex main_ourpackageとはブロックである…

URIからTitle取得

すごく簡単にHTMLからTitleをとりたい。 rightgo09/URI-Tag · GitHub まだすごく適当だけど晒してしまう。 こんな感じ。 use URI::Tag; my $title = URI::Tag->title('http://google.com'); #=> 'Google' use URI::Tag; my $ut = URI::Tag->new; $ut->uri(UR…

配列内の要素undef自動補完

新しく配列を作成しただけだと、中身はもちろん何もないので要素数0。 use strict; use warnings; my @ary; print scalar(@ary), "\n"; #=> 0 この時に添字[10]には何が入っているかといえば、undefがある。 print $ary[10]; してみると、Use of uninitializ…

クラスのオープン性

Ruby勉強中。その中でRubyにはクラスのオープン性、またはRubyのクラスはオープンクラス、という記述を見つける。 class Animal; end class Yahoo < Animal; end class Yahoo; end # 再オープン p Yahoo.superclass #=> Animal このように既存のクラスに対し…

ハイパー間接オブジェクト記法タイム

perldoc perlobj-Indirect Object Syntax。 また気持ち悪い書き方を覚えてしまったぜ・・・。 use strict; use warnings; use CGI; my $args = { param1 => 'value1' }; my $q = new CGI$args; #=> typoじゃないよ! my $p1 = param $q('param1'); say $p1; …

マジック1

モジュールの最後につけられる「1;」は別に1じゃなくても何でもよくて、要するにモジュールの最後の評価として true が返ればよい。 package Hoge; ... ... 10-5; とか package Hoge; ... ... "NG"; とか package Hoge; ... ... '0.0'; とかでも問題ない。 …