perl

Router::Simpleいいね

RestなWebアプリケーションでは一意なURLとHTTPメソッドによって処理を行う。そういった目的ではURLとそれに対応する処理へディスパッチするライブラリが開発されている。 CGI環境変数のPATH_INFOとHTTPメソッドを使用するということになるが、煩雑な処理で…

plackの勉強始めました。

plack/PSGIというのが発表されてずいぶん経つけのだけども。 use strict; use warnings; use Plack::Request; use Plack::Response; my $app = sub { my $env = shift; my $req = Plack::Request->new( $env ); my $res = Plack::Response->new(); $res->sta…

幅優先探索 perl版

以下、ソース。 use strict; my ($start,$goal); my @value = (); { my $_board =<<"EOD"; ************************** *S* * * * * * * ************* * * * * ************ * * * * ************** *********** * * ** *********************** * * G * * …

設定ファイルで指定したファイルを添付して送るperlスクリプト

設定ファイルはYAMLで以下のようなもの。 添付ファイル一つ目はUTF-8のテキスト。二つ目はpngの画像という設定。 attachmentが配列なのでどんどん追加していくことができる。 また、オマケとしてファイルパスや指定する添付ファイル名に日付が入っている場合…

今日の勉強メモ

結果表示用関数 sub p{ my ($f,@args) = @_; my @r = ($main::{$f}->(@args)); printf "$f -> %s\n", join(',',@r); } foldlを使って各値を出す sum: リストの合計 max: リストの最大値 min: リストの最小値 length: リストの長さ sub foldl{ my ($f,$init,@…

foldrとfoldlのメモ

foldr,foldlのサンプル foldr (-) 4 [1, 2, 3] -- 1 - (2 - (3 - 4)) == -2 foldl (-) 1 [2, 3, 4] -- ((1 - 2) - 3) - 4 == -8perlで実装 sub foldr{ my ($func,$init,@list) = @_; my ($x,@rest) = @list; return $init unless $x; $func->($x,foldr($func…

ファイルの行数を計測するスクリプトのベンチマーク

't'を1000個ならべたものを1行として 1行のファイル、101行のファイル,201行のファイル、、、1001行のファイルを作成する for(my $n=1;$n<= 1001;$n+= 100){ open my $t,">","text/$n.txt"; $a=0; while($a++ < $n){ print $t 't'x1000; print $t "\n"; } cl…

Linuxでload averageを時系列で可視化するワンライナー

perl -le 'sleep 1 and print "|" x (100 * `cat /proc/loadavg | cut -d " " -f1`) while 1'↑/proc/loadavgを見ればOK while :;do sleep 1; cat /proc/loadavg | cut -d " " -f1 | perl -nle 'print q{|}x($_*100)';done;↑こちらの場合は毎回perlを呼び出し…

今日のはまりどころ。

sub list_process{ my ($name,$list) = @_; if(@$list > 0){ die "no data\n"; }else{ foreach(@{$list || []}){ # 適当な処理を行う } } } my @list = (); # # (このあたりの処理で@listに適当にハッシュを詰めこむ) # my $name = "$list[0]{name}"; ## (1)…

プログラミングOcaml

個人的な勉強なので、決して参考にはしないでくだしあ。なお、ツッコミは大歓迎。とはいえ、人に読んでもらうのを目的にしていないので、ご了承くだされ。※ Ocamlの言語的な問題(型チェックや文法エラーの説明等)は無視。今日は練習問題3.3まで。 use strict…

fizzbuzz ベンチ

perlの関数呼び出しは遅いとのことで、ベンチを取ってみた。 おきにいりの書き方は、関数リファレンスを配列に入れて一つづつ実行してるから、あほほど遅いであろうと予測 ベンチマークスクリプト my $count = 10000; cmpthese($count, { fizzbuzz1=>sub{ my…

ちょい調整fizzbuzz

変数$a,$bが不要になったので削除。 あと、print関数自体が1を返すので、printの後に明示的に1を返していたのも失くした。 my $n = sub{0}; my @fizz = ($n,$n,sub{print 'fizz'}); my @buzz = ($n,$n,$n,$n,sub{print 'buzz'}); my $print_n = sub{print $_…

寝る前に思いついたfizzbuzz改

my $n = sub{0}; my @fizz = ($n,$n,sub{print 'fizz';1}); my @buzz = ($n,$n,$n,$n,sub{print 'buzz';1}); my $print_n = sub{print shift}; my $a = 0; my $b = 0; for(my $i=1;$i<=100;$i++){ ($fizz[$a++ % @fizz]->($i) + $buzz[$b++ % @buzz]->($i)) …

こりずにfizzbuzz

クロージャ化:ループ変数からの独立 パラメータのハッシュ化:'fizz'を'pizz'に変えたいときでも、引数の変更で対応できる。また、2の倍数の時が増えても対応できる sub create_fizzbuzz{ my ($p) = @_; my %count; my $n = 1; return sub{ my $str = ''; f…

perlクロージャででfizzbuzz

ほぼjavascriptと同じやんwww sub create_fizzbuzz{ my ($a,$b) = @_; my $n = 1; return sub{ my $str = ''; if($n % $a==0){$str = 'fizz'} if($n % $b==0){$str .= 'buzz'} $str ||= $n; $n++; return $str; }; }; my $fizzbuzz = create_fizzbuzz(3,5); …

perlでfizzbuzz

$a = 3; $b = 5; print join "\n",map { my $str; if($_ % $a == 0){$str = 'fizz'} if($_ % $b == 0){$str .= 'buzz'} $str || $_; } (1..100); [参考]http://www.machu.jp/diary/20070509.html#p01剰余を使わないで書くのは、パズル的な楽しさが確かにある…

寝る前に思いついたので、fizzbuzz

my @a = (undef,undef,'fizz'); my @b = (undef,undef,undef,undef,'buzz'); my $a = 0; my $b = 0; for(my $i=1;$i<=100;$i++){ my $str = $a[$a++]; $str .= $b[$b++]; $a = 0 if(@a-0 <= $a); $b = 0 if(@b-0 <= $b); print ($str || $i); print "\n"; }

インスタンス変数

package AA; use strict; use warnings; sub new{ bless { var=>'インスタンス変数' },shift; } ↑通常。 package AA; use strict; use warnings; sub new{ my ($class) = @_; my $self = bless {},$class; no strict 'refs'; my $var = 'インスタンス変数'; …

クラス変数

package AA; use strict; use warnings; $AA::var = 'クラス変数' sub new{bless {},shift} (略) ↑パッケージに結びつけてることが一目瞭然。外部からは「$AA::var」でアクセス可能 packge AA; use strict; use warnings; use vars qw(var); $val = 'クラス…

Remedieいいな

RemedieをMacBookにインストールして、ニコ動の実況動画主のマイリストRSSを登録して見てる。 実況動画更新されてたらすぐにわかるし。便利。

組合せ

配列の中から、任意の個数の組合せを取り出す件。 朝から、うーんうーんと唸っていて、googleさんに聞いてみたら、解決策を授けてくださいました。 http://d.hatena.ne.jp/ibaza/20080303/1204476552 より nCr(n個からr個取り出す組合せ)は、 1. リストの…

package Man; use strict; use warnings; sub new{ my ($class,$param) = @_; my $self = bless {param=>$param},$class; } sub name{ my ($self) = @_; return $self->{param}{name} || ""; } sub friends{ my ($self) = @_; return $self->{param}{friends…

Spreadsheet::ParseExcel

仕事で、Excelファイルの内容をHTMLに大量にコピペすることになって辟易してたんだけど、このモジュールとTenjinを使うことで楽しくなってきたw *Tenjin::Context::v = sub{ my ($book_name,$sheet,$cell) = @_; my ($row,$col); if($cell =~ /^([^\d]+)(\d+…

Tenjin

Tenjinというテンプレートエンジンがいい感じ。PHPやERBみたいに文書内にスクリプトを埋め込むことができる。perlでの実装であるplTenjinを使ってる。ヘルパークラスをExporterを継承して定義し、テンプレート内で使用したい関数を@EXPORTに登録しておけば、…

pack

"a"でpackする場合、対象の文字列長が最大文字列長より短かい場合は、最大文字列長まで空白文字列ナル文字(\0)で埋められる。"a"でpackされた文字列を元に戻す場合は"A"を使えば、空白ナル文字で埋められた文字列から空白ナル文字を削除した文字列を取得でき…

ascii value を数値で返す

今さらながらordという関数を知った map {chr($_)} ord('!')..ord('~');

雑記2

テスト用の長い文字列を生成する。 my $length = 100; join '',map {$_ % 10} (0..$length-1) ランダム文字列を生成する srand(); my @char = (a..z,A..Z,0..9); my $length = 24; 方法1 my $random_str = eval((q{$char[int rand(@char)].}x$length).q{""})…

雑記

my @data = ( {prefecture=>'osaka',name=>'fn7'}, {prefecture=>'hyogo',name=>'fn6'}, {prefecture=>'kyoto',name=>'fn5'}, {prefecture=>'hyogo',name=>'fn4'}, {prefecture=>'nara',name=>'fn3'}, {prefecture=>'osaka',name=>'fn2'}, {prefecture=>'kyo…

文字コード関連

use utf8; // スクリプトの文字コードを指定(このスクリプトの保存時の文字コード) binmode STDOUT, ":encoding(eucjp)"; // 出力の文字コードを指定 use Path::Class; my $filename = 'hoge'; my $fh = file($filename)->open('<:encoding(shiftjis)'); # ファイルの文字コードを指定 flock $fh,1; while(<$fh>){ # 行毎の処理 } close $fh;</:encoding(shiftjis)');>

use utf8しているときの文字列のバイト数について

トラックバックいただいた。 ありがとうございました。 http://d.hatena.ne.jp/fbis/20080126/1201320719 バイト列の長さを確実に取得できるし、 一目瞭然だし、unpackでミスする可能性も低くなってよさそう。