perl

Time::Pieceのバグ?newからのオブジェクトとstrftimeからのオブジェクトの引き算がおかしい

perlにTime::Pieceという便利なライブラリがありますが、newから作成したオブジェクトとstrftimeから作成したオブジェクトの引き算をすると誤作動するようです。 use Time::Piece; my $now = new Time::Piece(time()); my $now_from_strptime = Time::Piece-…

Perlでディレクトリ内の各ファイルを再帰的に処理する関数

あるディレクトリ内を再帰的に処理し、その結果を変数の中に詰め込む関数を作ってみました。 sub recursive { my ( $base_dir, $result, $function ) = @_; my( @files ); @files = glob( $base_dir.'/*' ); for my $file_name ( @files ){ if ( -d $file_na…

Class::Accessor::Fastにおけるfollow_best_practiceの挙動まとめ

Perlでオブジェクトのアクセッサを生成するライブラリとしてClass::Accessor::Fastがあります。perldocを読むとfollow_best_practiceとするとset_とget_が使えるようになる、とありますが、これをやると使えなくなる種類のアクセッサもあるようです。 そこで…

Perlのワンライナーでシングルクオテーションをエスケープする

perlのコードで、下記のようにsetterを変換する必要に迫られました。 # このsetterを set_hoge('value'); # こう変換 set('hoge','value'); ちなみに、本来は前者の方がBest Practiceなんでそっちに従いたいですが今回は事情があり後者を選択することになっ…

0やundef要素をHashに入れた時の参照方法テスト

Perlは0をundefとしてみなす習慣があるが、Hash Referenceに0,undef,undefという文字列を入れた時に区別するのだろうか?というテスト。結果こうなりました。 my @arr = (undef,0,1); my $hash = +{ $arr[0] => 'a', $arr[1] => 'b', $arr[2] => 'c', undef …

if(変数)をやってみた結果

perlでは負の値や空のレファレンスでもif(変数)でtrueと判断されてしまう。 my $one = 1; my $minus_one = -1; my $only_declare; my %empty_hash = (); my @empty_arr = (); my $empty_hash_ref = +{}; my $empty_array_ref = +[]; print "one\n" if $one; …

hashレファレンス内の変数を初期化すると…

hashレファレンス内の変数を初期化すると、その変数は切り離されてhashの中には元々の変数のコピーが残るようだ。言葉にするとややこしいが、こんな感じ。 use strict; # 空のハッシュを別のハッシュの中に入れる my $inner_hash = +{}; my $outer_hash = +{…

ファイルの中身を一括で読み込む方法

これまでファイルの中身を読み込むとき、下記のように延々とループ回してました。 my $file_name = 'hoge1.txt'; my $str; open $fh, '<', $file_name; while(my $line = readline($fh)){ $str .= $line; } close $fh; print $str; でも、下記のようにすれば…

ブロックスコープを使わずに関数や変数を局所化する方法

Perlではブロックスコープを使用して関数や変数の局所化が可能である。しかし、例えばその結果として出てくる変数がそのブロックの外で必要になる場合、一度それ用の変数をブロック外で宣言してから代入してやる必要がある。 my $hoge; { sub get_one_plus_o…

perlワンライナー集

pmファイルにデバグで入れた$DB::singleを一掃するときのワンライナー find . -type f -name '*.pm' -print0 | xargs -0 perl -i -pe 's/.*DB::single.*\n//g'

ある配列の中に他の配列の要素がまるまる入っているか見るルーチン

ちょっと必要だったんで作りました。 List::Util::firstを使って実装してみました。 use List::Util qw/first/; use Carp; sub includes { my ($tgt,$checker) = @_; confess "tgt not arr ref" unless ref($tgt) eq "ARRAY"; confess "checker not arr ref"…

perl関連ワンライナー集

ファイル内の文字列を一斉置換 find . -type f -name '*.pm' -print0 | xargs -0 perl -i -pe 's/before/after/g' 文字コードの一斉置換。 それぞれEUC-JPとSJISからUTF-8 SJISは波ダッシュ問題回避のためにCP932で指定する。 find . -name '*.pm' | xargs n…

2つの配列レファレンスを結合する

単なる配列だと普通にやればできるけど、レファレンスの場合はちょっと面倒かな… use Data::Dumper; my $arr1 = [1..3]; my $arr2 = [(@$arr1,@$arr1)]; print Dumper($arr2); # 1,2,3,1,2,3