perl

行をランダムシャッフルするワンライナー

そういや昔はメモ代わりにはてなダイアリー使ってたけど最近は長い記事が多いなぁ,とふと思ったので,ちょうど今日使ったTipsがあったのでメモ.データ処理をしているときにsort|uniqというコンボにはよくお世話になる.その後に行毎にランダムシャッフルし…

同じvalueを持つハッシュを生成

my @array = qw(apple orange pine); のような配列が渡された際に, my %hash = ( apple => 1, orange => 1, pine => 1, ); のように同じ値を持つハッシュを生成したい.クックブックにも載ってなかったので頭の体操. ハッシュの初期化はリストで.というイ…

文字列をn文字ずつ分割

以前,split//を使って文字列を一文字ずつ分割という方法を学んだけれど,今度はn文字ずつ分割をしたい. どうやらsplitではできなさそうなので,正規表現を使う. # これでよい my @array = $str =~ /.{2}/g; # 直接スカラーに入れるのであればこうする my …

日本語を一文字ずつ分割する

そういや日本語文字列を分割する方法を知らなかった. split //, $stringで文字ごとに分割できる.utf8フラグがついていないと1byteごと #!/usr/bin/perl use strict; use warnings; use Encode; my $str = 'hogeはbarです'; utf8::decode($str); # utfフラ…

新しく宣言した変数のリファレンスを取得する方法

