日本語が含まれる文字列を扱うとき、必ずと言っていいほど文字化けに悩まされ、その辺の扱いがよくわからず困っていたのだが、これ読んだらよくわかった。
http://tech.voyagegroup.com/archives/465806.html
なるほど。「flagged UTF8」なんて言葉があるからわかりにくいんだな。
つまり文字の状態は2種類あると。
1つはUTF8やEUCなど、各文字コードで書かれた文字列。
もう1つはPerl内だけで使用されている専用の内部文字列。
後者をflagged UTF8とか紛らわしい言い方をするから混乱するわけで、これは我々には読めない機械語だとでも思っておけばいいんだよ。
だから文字列の処理の仕方は、
#外から来た各文字コードで書かれた文字をPerl処理用の内部文字列に変換
my $inner_str = Encode::decode("utf8", $str);
#もろもろ$inner_strに対して処理をする
#Perl内で処理した内部文字列を各文字コードに変換
my $str = Encode::encode("utf8", $inner_str);
となるわけだ。でuse utf8とかいう意味不明のおまじないは、Perlプログラム内で書かれた
文字列をPerl内処理用の内部文字列として扱うというものだったと。ようやく分かった。
2015年1月11日日曜日
2014年11月12日水曜日
zgrepやzcat | grepでBinary file (standard input) matchesが出た場合の対処法
hoge_log.yyyymmdd.tar.gzみたいなログファイルを「zgrep 検索文字列 hoge_log.yyyymmdd.tar.gz」やら
「zcat hoge_log.yyyymmdd.tar.gz | grep 検索文字列」なんかで検索しようとしたら、結果が
「Binary file (standard input) matches」と出て困った。なんか解決法がないのか検索してみたら、
このページを見て解決。
http://nobuneko.com/blog/archives/2013/04/linux_grep_binary_files_text.html
つまりはgrepが対象をバイナリファイルとみなしているがためにこの現象が起きるみたい。
解決法としては、-aオプションを付ければよいようだ。これでテキストファイルとみなされ、
検索結果が表示されるようになる。つまりは、
zgrep -a 検索文字列 hoge_log.yyyymmdd.tar.gz
や
zcat hoge_log.yyyymmdd.tar.gz | grep -a 検索文字列
とやって検索すればOK。
「zcat hoge_log.yyyymmdd.tar.gz | grep 検索文字列」なんかで検索しようとしたら、結果が
「Binary file (standard input) matches」と出て困った。なんか解決法がないのか検索してみたら、
このページを見て解決。
http://nobuneko.com/blog/archives/2013/04/linux_grep_binary_files_text.html
つまりはgrepが対象をバイナリファイルとみなしているがためにこの現象が起きるみたい。
解決法としては、-aオプションを付ければよいようだ。これでテキストファイルとみなされ、
検索結果が表示されるようになる。つまりは、
zgrep -a 検索文字列 hoge_log.yyyymmdd.tar.gz
や
zcat hoge_log.yyyymmdd.tar.gz | grep -a 検索文字列
とやって検索すればOK。
2014年10月31日金曜日
【Perl】Mooseの使い方
Mooseとは簡単にクラスを作ることができるモジュールのようだ。newとかは実装不要。
package Foo;
use Moose;
extends 'FooParent'; #これで親モジュールを継承できる
has name => { #アクセサを定義する関数
is => 'rw', #rwは読み書きができ、roは読み取りだけ($Foo->name,$Foo->name("hoge"))
isa => 'Str', #型の指定を行う
default => "Bob", #デフォルト値を指定できる。sub {Hoge->config}のようにサブルーチンも可
required => 1, #必須パラメータの場合は1を指定する
}
sub hoge { #メソッドの定義は普通に行う
print "My name is".shift->name."\n";
}
参考:
http://perldoc.jp/docs/modules/Moose/Manual.pod
package Foo;
use Moose;
extends 'FooParent'; #これで親モジュールを継承できる
has name => { #アクセサを定義する関数
is => 'rw', #rwは読み書きができ、roは読み取りだけ($Foo->name,$Foo->name("hoge"))
isa => 'Str', #型の指定を行う
default => "Bob", #デフォルト値を指定できる。sub {Hoge->config}のようにサブルーチンも可
required => 1, #必須パラメータの場合は1を指定する
}
sub hoge { #メソッドの定義は普通に行う
print "My name is".shift->name."\n";
}
参考:
http://perldoc.jp/docs/modules/Moose/Manual.pod
【Perl】AUTOLOADの使用例
定義されていない関数を呼び出すとこのAUTOLOADというのが呼び出される便利な関数。
cpanのモジュールを拡張して独自モジュールを作るような使い方ができる。
Foo.pm
#########################################################
package Foo;$
use strict;
use warnings;
sub AUTOLOAD {
> our $AUTOLOAD;
> my (@args) = @_;
> print "autoload start..function_name:$AUTOLOAD\n";
> print "argument is (".join(',',@args).")\n";
}
1;
#########################################################
$ perl -MFoo -e 'Foo::test("a","b","c")';
autoload start..function_name:Foo::test
argument is (a,b,c)
参考:
サンプルコードによるPerl入門 サブルーチンのオートロード AUTOLOAD
http://perldoc.jp/docs/perl/5.8.0/AutoLoader.pod
cpanのモジュールを拡張して独自モジュールを作るような使い方ができる。
Foo.pm
#########################################################
package Foo;$
use strict;
use warnings;
sub AUTOLOAD {
> our $AUTOLOAD;
> my (@args) = @_;
> print "autoload start..function_name:$AUTOLOAD\n";
> print "argument is (".join(',',@args).")\n";
}
1;
#########################################################
$ perl -MFoo -e 'Foo::test("a","b","c")';
autoload start..function_name:Foo::test
argument is (a,b,c)
参考:
サンプルコードによるPerl入門 サブルーチンのオートロード AUTOLOAD
http://perldoc.jp/docs/perl/5.8.0/AutoLoader.pod
2014年8月6日水曜日
わかりにくいのpack,unpack関数を実際に試してみた
Perlにはpack関数、unpack関数というのがあって、プログラムの基本書にも載っていたりはするのだが、あの解説を読んでもさっぱりわからないのでちょっと試してみることにした。
pack関数、unpack関数の意味不明な解説の例
http://www.tohoho-web.com/wwwperl2.htm#pack
別にこのサイトが悪いわけではなく、 どれ読んでもこんな意味不明の解説しか書かれていない。
今回必要な項目をちょっと抜粋してみる。
pack(template, list)
バイナリデータを生成する。templateでlistがどんな形式のデータなのか指定する。
後ろに数値を付けるとその個数分、アスタリスクを付けるとlistの最後までバイナリデータに変換する。
unpack(template, expr)
バイナリデータを解釈する
templateの例
c 符号付き1バイト数値(-128 ~ 127)
C 符号無し1バイト数値(0~255)
H hex string(high nybble first)
全く何言ってるのかわかんねーな。バイナリデータって何だよ!って感じ。
今回試してみるプログラムで必要なのでASCIIコード表のURLも貼っておく。
http://e-words.jp/p/r-ascii.html
必要な部分を抜粋すると、アスキー文字コード一覧は下記の通り。
文字 10進数 16進数
% 37 25
& 38 26
さて、まずはunpack関数からPerlのワンライナーとその結果をいくつか打ってみよう。
$ perl -e '
my $val = unpack("H2","%");
print $val."\n";
'
25
$ perl -e '
my $val = unpack("H2","&");
print $val."\n";
'
26
$ perl -e '
my $val = unpack("H","&");
print $val."\n";
'
2
$ perl -e '
my $val = unpack("H2","&%");
print $val."\n";
'
26
$ perl -e '
my $val = unpack("H4","&%");
print $val."\n";
'
2625
$ perl -e '
my $val = unpack("H5","&%");
print $val."\n";
'
2625
つまりunpack("H2", 文字列)
は文字列をASCII文字コードの16進数表記に直して、それを2桁出力するという関数になる。
今度はpack関数に関してワンライナーを試してみる。
$ perl -e '
my $val = pack("c",hex(25));
print $val."\n";
'
%
$ perl -e '
my $val = pack("c",hex(26));
print $val."\n";
'
&
pack("c",10進数数値)は逆に数値からASCIIコードを生成している関数ということになる。
結論としては、数値をASCIIコードに変換するのがpack関数で、ASCIIコードを数値に変換しているのがunpack関数ということのようだ。今回の使い方だとね。
pack関数、unpack関数の意味不明な解説の例
http://www.tohoho-web.com/wwwperl2.htm#pack
別にこのサイトが悪いわけではなく、 どれ読んでもこんな意味不明の解説しか書かれていない。
今回必要な項目をちょっと抜粋してみる。
pack(template, list)
バイナリデータを生成する。templateでlistがどんな形式のデータなのか指定する。
後ろに数値を付けるとその個数分、アスタリスクを付けるとlistの最後までバイナリデータに変換する。
unpack(template, expr)
バイナリデータを解釈する
templateの例
c 符号付き1バイト数値(-128 ~ 127)
C 符号無し1バイト数値(0~255)
H hex string(high nybble first)
全く何言ってるのかわかんねーな。バイナリデータって何だよ!って感じ。
今回試してみるプログラムで必要なのでASCIIコード表のURLも貼っておく。
http://e-words.jp/p/r-ascii.html
必要な部分を抜粋すると、アスキー文字コード一覧は下記の通り。
文字 10進数 16進数
% 37 25
& 38 26
さて、まずはunpack関数からPerlのワンライナーとその結果をいくつか打ってみよう。
$ perl -e '
my $val = unpack("H2","%");
print $val."\n";
'
25
$ perl -e '
my $val = unpack("H2","&");
print $val."\n";
'
26
$ perl -e '
my $val = unpack("H","&");
print $val."\n";
'
2
$ perl -e '
my $val = unpack("H2","&%");
print $val."\n";
'
26
$ perl -e '
my $val = unpack("H4","&%");
print $val."\n";
'
2625
$ perl -e '
my $val = unpack("H5","&%");
print $val."\n";
'
2625
つまりunpack("H2", 文字列)
は文字列をASCII文字コードの16進数表記に直して、それを2桁出力するという関数になる。
今度はpack関数に関してワンライナーを試してみる。
$ perl -e '
my $val = pack("c",hex(25));
print $val."\n";
'
%
$ perl -e '
my $val = pack("c",hex(26));
print $val."\n";
'
&
pack("c",10進数数値)は逆に数値からASCIIコードを生成している関数ということになる。
結論としては、数値をASCIIコードに変換するのがpack関数で、ASCIIコードを数値に変換しているのがunpack関数ということのようだ。今回の使い方だとね。
2014年6月19日木曜日
2014年3月21日金曜日
FC2ブログのソースコード
FC2ブログがソースをオープンソース(MITライセンス)にて公開したとのこと。
【ブログ】「FC2ブログ」をオープンソースで公開!より自由にカスタマイズ可能!
githubのソースコードはこちら。
https://github.com/fc2blog/blog
【ブログ】「FC2ブログ」をオープンソースで公開!より自由にカスタマイズ可能!
githubのソースコードはこちら。
https://github.com/fc2blog/blog
登録:
投稿 (Atom)