WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:サ行のデータについて

0:[投稿] atusi [2002/03/07 21:43 ][環境:WIN+IE WIN系+Perl]

atusiです。こんにちわ。いつもお世話になっております。

ある配列の中からサ行のデータだけを取り出したいのですが、
なぜか「ソ」ではじまるデータが下の書式ではうまく認識されず、
どういうわけか「ポ」ではじまるデータが配列に入ってしまっています。
こういうことってあるのでしょうか?

foreach (@tmp) {
    chomp;
    my ($data) = split(/,/);
    # $data がサ行であれば配列にとる
    if($data =~ /^(サ|ザ|シ|ジ|ス|ズ|セ|ゼ|ソ|ゾ)/) {
        push @DATA, $_;
    }
}


1:[回答] jam [2002/03/08 10:14 ]

文字コードがSJISじゃないですか?
ソの字の2バイト目の文字がASCIIの文字\の文字コードと
同じになっているため、ソの後の | の文字が\によってエスケープ
されてしまうのでソの1バイト目文字コードと | の文字コードを
あわせるとボの文字コードと同じになってしまいます。
他にゼとゾの文字もまずいと思われます。
ゼの文字コードの2バイト目はASCIIの[と同じで、
ゾの2バイト目は]と同じです。
今回の正規表現ではゼとゾが両方ゼ->ゾの順番で出てきているので
[]の対応がとれてたまたまエラーになっていないのだと思います。

説明がへたくそで申し訳ないのですが、
ようはスクリプトをEUCで書く or jperlを使うことで回避できるでしょう。

参照ページ
http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP


2:[回答] jam [2002/03/08 10:22 ]

>あわせるとボの文字コードと同じになってしまいます。
「ボ」じゃなくて「ポ」ですね^^;


3:[質問] atusi [2002/03/08 10:41 ]

なるほど、どうもありがとうございます。

かなりの量のスクリプトをもう書いてしまっていて、
今からEUCにコードを変換すると大多数のコメントなどが
文字化けしてしまい、SJISで通すしかありません。。。

応急処置として、とりあえず

ソにマッチさせるには、

if($data =~ /^(サ|ザ|シ|ジ|ス|ズ|セ|ゼ|ソ|ゾ)/) {

の部分に何を入れればよいのでしょうか?

ゼとゾの場合も、

if文の条件部に
文字コードを直接入れたりしても駄目ですかね?

こんなことをお願いしてすいません。。。
どうぞよろしくお願いいたします。申し訳ございません。


4:[回答] andi [2002/03/08 10:48 ]

\Qソ\E

で出来ますか?


5:[回答] jam [2002/03/08 11:23 ]

文字コードをEUCに変換して文字コードで
マッチさせるのはどうですかね?
-----------------------
   require 'jcode.pl';

   my ($data) = split(/,/);

   # 文字コードをEUCへ変換
   jcode::convert(\$data, 'euc');

   # $data がサ行であれば配列にとる
   if($data =~ /^\xA5[\xB5-\xBE]/) {
      # 文字コードをSJISへ戻す
     jcode::convert(\$data, 'sjis');
       push @DATA, $data;
   }
-----------------------
これでいけるのか?


6:[回答] えび [2002/03/08 20:59 ]

 文字コードでマッチさせるなら、特に EUC に変換する必要もないと思いますが……。


7:[質問] atusi [2002/03/09 10:31 ]

皆様、懇切丁寧な解答どうもありがとうございます。

\Qソ\E

で試してみましたが、マッチしませんでした。。。


で、応急処置的に文字コードでサ行にマッチさせようと思うのですが、2点ほどお尋ねしたいことがあります。

1.データファイルの文字コードは何であろうと関係ないのでしょうか?それとも、スクリプトがEUCならEUC、スクリプトがsjisならsjisという風に依存関係などはあるのでしょうか?

2.データファイルの文字コードが関係ないとするなら、sjisでサ行をあらわす文字コードを入れてマッチさせることは可能ですか?


どうも度々すみませんが、どうぞよろしくお願いいたします。


8:[質問] atusi [2002/03/09 10:58 ]

あるキーワード $keyword を \Q と \E で挟めばエラーにならずにうまくパターンマッチできるというので、ゼゾポの3文字を\Q と \Eで挟み、ソの後には\をつけることで(ソはこれまた例外らしいですね)
、何とかパターンマッチできたのですが、

これでとりあえず「アイウエオ順でマッチさせる」という応急処置にはなっていますかね???

(以下のようです)

\Qゼ\E
ソ\
\Qゾ\E
\Qポ\E

本当に稚拙な質問を繰り返し、申し訳ございません。
次のスクリプトからは必ずEUCで書かせて頂こうと
反省しております。


9:[回答] 謎の人R [2002/03/10 22:30 ]

横から失礼します。

正規表現を用いず、また置換する必要もないようなので、indexで調べる、あるいは先頭一文字を抜き出して調べる手もあると思うのですが?

#1)indexで調べる例
@key = qw ( サ ザ シ ジ ス ズ セ ゼ ソ ゾ );
@DATA = ();
foreach ( @tmp ){
    chomp;
    my($data) = split(/,/);
    #$data の先頭がサ行であれば配列にとる
    foreach $key ( @key ){
        #先頭にあればindexは0を返すはず
        if( index( $data, $key ) == 0 ){
            push @DATA, $_;
            last;
        }
    }
}

#2)先頭一文字を抜き出して調べる例
@key = qw ( サ ザ シ ジ ス ズ セ ゼ ソ ゾ );
@DATA = ();
@CHECK{@key} = ( @key );    #チェック用ハッシュ作成
foreach ( @tmp ){
    chomp;
    my($data) = split(/,/);
    
    #$data の先頭一文字(2バイト分)を抜き出す
    my $char = substr( $data, 0, 2 );

    #$data の先頭がサ行であれば配列にとる
    if( $CHECK{$char} ){
        push @DATA, $data;
    }
}


10:[回答] jam [2002/03/11 09:51 ]

>>6
ですね^^;

>>8
いいのではないでしょうか。


11:[完了] atusi [2002/03/11 11:00 ]

皆様、懇切丁寧なご指導、本当にどうもありがとうございました。

また何かありましたら、どうぞよろしくお願いいたします。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World