perl
perlにTime::Pieceという便利なライブラリがありますが、newから作成したオブジェクトとstrftimeから作成したオブジェクトの引き算をすると誤作動するようです。 use Time::Piece; my $now = new Time::Piece(time()); my $now_from_strptime = Time::Piece-…
あるディレクトリ内を再帰的に処理し、その結果を変数の中に詰め込む関数を作ってみました。 sub recursive { my ( $base_dir, $result, $function ) = @_; my( @files ); @files = glob( $base_dir.'/*' ); for my $file_name ( @files ){ if ( -d $file_na…
Perlでオブジェクトのアクセッサを生成するライブラリとしてClass::Accessor::Fastがあります。perldocを読むとfollow_best_practiceとするとset_とget_が使えるようになる、とありますが、これをやると使えなくなる種類のアクセッサもあるようです。 そこで…
perlのコードで、下記のようにsetterを変換する必要に迫られました。 # このsetterを set_hoge('value'); # こう変換 set('hoge','value'); ちなみに、本来は前者の方がBest Practiceなんでそっちに従いたいですが今回は事情があり後者を選択することになっ…
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 …
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の中には元々の変数のコピーが残るようだ。言葉にするとややこしいが、こんな感じ。 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…
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"…
ファイル内の文字列を一斉置換 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…
単なる配列だと普通にやればできるけど、レファレンスの場合はちょっと面倒かな… use Data::Dumper; my $arr1 = [1..3]; my $arr2 = [(@$arr1,@$arr1)]; print Dumper($arr2); # 1,2,3,1,2,3