てきとうなメモ

本の感想とか技術メモとか

Perlの`command`の文字コード

基本的にバイナリで行き来するのでencode/decodeする必要があるのか。

$ cat hoge.txt
日本語
英語
フランス語

で、

#!/usr/bin/perl
use feature qw(say);
use utf8;
use Encode qw(encode decode);
my $word = "日本語";
my $enc_word = encode('UTF-8', $word);
my $result = decode('UTF-8', `grep $enc_word hoge.txt`);

say encode('UTF-8', $result);
日本語

とうまくいく

テキストがEUC-JPの場合は

#!/usr/bin/perl
use feature qw(say);
use utf8;
use Encode qw(encode decode);

my $word = "日本語";
my $enc_word = encode('EUC-JP', $word);
my $result = decode('EUC-JP', `LANG=ja_JP.eucJP grep $enc_word hoge_euc.txt`);

say encode('EUC-JP', $result);

でうまくいく。grepロケールを見るので環境変数設定しないとヒットしてくれないことに気をつける。