今まで変数のリファレンスを取得するためには,わざわざリファレンス変数に代入してから使っていた. こうすれば変数宣言と同時にリファレンスを取得できるみたい. \ my %hash; 確認プログラム my $hoge_ref = \ my %hoge; %hoge = (yamada => 1, tanaka =>…

バックトラックでクイズを解いてみた

ようやく時間が取れるようになったのでレイトン教授の問題を解いてみた.1から8の数字を使って,3桁x1桁=4桁が成り立つような組み合わせを見つけるという問題. なんか普通に見つける時間とプログラムする時間が同じくらいかかりそうだったから,プログラム…

バックグラウンドプロセスを立ち上げる方法

評価実験用にCGIを作っていて,処理がかかるプロセスの場合,時間オーバーでCGI自体がエラーを返してしまう.また,ずーっと読み込みに時間がかかるのは反応がなくて心配になる.というわけでバックグラウンドでプロセスを立ち上げたい.Perlで別プロセスと…

Encode::Guessではまる

いつものパターン Wide character in print at ...これはUTFフラグがついた文字列をprintしようとしているから.encodeしてあげればよい. use Encode; #これいるのかな?要確認 print encode('utf-8', $string); これは瞬殺.次は見慣れないエラー shiftjis…

ハッシュのスライス

ハッシュにもスライスがあるということを最近知った.使う場面が思いつかないけれど,覚えておこう. 使い方はハッシュ変数のキーの部分にリストを入れるのみ,スライスはリストなのでsigilは@になる.関係ないけれどPerl6からこのsigilが%のままなんだよな…

手作業でslurp

Perl6::Slurpは便利だけれど標準でないモジュールを多用するのは気が引ける.仕方ないので手作業でやろうと思った.ので,これからは手動で書くことにする.しかし,実はslurpに頼りっぱなしで,手動の方法を知らなかった.<>がリストコンテキストとスカラー…

||=を使った代入

なんと||にも省略記法があるということを知った.そういえばどこかで見たPerlコードで||を使ってサブルーチンの引数のデフォルト値を代入している文があったような... $hoge ||= $bar # => $hoge = $hoge || $bar なので$hogeがundef or 0に限り$barを代…

mapについての基礎知識(Schwartz変換のために)

実はずーっとSchwartz変換について知ったかぶりしていた.mapを使えるようになったので,そろそろ解釈してやるかと眺めて違和感. my @names = map $_->[0], sort { $b->[1] <=> $a->[1] } map [ $_, ask_monkey_about($_) ], @castaways; あれ,mapって第一…

mapによるリストの変換

mapのイメージって入力リストの要素数=出力リストの要素数だったのだけれど,別に制限がないらしい.例えば配列からハッシュをつくるときにこんなことだってできる. my %hash = map {$_, $_ * $_} @input_numbers; これは,入力リストの要素をキー,それぞ…

Storableを用いた複雑なデータの保存と復帰

最近になって多重ハッシュをYAMLで吐き出したらデータをそのまま眺めてもよいし,便利じゃね?ということに気がついてYAMLでオブジェクトを保存していた.(ちゃんとbless情報まで保存される,Perl素敵) 容量が大きくなる場合はGDBMやらRDBMSやらを使ってい…

arrayの最後の要素($#)

よく出てくるが,実は$#の意味をわかっていなかったのでメモ.これはarrayの最後の要素のindex numberを取得する. my @array = qw/hoge foo bar/; print $#array; # => 2 配列の大きさは@arrayのスカラーコンテキストで取得できるし,最後の要素は$array[-1…

リストのつくり方(ひねくれ編)

Perl Cookbookより my @list = (<< "EOD" =~ /^\s*(.+)/gm); I sit beside the fire and think of all that I have seen, of meadow-flowers and butterflies and summers that have been; EOD foreach (@list){ print $_ . "\n"; } その発想はなかったわw…

YAMLの読み込みと書き出し,ときどきunbless

2008-01-18 訂正・加筆 簡単だけれど多分忘れるからメモ use YAML; print Dump($hoge_ref); use YAML::Syck; my $hoge_ref = YAML::Syck::LoadFile("hoge.yaml"); # 2008-01-18加筆 # これだけでよい.Syckのほうが高速のはず use YAML::Syck; my $hoge = Lo…

DBIモジュールの構文も忘れた頃に必要になるので,MySQLバージョンのinsert関数をつくってみた.特に面白いものはなし.Emacs-Lispにヒアドキュメントってないのだろうか.

コラッツの問題

パソコン甲子園2007年本選の問題 正の整数に対し, nが偶数のときは2で割る nが奇数のときは3倍して1を足す という操作を繰り返すと結果が1になる. 整数nを入力とし,結果が1になるまで繰り返される操作の回数を出力するプログラムを作成せよ. どうやら1に…

Algorithm::NaiveBayes::Simple実装

いきなり思い立って30分プログラミング(終わってみれば30分どころではなかった).Perlらしいオブジェクト指向で,それなりに綺麗に書けた.ただ,データ保持のところが気に食わない.一番簡単なmultivariate bernoulli modelを実装した(単語が文書に現れ…

GDBM/MLDBM利用時のtie構文について

いつになっても覚えられない.覚えるほど頻繁に使わないし,忘れた頃に使う.昔使ったファイルを参考にする.要するにコピペ.そんなわけでテンプレートを用意することにした.折角なので大分時間が空いたけれどEmacs-lispを使ってインタラクティブ関数を作…

省メモリeach

今までハッシュのキーでループ回すときとか,省メモリにしたい場合は,いちいち keys %hash; while(my $key = shift @keys){ # hogehoge } ということをやってきた.どうも汚いなぁ,と思っていたが,どうやらeachを使えばいいらしい.上記のプログラムと等…

ハッシュを結合する

単語頻度を扱うと,ハッシュを結合したくなる.いちいち自己流ロジックを書いていたけれど,何か良い方法はないものか.図書館から借りてきたPerlクックブックを開いてみた. my %new_hash = (%hash1, %hash2); # これは,以下のようなハッシュの初期化がで…

リストの差分集合

Rubyの場合,-演算子で差分集合を得られるが,Perlにはそういうものがないっぽい.ウェブを軽く調べてもなかった. おそらく以下の事情 普段あまり使わない 使うような玄人はわざわざ日記等に書かない というわけで書いてみた.もっと速く動作し,もっと簡潔…

変形Fizz-Buzz問題

引き続き http://ja.doukaku.org/77/ 一瞬で終わるが,論理否定を取ってしまっているので負け組.達人たちのコードが読めない... まず,mapを使いこなせるようにしないと. コード

あみだくじ

どう書くorgに簡単に解けそうな問題があった. エロと風俗情報満載 どう抜く? splitが思うように動作してくれず,結局s///置換をして,m/./gで一文字ずつ取得した.他人の解答を見て,読み込みながらswapする問題ということに今更気づく. というわけで阿呆…

各桁の数字を取得する

↑の模範解答を読んでいたら.Dan Kogai氏の神がかったソースコードを発見. 各桁の数字を取得するのに,こうすればいいということを今更ながら知る. my $n = 4649 my @d = ( $n =~ /(\d)/g ); print "@d\n" 出力結果: 4 6 4 9 その発想はなかったわww も…

整数のゲーデル数化

どう書く?orgにあった問題 エロと風俗情報満載 どう抜く? 素数判定のアルゴリズムを忘れた(知らない)ので,しらみつぶしに調べる方法を取った.今思えば,3以上の数については奇数でいいので,3以上の数については奇数だけ調べればよいのか.こういうと…

Amazon.co.jpのURLを短くする

誰かに書籍を紹介するときにamazonはとても便利だけど,唯一の不満はURLが長ったらしいこと.ISBN10がわかっていれば簡単なURLにすることができるのは知っていたけれど,もっと短くすることができるということを知った. 誰かやってないかなぁ,と思って3分…

HOPを読み始めた

Higher-Order Perl: Transforming Programs with Programs作者: Mark Jason Dominus出版社/メーカー: Morgan Kaufmann発売日: 2005/03/14メディア: ペーパーバック クリック: 21回この商品を含むブログ (30件) を見る巷でひそかにうわさになっていたので,手…