use encodingによって正規表現の結果が変わる?

このQ&Aのポイント
  • webシステムで画面入力値のチェックをperlで行っており、perlのバージョンアップ対応を行った結果、正規表現の$が効かなくなる現象が発生しています。
  • バージョンはperl v5.8.0、osはRed Hat Linux release 9です。
  • use encodingが指定されていると、正規表現の$が効かなくなります。対処方法がわからないため、他の質問を検索しましたが解決策は見つかりませんでした。perlのバグの可能性があるので、対処方法を教えていただきたいです。
回答を見る
  • ベストアンサー

use encodingによって正規表現の結果が変わる?

お世話になります。 webシステムで、画面入力値のチェックをperlで行っているのですが、 今回、perlのバージョンアップ対応を行っており、ソース修正をしたところ、以下のような現象に悩まされて困っております。 (本当のソースはもっと長いのですが、以下の現象により入力チェックが正常に動作しないという点までは突き止めました。) バージョン perl v5.8.0 os Red Hat Linux release 9 現象 use encodingが指定されていると、正規表現の$が効かないようです。 ソースと実行結果1 #!/usr/bin/perl #use encoding "euc-jp"; if ('apple' =~ /e$/) { print ("match\n"); } else { print ("unmatch\n"); } このときは match と表示されます。 ソースと実行結果2 #!/usr/bin/perl use encoding "euc-jp"; if ('apple' =~ /e$/) { print ("match\n"); } else { print ("unmatch\n"); } このときは、unmatch と表示されます。 対処方法のヒントだけでも頂けると助かります。 (他の質問を検索してみましたが、同様なものを見つけることができませんでした。) もしかして、perlのバグなのでしょうか?

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

対処方法の回答ではありませんが、 Perl v5.8.8 だと、どちらの結果も match になります。 やはり Perl v5.8.0 のバグかもしれませんね。

yosiyabu
質問者

お礼

返事が遅れてすみません。 やはり、5.8.0のバグなのでしょうか? perl5.6.0でも再現しませんでした。 ちなみに、追加検証した結果、「固定値と$の組み合わせ」が駄目だということがわかりました。 ですので、上記でeを[]で囲めばマッチしました。(笑) #!/usr/bin/perl use encoding "euc-jp"; if ('apple' =~ /[e]$/) { print ("match\n"); } else { print ("unmatch\n"); } では、また、わからないことがありましたらよろしくお願いします。

