Perl:Unicodeプロパティ作れない

このQ&Aのポイント
  • PerlでUnicodeの文字プロパティの作成に失敗している理由について教えてください。
  • スクリプト実行時にCan't find Unicode property definition "AsciiAlpha"というエラーメッセージが表示されます。
  • Unicodeプロパティの作成に失敗している原因について詳しく教えてください。
回答を見る
  • ベストアンサー

Perl:Unicodeプロパティ作れない

お世話になります。 Unicodeの文字プロパティの使い方を学ぶために、以下のようなスクリプトをUTF-8で保存しました。 ============ #! /bin/perl # # utf8_unireg.pl use 5.010; use strict; use warnings; use utf8; binmode STDOUT, ":encoding(shift_jis)"; my $str = "a:b:c:"; say join "|", ($str =~ /\p{ASCII}/g); say join "|", ($str =~ /\p{AsciiAlpha}/g); sub AsciiAlpha { return <<END; 0041 005A # A-Z 0061 007A # a-z END } ============ 実行するとこうなります。 ============ C:\Perl\perl>utf8_unireg2.pl a|:|b|:|c|: Can't find Unicode property definition "AsciiAlpha" at C:\Perl\perl\utf8_unireg2.pl line 14. ============ \p{AsciiAlpha}というプロパティの作成に失敗しているようです。。 なぜか分かりますでしょうか? よろしくお願いします。

  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1
TYWalker
質問者

お礼

ありがとうございます! 自作プロパティの場合IsまたはInが必要なんですね。 これ、5.12のときはIs、Inがなくてもできたようです。 ★ C:\Perl\perl>type utf8_unireg2.pl #! /bin/perl # # utf8_unireg.pl use 5.010; use strict; use warnings; use utf8; binmode STDOUT, ":encoding(shift_jis)"; my $str = "a:b:c:"; say join "|", ($str =~ /\p{AsciiAlpha}/g); sub AsciiAlpha { return <<END; 0041 005A # A-Z 0061 007A # a-z END } C:\Perl\perl>perl utf8_unireg2.pl a|b|c C:\Perl\perl>perl -v This is perl 5, version 12, subversion 1 (v5.12.1) built for MSWin32-x86-multi-thread Copyright 1987-2010, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. C:\Perl\perl> ★ ところが、5.16になってからは、(Is|In)が必要になったようです。 ★ C:\Perl\perl>perl -v This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x86-multi-thread (with 1 registered patch, see perl -V for more detail) Copyright 1987-2012, Larry Wall Binary build 1603 [296746] provided by ActiveState http://www.ActiveState.com Built Mar 13 2013 11:29:21 Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. C:\Perl\perl>type utf8_unireg2.pl #! /bin/perl # # utf8_unireg.pl use 5.010; use strict; use warnings; use utf8; binmode STDOUT, ":encoding(shift_jis)"; my $str = "a:b:c:"; say join "|", ($str =~ /\p{AsciiAlpha}/g); sub AsciiAlpha { return <<END; 0041 005A # A-Z 0061 007A # a-z END } C:\Perl\perl>perl utf8_unireg2.pl Can't find Unicode property definition "AsciiAlpha" at utf8_unireg2.pl line 13. C:\Perl\perl>type utf8_unireg2.pl #! /bin/perl # # utf8_unireg.pl use 5.010; use strict; use warnings; use utf8; binmode STDOUT, ":encoding(shift_jis)"; my $str = "a:b:c:"; say join "|", ($str =~ /\p{IsAsciiAlpha}/g); sub IsAsciiAlpha { return <<END; 0041 005A # A-Z 0061 007A # a-z END } C:\Perl\perl>perl utf8_unireg2.pl a|b|c ★ 昔動いたプログラムが動かなくなったので、Perlの仕様変更でしょうね。。 ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

仕様としては, 5.10 のときでも「In」または「Is」で始まることが必要だったようです. 実装としていつ「In」または「Is」を要求するようになったのかは探せていませんが.

参考URL:
http://perldoc.perl.org/5.10.0/perlunicode.html#User-Defined-Character-Properties
TYWalker
質問者

お礼

ありがとうございます! なるほどー。

