プロが教えるわが家の防犯対策術!

perl5.8.8を使っています。
日本語にマッチする正規表現を書きたいのですが、どうしてもマッチしません。

例えば、以下のファイルtest.txtから「さしすせそ」だけを抽出し、表示させたいです。
---------test.txt--------------------------------
あいうえお
かきくけこ
さしすせそ
たちつてと
--------------------------------------------------

----------test.pl--------------------------------
use strict;
use warnings;

open(FILE, 'test.txt') or die "$!";
my @file = <FILE>;
close(FILE);

foreach my $line (@file){
if($line =~ /^さ/){
print "$line\n";
}
}
------------------------------------------------

このtest.plを実行しても「さしすせそ」を抽出することが
できません。
どうしたらよいのでしょうか?
自宅の新しいバージョンのperlだとできるのですが
会社のperlは5.8.8で顧客環境でもあるのでバージョンアップも
できません。

すみませんが、よろしくお願いいたします。

A 回答 (4件)

5.8 なら文字コードを適切に設定すればいけるんじゃなかったかなぁ....

    • good
    • 0

マッチをさせる前に


chomp $line;をしてみてはどうでしょうか?
    • good
    • 0

この内容なら、もっと古いバージョンでも動きそうなのですが。


「さ」は、いわゆる「だめ文字」ではないですし。
test.txtとtest.plとで文字コードが違ってたりしませんか?

もっと複雑なのになると、このままでは、日本語がバイト毎に分解されて処理されるので、問題になります。
例: 'あい' =~ /^(..)/ は、$1='あい' にならない。$1='あ'の1バイト目 'あ'の2バイト目 になる
その場合は、UTF8フラグ付きにencode/decodeして使えば日本語の1文字を「1文字」として扱ってくれます。
5.8.8だと、UTF8フラグ付き文字列も使えるレベルになっていたはずです。

参考URL:http://www.rwds.net/kuroita/program/Perl_unicode …
    • good
    • 0

ファイルの文字コードとプログラムの文字コードの不一致が原因だと思います。

Encode::Guess モジュールを使えば、文字コードを調べることができます。なお、私の手元にある Linux 上の Perl v5.8.1 でも Encode::Guess は装備済なので、v5.8.8 であれば使えると思います。

use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
...
my $q = Encode::Guess->guess(join('', @file));
print ref($q) ? $q->name : $q;

上記のようなコードを元のプログラムに組み込むと、判別に成功すればファイルの文字コードを表示してくれます。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!