Perl と Encode と シフトJIS と 機種依存文字
Windows の機種依存文字を処理してハマったので覚え書きです。
Perl で普通にシフトJISを扱う場合、
みたいにするわけだけど、Encode の 'Shift_JIS' の変換ってシフトJISの拡張に当たる機種依存文字には対応してないんですよね。だから「①」とかを decode して encode すると文字化けしちゃうわけですよ。
Windows の機種依存文字を処理してハマったので覚え書きです。
Perl で普通にシフトJISを扱う場合、
みたいにするわけだけど、Encode の 'Shift_JIS' の変換ってシフトJISの拡張に当たる機種依存文字には対応してないんですよね。だから「①」とかを decode して encode すると文字化けしちゃうわけですよ。
ソートなんて普段はDBにさせているので、実はプログラム側でやったことがなかったので、ちょっとメモしておこうかなと(^_^;)。
まずは数値として昇順で並び替え
久しぶりにCPANシェルを使おうとしてたらコマンドをすっかり忘れていたので(^_^;)。
> perl -MCPAN -e shell
そうそう。これですよコレ! でも最近のCPANシェルって、こんな長いコマンドを打たなくても、単純に
> cpan
と入力するだけで起動してくるんだそうです。知りませんでした。つか、便利になったものです。
しかしながら、現実の話をすると、CPANシェルを使う機会って、めっきり減ってるんですよね。
Windows で ActivePerl を使っているなら PPM があるし、Linux系でも yum とかのパッケージ管理システムが使えれば、そちらを使ったほうが実際確実だったりしますから。
しかもピュアPerlなモジュールなら手動で解凍して配置して・・・。で良い場合もあったりなかったり。
もしくはダウンロードしたパッケージを解凍して
perl ./Makefile.PL
make
make test
make install
でもインストールできますしね。
とはいえ、いざという時には頼りになるのも間違いないわけでして、うん、コレで忘れないぞ!
決まった時間間隔を計算する必要があったので、Perlの関数にしてみました。
ソースコードは以下の通り。Time::Localモジュールを必要としていますが、標準モジュールなので特に何も追加しなくても動くハズです。
引数は見ての通り、年,月,日,時,分,秒,加算したい秒 となっております。加算したい秒にマイナス値を指定すれば減算もできます。
使い方としては、
とか、
みたいな感じで。
Enjoy!
久しぶりにPerlでプログラムを書こうとしたら、すっかり忘れてしまっていたので。
まずは通常の変数からリファレンスを取得する場合は変数名の前に\(環境によっては¥だったり\だったり)を付けてやればOK
無名の配列や連想配列(ハッシュ)からいきなりリファレンスを取得するには、配列の場合はブランケット([])を、ハッシュの場合はブレース({})使って、普通に配列や連想配列を作る感じで出来ちゃいます。
これでOK
普通にリファレンスを元の変数の形に戻すには、その変数を表すファニー文字をリファレンスを格納した変数の前に付けてやればOKです。
こんな面倒なことをしなくても、アロー演算子(->)を使って直接値にアクセスすることも可能です。
もしくは暗黙のデリファレンスを利用する方法もあります。
このリファレンスを格納した変数を囲っているプレース(上の例では →{$aRef}← )は省略可能($$aRef[0] と書いてもOK)なのですが、複雑な(ネストした)構造になっているものを扱う時なんか、Perlの処理系が混乱する(エラーになる)場合があるので、書くようにしておいた方が後々ハマらなくていい気がします。
もっとも、そんな複雑なデータを扱う場合は暗黙のデリファレンスは使わずに、アロー演算子を使うようにした方が、よっぽど幸せな気がしますが(^_^;)。
【関連エントリー】
・Perlで無名(変数|配列|ハッシュ|関数)を扱う際の覚え書き
ふと気になって、空の配列の要素数を数えたらどうなるのか試してみました。
まずはスカラーで評価してみます。
#!/usr/bin/perl use strict; use warnings; my @array=(); my $arrayLen = @array; print $arrayLen,"\n"; # 0と表示されます print scalar(@array),"\n"; # 0と表示されます
どちらも 0 という評価でした。
次に配列の最後の要素番号を返す $# で評価してみます。
#!/usr/bin/perl use strict; use warnings; my @array=(); my $arrayLast = $#array; print $arrayLast,"\n"; # -1と表示されます。
結果は-1でした。
なるほど。そうなるのか!
【関連エントリー】
・Perlで配列の要素の数を取得する覚え書き
使う機会があるかすらわからないけど、Perlで連想配列の要素数を取得する方法を考えてみました。
と言っても、keys でキーの配列を作ってスカラーに代入するだけなんですけどね(^_^;)。
#!/usr/bin/perl use strict; use warnings; my %hash=("a"=>1, "b"=>1, "c"=>1); my $hashLen = keys %hash; print $hashLen,"\n"; # 3が表示されます。
もしくはscalar関数で評価しちゃうとか・・・。
#!/usr/bin/perl use strict; use warnings; my %hash=("a"=>1, "b"=>1, "c"=>1); print scalar keys %hash,"\n"; # 3が表示されます。
Enjoy!
よく忘れてしまうので、自分用にPerlで配列の要素数を取得するための覚え書きです。
一番簡単なのがスカラーに代入することです。
#!/usr/bin/perl use strict; use warnings; my @array=(1, 1, 1); my $arrayLen = @array; print $arrayLen,"\n"; # 3が表示されます。
scalar関数で評価すると、代入しなくていいので手間が省けます。
#!/usr/bin/perl use strict; use warnings; my @array=(1, 1, 1); print scalar(@array),"\n"; # 3が表示されます。
他にも$#を使う方法があるのですが、こちらは要素数ではなく最後の要素番号を返します。
#!/usr/bin/perl use strict; use warnings; my @array=(1, 1, 1); print $#array,"\n"; # 2が表示されます(最初の要素番号が0のため)。 print $#array+1,"\n"; # 1を足せば要素数の3になります。
滅多に使わないけど、配列の各要素に対して処理をかける時とかに便利。
#!/usr/bin/perl use strict; use warnings; my @array=(1, 1, 1); # パターン1 for(my $i=0; $i<=$#array; $i++){ $array[$i] = $array[$i]*3; } # パターン2 for(my $i=0; $i<$#array+1; $i++){ $array[$i] = $array[$i]*3; }
とかとか・・・。
Enjoy!
【関連エントリー】
・Perlで空の配列の要素数を数えてみた
久しぶりにファイルパスの文字列を分解しようとしたのですが、書き方をスコーン! と忘れてしまっていたので自分用にメモメモです φ(..)。
単純に区切り文字になる / を \ でエスケープしてやれば良いだけの話なんですが、何で抜けてたかなぁ?(^_^;)
#!/usr/bin/perl use strict; use warnings; my $pathStr = '/home/mukairiku/hoge/sample.txt'; my @pathArray = split(/\//, $pathStr); print shift(@pathArray)."\n"; # 結果は ""(空の文字列) print pop(@pathArray)."\n"; # 結果は "sample.txt"
うん、これでOK!
以前に Python では辞書オブジェクトを逆引きできると聞きまして、Perl でもハッシュ(連想配列)を、格納されている値からキーを逆引きできたら便利かも? と思い関数にしてみました。
12行目からの HashValue2Keys というサブルーチンがそうで、11行目までは検証用のソースになります。
使い方は第1引数に検索したい値を、第2引数に対象のハッシュを与えます。戻り値は該当したキーのリストです。該当するキーが無かった場合は空のリストを返します。
Enjoy!