関連するQ&A

  • perl5.8.3のunicode環境で日本語の置換え

    お助けください。m(__)m perl5.8.3環境で、utf-8にて書かれたperl内での日本語置換えの質問です。 テキストファイルを「abc.dat」、処理するperlファイルを「rep.cgi」とします。 abc.datを読み込み、ファイル内の文字列「abc」を「あいう」に置換えする部分を「$rep =~ s/abc/あいう/;」とすると、置換えはうまくいっているようなのですが、abc.datに書かれた置換え以降の日本語が文字化けします。 原因はいったいどこにあるのでしょう?? 【テキストファイル abc.dat】文字コードUTF-8、改行コードLF <div> <p>abc</p> <p>あいう</p> </div> 【perlファイル rep.cgi】文字コードUTF-8、改行コードLF use utf8; use Encode; open(TMPL,"<:encoding(utf8)","abc.dat") || die('Error'); while (<TMPL>) { $rep .= $_; } close(TMPL) || die('Error'); $str = 'あいう'; $rep =~ s/abc/$str/; print $rep; 【結果】 <div> <p>あいう</p> <p>あいう</p> </div>

    • ベストアンサー
    • Perl
  • Cannot decode string with wide characters

    use utf8; binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; use strict; use Encode; sub main(){ #UTF-8(BOMなし),CRLFのファイルに書いてます。 my $str = "あ"; my $bin = $str; $bin = Encode::encode('euc-jp', Encode::decode('utf8', $str)); $bin = Encode::encode('utf8', Encode::decode('euc-jp', $bin)); print "Content-Type:text/plain;charset=UTF-8\n"; print "\n"; print $bin; } &main; ======================= 希望する出力結果: あ ============================ 結果:Internal Server Error Apacheのエラーログ: [Wed Jan 09 15:07:34 2008] [error] [client 127.0.0.1] Premature end of script headers: 20080109-1.pl [Wed Jan 09 15:07:34 2008] [error] [client 127.0.0.1] at C:/Environment/Perl/v5.8.8/lib/Encode.pm line 166.\r ========================= 質問: どのように修正すればよいか?

  • utf8使用時のフォーム入力文字コード

    use utf8; binmode(STDIN,":encoding(shiftjis)"); をすると、入力時に内部変換がかかり、UTF-8として扱える という認識で使っていたのですが、下記のコードを実行してみると 入力した文字は普通に sjisで表示されます。 binmode(STDIN~ はどのような意味を持つのでしょうか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.hikoboshi.org/perl/doc/encode.html 他、いろいろなサイトで調べてみたのですが、いまひとつ 納得する回答を得ることができません。 //////////////////////////////////////////////////// use utf8; use open 'encoding(utf8)'; binmode(STDIN,":encoding(shiftjis)"); use CGI; print "content-type:text/html; charset=Shift_JIS \n\n"; print <<"EOM"; <form action="xxx.cgi"> <input type="text" name="hoe"> <input type="submit"> </form> ここは UTF-8文字列なので化ける<br> EOM $cgi = CGI->new; print $cgi->param('hoe'); //////////////////////////////////////////////////// 現在は下記のコードで自前で UTF-8に変換しています //////////////////////////////////////////////////// foreach( $cgi->param() ){ my $str = $cgi->param($_); $str = Encode::encode('utf-8', Encode::decode('shiftjis', $str)); $cgi->param( -name=>$_, -value=>$str ); }

    • ベストアンサー
    • Perl
  • [perl5.8] SJISから読み込んだ~と

    sjisで書かれたファイルsjis.txtに"~"と一文字だけ 書いて、それをutf8で記述した以下のperlスクリプト で読込み、文字列マッチングをしたのですが、うまく いきません。(ちなみにソース中blockB部分を有効に し、blockAをコメントアウトするとうまくいきます) #=== match.pl =============================== #!/usr/bin/perl use encoding 'utf8'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(utf8)"; binmode STDOUT, ":raw:encoding(shiftjis)"; # === blockA === open(IN, "<sjis.txt"); @lines = <IN>; close(IN); # ============== # === blockB === # $a = "~"; # push(@lines, $a); # ============== for(@lines) {  if (/~/) {   print "WAVEDASH発見\n";  } } #============================================= ※いわゆるWAVEDASH問題に起因してそうだな、  というのはわかりますが、具体的に何が起きて  いるのかが理解できません。 原因や、どうすればこの問題を解決できるか、 ご存知の方、お知恵をお貸しください。

    • ベストアンサー
    • Perl
  • WindowsでUTF-8のPerlスクリプトを実行する場合。。。

    お世話になります。 2006年に発行された「まるごとPerl」というムックの「まるごとEncode」という記事を見て Perl の日本語処理の勉強をしています。 本記事は Perl5.8 対象と思われますが私は Strawberry Perl 5.10.0 を Windows XP SP3 で使っています。 #! perl # list1 -- 日本語の文字を1文字として解釈(UTF-8で保存) use strict; use warnings; use utf8; my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); というサンプルコードがあって、実行結果は「カタカナ」になると書いてあります。 要するに substr 関数が use utf8; によってバイト単位ではなくて文字単位で効くようになるので、4文字目から4文字が正しく取ってこられるという実験ですが、Windows の DOS 窓で実験すると、当然端末コードは Shift_JIS というか CP932 ですので、 Wide character in print at C:\Marugoto\list1.pl line 8. 繧ォ繧ソ繧ォ繝 となります。 そこで、上のコードに binmode 関数を足して、 #! perl # list1 -- 日本語の文字を1文字として解釈(UTF-8で保存) use strict; use warnings; use utf8; binmode STDOUT, ':encoding(cp932)'; # 追加 my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); とすると正しく動作しました。 次に、 #! perl # list2 -- 1オクテットを1文字として解釈(UTF-8で保存) use strict; use warnings; my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 9, 12); というリストがあって、今度は use utf8; がないのでバイトモードで使う(substr 関数は 9 バイト目から 12 バイトを取ってくる。UTF-8 は全角日本語文字が1文字3バイトなので)という実験ですが、これもそのまま DOS 窓で実行すると 繧ォ繧ソ繧ォ繝 となるので、さっきと同じように binmode 関数を使って、 #! perl # list2 -- 1オクテットを1文字として解釈(UTF-8で保存) use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 9, 12); と書いたのですが、 ・\x{0082}" does not map to cp932. "\x{0082}" does not map to cp932. "\x{00bf}" does not map to cp932. "\x{0082}" does not map to cp932. "\x{0083}" does not map to cp932. "\x{008a}" does not map to cp932. a\x{0082}≪a\x{0082}\x{00bf}a\x{0082}≪a\x{0083}\x{008a} のようになりました。 もちろん、プログラムを Shift_JIS で保存して substr($text, 6, 8) とすれば正しく実行できますが、プログラムを UTF-8 で保存しつつ、Windows で正しく表示する方法はあるでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlからchasenの使い方

    windowsで茶筅を使って形態素解析を行いたいのですがエラーが出てうまくいきません。 ■プログラム(cha.pl) #!/usr/bin/perl -w use Text::ChaSen; $value = '私はとても学校が嫌い。'; $res = Text::ChaSen::getopt_argv('cha.pl','-j'); $str = Text::ChaSen::sparse_tostr($value); print "$str"; exit; ■エラー Can't locate loadable object for module Text::ChaSen in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at cha.pl line 3 Compilation failed in require at cha.pl line 3. BEGIN failed--compilation aborted at cha.pl line 3. もし良かったらアドバイスお願いします。 Makefile.plのWriteMakefileには 'LD' => 'c++' を追加しました。

    • ベストアンサー
    • Perl
  • {ブロック}の外でのみ use utf8; したいのだが・・・

    連投申し訳ありません。 「まるごとPerl」(2006年9月、インプレス刊)という本の「まるごとEncode」という記事に従ってEncodeの勉強をしています。 原記事は UNIX(というか端末コードをUTF-8に出来る環境)ですが、それをWindowsに移植しようとして苦労しています。 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); # カタカナと表示されたい __END__ というプログラムを実行すると C:\>list3.pl カタカナカタカナ と表示されてほしいのですが、 C:\>list3.pl Cannot decode string with wide characters at C:/strawberry/perl/lib/Encode.pm li ne 174. と表示されます。 use utf8 を後ろにズラして #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } # ブロックの外側ではUTF-8文字単位で解釈される use utf8; # 移動 my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); # カタカナと表示されたい __END__ とするとうまく動いて C:\>list3.pl カタカナカタカナ と表示されます。 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動 print substr($text, 3, 4); # カタカナと表示されたい # 移動 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } __END__ のようにするとやはり最初と同じエラーになりますが、 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動 print substr($text, 3, 4); # カタカナと表示されたい # 移動 no utf8; # 追加 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } __END__ だと大丈夫です。 結果として、ブロックの外で use utf8;、中では use bytes; という記事の著者の意図通りに動作しないようで、ブロックの中まで use utf8; が効いているようです・・・。 これは Perl の実装が変わったのでしょうか。 使用しているのは Windows XP Home SP3+Strawberry Perl v5.10.0 です。

    • ベストアンサー
    • Perl
  • [perl5.8] utf8で文字出力すると文字化けする

    perl5.8で、テキストをunicode(utf8)で出力したのですが、文字化けします。 ソースは以下のとおりです。 -----ソース----- use open OUT => ":encoding(utf8)"; open(OUT, ">utf8.txt"); print OUT "utf8だよ\n"; close(OUT); ----------------- できたファイルはutf8エンコードなのですが、 エディタで見ると「だよ」が文字化けします。 ちなみにフリーソフトで、SJIS形式の「utf8だよ」が 書かれたファイルをutf8に変換すると、文字化けしません。 フリーソフトで生成したutf8ファイルと、 自作perlで生成したutf8ファイルとを バイナリエディタで読込み比較すると 75746638E381A0E382880D0A (フリーソフト) 75746638C282C2BEC282C3A60D0A (自作perl) という差が出ています。 原因がお分かりになる方、知恵をお貸し願えますか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlを使って英文だけを取り出したい。(UTF-8の場合)

    perlを使って英文だけを取り出したい。(UTF-8の場合) 下記perlは、UTF-8で記述されています。 この場合、$str1のように、英文が混じっています。 その中から、英語だけの文字を取り出すことは、できないでしょうか? もし、簡単なサブルーチンなどご存知でしたら教えてください。 宜しくお願い致します。 $str1 = "さま z a マ な mo じ が ハイ っ ています。"; $str2 = &omit($str1); sub omit{ } print "$str2"; 結果出力 --------- z a mo

    • ベストアンサー
    • Perl
  • (Perl CPAN) DBDがはいらない

    「windows7 64bit に ActivePerl をいれています」 以下のプログラムを書いて実行したところ、エラーメッセージがでてきました。 Software error: DBD::MySQL initialisation failed: Can't locate object method "driver" via package "DBD::MySQL" at C:/usr/local/lib/DBI.pm line 808. Perhaps the capitalisation of DBD 'MySQL' isn't right. at C:/Apache2.2/htdocs/00001/shinki_data_sakusei.pl line 33. これはつまり、DBD::MySQL がないよ!という意味であると思うのですが、ppmを起動してDBDにあたるモジュールをインストールして再実行してもまだ同じエラーがでます。どうしてもwindows7上で作らなければならないので、困っています。どこか参考になるサイトはないでしょうか? ========================================= use strict; use warnings; # エラーをブラウザに表示 use CGI::Carp qw(fatalsToBrowser); use utf8; binmode STDIN, ':encoding(UTF-8)'; binmode STDOUT, ':encoding(UTF-8)'; binmode STDERR, ':encoding(UTF-8)'; use Encode; use DBI; # プログラム開始 # ユーザ名とパスワード my $user = 'root'; my $pass = 'root'; #データベースへ接続 my $db = DBI->connect('DBI:MySQL:localhost', $user, $pass,); if ( ! $db ){ print "エラー: $db->err $db->errstr\n"; } # 命令 my $sth = $db->prepare( "SELECT * FROM login" ); # 実行 $sth->execute; # 出力 while( my @row = $sth->fetchrow_array ){ print "@row\n"; } #データベースから切断 $db->disconnect; __END__

    • ベストアンサー
    • Perl

専門家に質問してみよう