• ベストアンサー

Perlにおけるパターンマッチ

パターンマッチの勉強をしていたところ 偶然「ちょう」という言葉を以下のように書くとひっかからないことに気づきました。 なぜ「ちょう」という日本語だとひっかからないのでしょうか? また「ちょう」がパターンマッチにひっかかるようにするのにはどうすべきなのでしょうか? if($word =~ /ちょう/){ { &error("エラー","「ちょう」という言葉は使用できません"); }

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

文字コードの違いと、UTF-8フラグの有無が考えられます。 $wordに入っている文字列の文字コードと、Perlスクリプトが書かれている文字コードを一致させる必要があります。 また、双方がUTF-8で一致していたとしても use utf8;等で、Perlスクリプト内ではUTF8フラグ付きになっていて、$wordにはフラグ無し、 あるいは、 $wordが何かのモジュールで処理されたUTF8 フラグ付きになっていて、Perlスクリプトにはフラグ無し という状態でも一致しません。 最近なら、次のようにやるのがよいでしょう。 ・スクリプトは use utf8; を使い、UTF-8で記述する。 ・プログラム中では、UTF-8フラグ付き文字列で処理する。  ファイル等からの入力はPerlIOを利用したり、Encode::decodeしたりしてUTF8フラグ付きにする。  ファイル等への出力は、PerlIOを利用したり、Encode::eecodeしたりしてUTF8フラグをはずす。

masa-25
質問者

お礼

大変分かりやすく、そしてご丁寧な回答ありがとうございます。 処理に使用していた文字コードが別々だったようです。 そこで統一したところ、うまくいきました!! 大変助かりました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • パターンマッチにおける「-」の扱い

    例えば以下のように記載するとエラーとなります。 if($::FORM{'body'} =~ /パターン/){ push(@error, '投稿できません'); } しかし、以下のように記載するときちんとパターンマッチします。 このふたつともエラーが出ておかしくないと思うのですが なぜ以下ならOKなのか教えてください!! @word=qw(パターン); foreach (@word) { if (index($::FORM{'body'},$_) >= 0) { push(@error, '投稿できません。'); } }

    • ベストアンサー
    • Perl
  • パターンマッチについて

    perl初心者です。文字列がパターンマッチするかを検査したいのですが、検査文字列にカッコ"()"が含まれているので期待する結果を得られません。(マッチしているように見えるが実行結果はマッチしていないになる)カッコによりパターンがグループ化されているように思えるのですが。原因と対処をご教示ください。 $word = "Remote Procedure Call (RPC)" $chk_word = "Remote Procedure Call (RPC)" if ($word =~ m/$chk_word/ ) {・・・・ よろしくお願いします。

    • ベストアンサー
    • Perl
  • パターンマッチで変数でマッチさせるには?

    教えて下さい。 パターンマッチで変数$aaa(中身は2バイト文字)でマッチしたいのですが どう書いたらいいんでしょう? 以下のように書いたらマッチしませんでした(;ω;) if($value[5] =~ /^($aaa)/)

    • ベストアンサー
    • CGI
  • 漢字などを正規表現でパターンマッチさせる方法?

    こんにちは,よろしくお願いします。 名前(姓と名に分けて)を入力してもらうフォームを作っています。 姓名を日本語,つまり,漢字,ひらがな,カタカナを全角(2バイト文字?)で入力してもらいたいと考えています。 ぜんぜんわからないのですが,パターンを次のように考えて, var pattern = "[亜-熙ぁ-んァ-ヶ]+"; if(seimei.match(pattern)){ 上記のようにやってみたらうまくいったように思えましたが,「蓬莱」や「紀香」などの漢字を入力するとマッチしません。 文字セットは”UTF-8”を使っています。 すべての漢字,ひらがな,カタカナをマッチさせるようにするにはどのようなパターンで行えばいいのでしょうか?教えてください。 よろしくお願いします。

  • パターンマッチ

    The remained line is shown below. Outline Lab's file A and B ファイルの中身は上記のようになっています。 サブルーチンを作り、パターンマッチで1行目以外を新しいarrayに入れようとしています。 以下のように書きましたが、空白行を選択してしまいます。どうしたら目的のように動くようになりますか? 宜しくお願い致します。 use strict; my @new_line = skip(@input) sub skip { my @lines = @_; my @skip = ("Outline", "Lab\'s\sfile", "A\sand\sB"); foreach my $line(@lines) { my $word = join ("|", @skip); if ($word =~ /^\$line$/) { push @new_line, $line; } } return @nnew_line; }

    • ベストアンサー
    • Perl
  • 小文字から大文字への変換後のパターンマッチ

    以下のように英数字を小文字から大文字に変換し、 その後、パターンマッチさせるように記述し、 $nameをテニスコートてみてもマッチしませんでした。 たぶん\Qテニスコート\Eの\Q~\Eが問題なのだとは思うのですが \Q~\Eがないとエラーとなってしまうため、外せません。 このような場合、どうしたらいいのでしょうか? $name = uc $name; if($name =~ /\Qテニスコート\E|TENNIS/){ push(@error, 'テニス関係は入力できません'); }

    • ベストアンサー
    • Perl
  • 正規表現のパターンマッチがうまくいきません。

    正規表現のパターンマッチがうまくいきません。 入力した文字を含むデータを抽出しようとしているのですが、エラーは出ないものの、ヒットしません。 次の構文をそれぞれを試してみました。 目的は入力された文字$matchを含む$textを@queryに入れることです。 if($text =~ /$match/){ push(@query, $text); } if($text =~ /\$match/){ push(@query, $text); } if($text =~ /.*\$match.*/){ push(@query, $text); } if($text =~ m/.*\$match.*/){ push(@query, $text); } 半角英数で何度か試したのですが、どれでやってもヒットしてくれません。 どこをどのように訂正すればいいでしょうか。 お分かりの方ぜひご指導ください。 ちなみによく入力データを$in{aaa}とか$QUERY{aaa}などとまとめることがあるのですが、これを正規表現にそのまま入れるにはどうしたらいいでしょうか。 {}は量指定子になるのでこのままではエラーになるかなとも思うのですが、\などでエスケープすればいいのでしょうか。 上の$matchも元々は$in{aaa}なのですが、 $match = $in{aaa} として変えています。

    • ベストアンサー
    • Perl
  • VBScriptでの正規表現パターンマッチ

    ASPプログラムの中で 文字列のパターンマッチを正規表現で行ないたいと考えています。 英字と数字両方を組み合わせた文字列(英字と記号且つ数字)であることをチェックしたいのですが 以下のようなロジックでは、英字、数字どちらかだけの文字列もマッチしてしまうのではと思います。 ほかによい書き方はありますでしょうか? Dim strTEST TESTCHECK = 0 Dim objRE Set objRE = new RegExp objRE.pattern = "[_\-a-zA-Z0-9]" If (objRE.Test(strTEST) = True) Then Else TESTCHECK = 1 End If Set objRE = Nothing よろしくお願いいたします。

  • perl:パターンマッチを使ったifの条件

    perlでパターンマッチを使ったifの条件が必ずTRUEになってしまいます。 以下は条件です。二つのファイルがあって、片方のファイルのある列の文字列と別のファイルのある列の文字列が一致したら一致した行の1列目を出力するというプログラムです。 perl v5.12.3 『oct_gene.csv』は以下のような2列のファイルで、2列目であるalphabetの群は空白で区切られています。文字コードはASCIIです。 1 zinc finger protein of the cerebellum 3 0 stathmin-like 2 . . . . 『RNA.csv』は以下のような3列のファイルで、3列目のalphabet群は同じく空白で区切られています。文字コードはUTF-8です。 1 NM_324891 sin3 associated polypeptide 2 NM_53344 Nanog homeobox . . . open (WRITE, ">RNAseq_Oct.csv"); open(FILE, "RNA.csv"); while($line = <FILE>){ chomp $line; @fact = split /\t/, $line; open(OCT, "oct_gene.csv"); while($octline = <OCT>){ chomp $octline; @oct = split /\t/, $octline; if($fact[2] =~ /$oct[1]/){ print WRITE $fact[2] . "\t" . $oct[1] ."\n"; last; } } close (OCT); } close (FILE); close (WRITE); この中のif文がうまく働かず、whileで繰り返すまでもなく必ず if($fact[2] =~ /$oct[1]/) が成り立ってしまいます。 どなたか詳しい方、どうかご教示願います。 それではよろしくお願いします。

    • ベストアンサー
    • Perl
  • このパーティーにマッチする曲って??

    日本語では「合う」という言葉をマッチすると言ったりしますが、英語ではこれはどのような時に使用するものですか?? 食事などの「調和」を示す「ご飯と味噌汁は良く合うなぁ。」の時はmatchを使用するかと思いますが、 例えば、日本語では「あの曲って、このパーティーにもの凄くマッチしていて良かったよね」なんて言いますが、このような場合にもmatchを使用しても良いのでしょうか? That song matched that party!! it was great wasn't it? このような感じでしょうか??

このQ&Aのポイント
  • エレコム社が提供するMACアドレスチェンジャーを使うと、PCのMACアドレスをドッキングステーションのものに変更することができます。
  • これにより、制限されたネットワークに接続することが可能となります。
  • 会社のPCで使用する際には、事前に私用PCでMACアドレスの変更を行っておく必要があります。
回答を見る