関連するQ&A

  • Perlバージョン違いと use encoding;

    Perl 5.6とPerl 5.8の両方を使っています。 use encoding 'utf8';を 5.6で使うとエラーになるので バージョンを調べて条件分岐を行おうとしていますが、 use はどこに書いても実行される?ので、エラーが回避できません。 何か良い方法はあるのでしょうか? use encoding 'utf'; $|=1; print "Version=$]\n"; use utf8; if($] >= 5.008001){ print "*** PASS ***\n"; use encoding 'utf8'; }

    • ベストアンサー
    • Perl
  • 正規表現について

    いつもお世話になっております。 perlの正規表現で分からない事があります。 ご存知の方がいらっしゃれば、アドバイスを頂けますようよろしくお願い致します。 (質問内容) 以下のようなプログラムを実行した場合、matchが出力されてしまいます。 $aには、「、IS」を設定しているので、「真」と扱われないと思うのですが、何故、matchが出力されるのでしょうか? また、「偽」として処理をいしたい場合、 どのようにすればよろしいのでしょうか? #!/usr/bin/perl $a = "、IS"; $b = "AIS"; if ($a =~ $b){ print "match\n"; } else{ print "not match\n"; }

  • 正規表現の書き方に困っております。

    あるSQLのダンプを変換するプログラムをPerlで書いているのですが、 うまく正規表現が書けなくて困っております。 データの途中に,が有ると、うまくいきません。 ''の中に囲まれた,は無視するという正規表現を書きたいのです。 また、'''B'も正しく処理できれば、完璧です。 #!/usr/bin/perl use strict; use warnings; #my $a = qq{'A','B',1}; --> うまくいく  ['A']['B'][1] #my $a = qq{'A,','B',1}; --> うまくいかない ['A] ['] ['] my $a = qq{',','''B',1}; --> もっとうまくいかない ['][']['] if($a =~ /(.+?),(.+?),(.+?)/){ print "[$1]\n"; print "[$2]\n"; print "[$3]\n"; }else{ print "ERR!\n"; } exit; __END__

    • ベストアンサー
    • Perl
  • Encode と encoding の同時使用で ISO-2022-JP に encode できない

    CentOS を 5.1 から 5.2 にアップデートした頃から PerlCGI からのメール送信が出来なくなって、調べていたら「ISO-2022-JP への encode がおかいぞ問題」に辿り着きました。 以下のコードで、euc-jp が吐かれてしまいます。 #! /usr/bin/perl -w use encoding('UTF8'); use Encode; binmode(STDOUT); my $text = "<全角文字ですよぉ。>"; print encode('ISO-2022-JP', $text), "\n"; 以下のいずれかで正常に jisコードを吐く様になるのですが、こんなものなんでしょうか? 1 「use encoding('UTF8');」 を 「use utf8;」に替える 2 print の直前に "no encoding;" を入れる CentOS 5.1 では多分正常に ISO-2022-JP への変換ができていたのだと思います。 私の使用するバージョンの Cygwin の Perl でも正常です。 問題のある CentOS5.2 と 問題の無い Cygwin版で、関係しそうなバージョンの違いはありません。 CentOS 5.2: Perl 5.008008 Encode 2.12 Encode::JP 2.01 encoding 2.02 Cygwin: CYGWIN_NT-5.1 **** 1.5.25(0.156/4/2) 2008-04-17 12:11 i686 Cygwin Perl 5.008008 Encode 2.12 Encode::JP 2.01 encoding 2.02 できれば、すでに動いているCGIの use encoding('UTF8'); を直す事なく動く様にしたいのです。

  • use strictが効かない (PERL)

    たびたびお世話になっております。 PERL version 5.14.2 をWindows 7 のコマンドプロンプトから起動して使っています。 use strict; と一行目に書くと 宣言されていない変数があれば拒絶されるとのことで #!/usr/bin/perl use strict; use warnings; $a = 10; print "$a\n"; というスクリプトを書きました。が、すんなり動いてしまいます。 use strict; は どうすればうまく効くのでしょうか。 ご指導お願いします。

    • ベストアンサー
    • Perl
  • 正規表現の質問です。

    実行環境がなく困っています・・ Perlで以下の正規表現はマッチするでしょうか? if("EUC-JP" =~ m|EUC|i ) { print "match"; }

    • ベストアンサー
    • Perl
  • Perlで use strict して our変数

    Perl 初心者です。初めて質問します。 test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。 環境 : WindowsXP / ActivePerl 5.14.2 -------------------- * test_sub.pl -------------------- #!/usr/bin/perl use strict; our $hoge = 'HOGE'; 1; -------------------- * test_main.pl -------------------- #!/usr/bin/perl use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; -------------------- これを実行すると、 Global symbol "$hoge" requires explicit package name at C:/public_html/cgi-bin/test_main.pl line 7.\r というエラーが出ます。 require する前に、test_main.pl のほうで our($hoge); と宣言したり 参照する際に print $main::hoge; とパッケージを指定したりすればいけるのですが、 これらをしないとできないものなのでしょうか。 use strict; を書かなければ最初のソースでも動くのですが use strict は書きたい… 継承のようなことをしたいのです。 ちなみに以下試してみたソースです。 -------------------- * test_main.pl -------------------- #!/usr/bin/perl ######################################## # NG use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; ######################################## # OK our変数を宣言しておくといける =pod use strict; our ($hoge); require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## # OK 参照する際にパッケージ名を指定すればいける =pod use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $main::hoge; =cut ######################################## ######################################## # NG =pod use strict; use base qw(test_sub); print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## -------------------- * test_sub.pm -------------------- #!/usr/bin/perl package test_sub; use strict; our $hoge = 'HOGE'; 1; -------------------- NG パタンはどちらも Global symbol "$hoge" requires explicit package name のエラーとなります。 もしご存じの方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • use文を分岐させる方法?

    Perl5.6とPerl5.8の環境でスクリプトを書いているのですが、perl5.8では use encoding "shiftjis"; はエラーなく動作しますが、Perl5.6ではだめです。 同じソースでそれぞれによって動作を変えたいのですが、useはif文で分岐をかけても実行されるので、 同じソースで処理を分ける他の方法はあるのでしょうか? × if($] >= '5.008001'){ use encoding "shiftjis"; }

    • ベストアンサー
    • Perl
  • utf-8での日本語正規表現の書き方

    WindowsXPでPerlの正規表現の勉強をしています。 下記のスクリプトを作りテストしているのですが例1はマッチするのに例2はマッチしません($countが0のままです)。どうしてなのでしょうか?なおスクリプトファイルも、hoge.txtも共にUTF-8です。どなたかお教えいただけますでしょうか。どうぞよろしくお願いします。 use utf8; use encoding ("utf-8"); # 例1################################## $str1 = "そろそろ夏も終わりですね。"; $str2 = "夏"; if ($str1 =~ /夏/) { print "例1の答え: 含まれています \n"; } else { print "例1の答え: 含まれていません \n" } # 例2 ################################### $count = 0; open(FH, "C:\\temp\\hoge.txt"); while(<FH>) { if (/夏/) { $count++; } } print "$count \n";

    • ベストアンサー
    • Perl
  • perl2exeでuse encodingが使えない

    下記のようなスクリプトを作成しました。 スクリプト名は test_kanji.pl ---------------- use encoding("shift-jis"); print "表現\n"; ----------------- 上記を実行すると、正しく”表現”の文字が表示されます。 これをperl2exeで実行形式に変換すると 下記のエラーが表示され、期待した結果が得られません。 Converting 'test_kanji.pl' to test_kanji.exe Warning: Can't locate I18N/Langinfo.pm at C:\Perl\lib\encoding.pm line 41 @INC = c:\perl\userlib, C:\Perl\lib, C:\Perl\site\lib, . 又、強引にtest_kanji.exeを実行すると encoding: Unknown encoding 'shift-jis' at C:\Perl\userlib\test_kanji.exe line 1 BEGIN failed--compilation aborted at C:\Perl\userlib\test_kanji.exe line 1. のようなメッセージが表示され、”表現”が表示されません。 perl2exeでuse encodingは使用できないのでしょうか。

専門家に質問してみよう