• ベストアンサー

perl5.8.6日本語の置換について

hikominの回答

  • ベストアンサー
  • hikomin
  • ベストアンサー率63% (40/63)
回答No.3

from_toは、オクテット列からオクテット列への変換を行ないます。内部のリテラルは内部コードになっていますので、従って良い結果は得られないのではないでしょうか。 えーと、私はuse utf8;環境で慣れているので、ちょっとそれで書かせてもらいます。use encodingのほうは、申し訳ないですがご自分でお試しください。 例えば、(以下はUTF-8で保存します。) use utf8; (中略) $doc = decode( 'shiftjis', $doc ); # オクテット列ではなく、内部コードへデコード $doc =~/<tr><td><pre>(.+)<?/pre><?/td><?/tr>/s; $doc = $1; $doc =~s/」/ /g; $doc =~s/パーセント/%/g; $doc =~tr/[0-9]/[0-9]/; $doc = encode( 'euc-jp', $doc); # 内部コードからオクテット列へエンコード $doc; # 補注:試していないのでチェックしてください。 ちなみに、use utf8;環境下のリテラルにはutf8フラグが立っていますので、他バイト文字も1文字と認識されます。従って$doc =~ tr/[0-9]/[0-9]/;もキチンと動作します。 他がeuc-jpということですが、PerlIOレイヤーで入出力を押さえてしまえば、周囲のコードとかはあまり関係ありません。ただ、やはり気持ちの問題がありますので、use encoding 'euc-jp';でも試してみてください。

hiyoko_rc
質問者

お礼

ありがとうございました。 教えていただいたものをベースにencoding='euc-jp'で 調整してみました。use utf-8 を外したところ、trは ダメで、s///gでひとつずつ置換することになりました。 けれど、ほぼねらいどおりの動作はできたので、満足し ています。 どうもお世話になりました。

関連するQ&A

  • Perl:ドイツ語のウムラウト文字の置換ができなくて困っています

    Perl初心者です。ドイツ語のウムラウト文字の置換ができなくて困っています。 環境はWindowsXP + ActivePerl v.5.8.7 です。 以下のスクリプトを実行しています。 === use strict; use warnings; use encoding 'utf8'; my $txt = "*"; print "Pre: $txt\n"; $txt =~ s/*/a/; #置換 print "After: $txt\n"; === *にアルファベットや日本語を入れたときは、"a"に置換されるのですが、 ドイツ語の"アーウムラウト"を入れると置換されません。 文字コードを調べたりしたのですが、解決策が見つからずにこまっています。 きっと、基本的なことがわかっていないのだと思います。 お助けください。

    • ベストアンサー
    • Perl
  • perlで全ての文字コードをeucJPで扱う

    ネットで検索しながら、表題のことをやろうとしているのですがうまくいきません。 やりたいことは、eucJPのファイルを読み込み、必要な分だけを整形して取り出し eucJPのファイルとして出力したいです。(少し追記も必要です) 根本的なところが理解できていないので、困っているのですが、 以下のようなコードを組み合わせて試してみています。 use encoding "euc-jp" binmode STDERR, ":encoding(euc-jp)"; (STDINとかSTDOUTも指定してみたりしました) perlを使う場合には、cat input.txt | hoge.pl > output.txtとしています 環境は、Ubuntuを使っていて、perlのバージョンは5.10.0となっています。 なにかアドバイスか参考URLあればお願い致します。

  • perlで辞書データを置換

    perl超初心者です。 初めて組んで行き詰りました。 辞書データから不必要なものを取ろうと 思いましたが、いきなり[ファイルを開く] で止まってます。 以下がそうです。 use utf8; binmode STDIN, ":encoding(cp932)"; binmode STDOUT, ":encoding(cp932)"; open(DIC, "+<", "pdic2csv.csv") or die("Error:$!"); @array = <DIC>; $a = ~ s|" / "|"_"|g; @array = ("\,","\\","\s",1,2,3); $a = ~ s/1,2,3/"_"/g; $a = ~ s|" /// "|"\,"|g; close(DIC) ----------------- 使う辞書データは以下です。 うつる /// 건너다 / [綴り]ㄱㅓㄴㄴㅓㄷㅏ うつわ /// 그릇 / 그릇は,(~)杯, \ cf. 잔 うで /// 팔 よろしくお願いします。

  • Perlの文字コード

    1-2年ほど前、Perl5.8でソース自体をUTF8N(LF)で記述するようになり、 以下のように書いていました。 use utf8; use encoding "utf8"; use Encoding; それからPHPに移り、PHPでは、ソースはEUC-JP、DBもEUC、HTMLに出力する際もEUC-JPで統一していました。 最近またperlを使い出して疑問に思ったのですが、 perlではどのような文字コードで統一すれば一番よいのかということです。 javascriptはUTFだと動作しない端末(ザウルス)などあり、 perlもEUC-JPで統一しようと考えています。 昔、UTF8にこだわったのは、おそらく 「構」という文字は5Cなので、 文字コードによる不具合(ソース,js,cssで)を避けるためと、流行のUTF8にしたと思います。 perlでEUC-JPで文字コード統一させるメリットデメリットが知りたいです。 最近perlで書かれたサイトでHTML出力がShift_JISだったのですが、perlソースもシフトJISかは知りませんが、Shift_JISで統一するデメリットが知りたいです。 あと、WEBでどの文字コードが現在主流で、今後どうなるかも知りたいです。 EUC-JPで安泰なら、話は早いですが・・・

    • ベストアンサー
    • Perl
  • Perlの文字コードを意識したファイルの読み込み方

    perl5.8でファイルを読み込む場合、文字コードを意識した以下のような呼び方("<:euc-jp")があるのですが この方法で読み込んだ$datの中身はperlの内部コード(UTF8)になっているということでしょうか? それとも、普通に("<")で読み込んで$dat = Encode::decode("euc-jp", $dat);とすべきでしょうか? use utf8; use Encode; my $fname = "test.txt"; # 文字コードがEUC-JP my $dat = ""; open(IN, "<:euc-jp", "$fname) or die "open error!"; flock(IN, 2); while(<IN>){ $dat .= $_; } close(IN);

    • ベストアンサー
    • Perl
  • Perl 速度について

    あるサイトの情報を取得するのに ソースを組んで、なんとかできたのですが、 時間がかかってる気がします。 ページ数 約300ページくらい読み込んでいて その中でも、 250ページほど、正規表現で、一部抜粋し、保存させているのですが、 ここが遅いです。 保存した容量は、 1個につき2kb~20kb 平均8kbほど 下記のような、ソースの箇所が明らかに遅い気がします。 my @words; while ($content =~ m#<td.*?>(.+?)</td>#gs) { my $word = $1; $word =~ s/<.+?>//g; $word =~ s/(\r|\n)+/\,/g; $word =~ s/,+//g; for( my $year=2010; $year<2017; $year++ ){ $word =~ s/$year\//\n$year\//g; } from_to($word,"euc-jp","utf8"); utf8::decode($word); push(@words, $word) if $word; } @Word = join(',', @words) . "\n"; print @Word; open(FILE, ">","$DATA[$i].txt") or die("error :$!"); flock(FILE, 2); print FILE @Word; close FILE; 内容が多いからでしょうか? だいたい10分近くかかっております。 パソコンもcore i3と古い Windows7を使用しています。 そんなものでしょうか? もしくは、速くする方法はありますか?

    • ベストアンサー
    • Perl
  • perlでhtmlファイルを取得したいのですが

    perlでmixiなどログイン処理のあるサイトのhtmlファイルを取得したいのですがなかなか上手くいきません。 どなたかご教授をお願いします。 ----------------------------------------------------------------- #!/usr/bin/perl use LWP::UserAgent; use HTTP::Cookies; use HTTP::Request::Common; use LWP::Simple; my $mixi_email = 'メールアドレス@yahoo.co.jp'; my $mixi_password = 'パスワード'; my $login_url = 'http://mixi.jp/login.pl'; my $home_url = 'http://mixi.jp/home.pl'; my $mixi = LWP::UserAgent->new($mixi_email, $mixi_password); #Cookieを有効にする# my $cookie = sprintf('cookie_%s_%s.txt', $$, time); my $cookie_jar = HTTP::Cookies->new(file => $cookie, ignore_discard => 1); $mixi->cookie_jar($cookie_jar); #ログインする# my @form = ('email' => $mixi_email, 'password' => $mixi_password, 'next_url' => $home_url);#POSTで送る内容の配列 my $request1 = &HTTP::Request::Common::POST($login_url, [@form]); #リクエストヘッダの生成 my $response1 = $mixi->request($request1); #ログインする getstore("http://mixi.jp/search_community.pl?from=global(取得先の指定)", "test.html"); ---------------------------------------------------------------------- 試しに書いてみたのですがうまくいきませんでした

  • perlの日本語文字コードはどうすべき?

    perlで細かいことを理解できないままに呪文のように頭に require 'cgi-lib.pl'; require 'jcode.pl'; を使っていました。 そのうち文字化けなどの問題も出て、いろいろ調べたり質問したりして、jcode.plは古いからJcode.pmを使いなさいと指摘を受けたので、 require 'cgi-lib.pl'; require 'Jcode.pm'; と呪文変更を行いましたが、これについての使い方を理解せぬうちに、use Encode qw(from_to encode);としなさいと指摘を受け、 require 'cgi-lib.pl'; use Encode qw(from_to encode); と変えて使っていました。 ところが、このパターンを使っていたところ、GETでのデータの受渡がうまくできない(internal server error)となることに気づきました。 2つ目のパターンでも同じでした local($key,$val); undef(%in); &ReadParse; my($method) = $ENV{'REQUEST_METHOD'}; if ($method eq "GET"){ $QUERY_DATA = $ENV{'QUERY_STRING'}; }elsif ($method eq 'POST'){ read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'}); }else{ &error; } データの受信はこのようにはじめています。 そもそもJcode.pmやuse Encode qw(from_to encode);というのはjcode.plに変わる日本語変換のパッケージなのでしょうか? また、 require 'cgi-lib.pl'; require 'jcode.pl'; use Encode qw(from_to encode); とするとGETでの受渡も問題なかったのですが、2つを混在させても問題ないのでしょうか? というのも、メール送信で文字変換させるときに sub jis{ my $msg = $_[0]; Encode::from_to($msg, "shiftjis", "iso-2022-jp"); return $msg; } としているので、use Encode qw(from_to encode);がないとEncode::from_to()が使えないのかなと想像し2つをセットで使用しています。(冒頭でuse Encode qw(from_to encode)を宣言し、変換部分でEncode::from_to()を使用) jcode.pl、Jcode.pm、use Encode qw(from_to encode)、Encode::from_to()の関係について教えてください。 もちろん自分でもネットで調べてみましたが、思うように解説してあるところが見つからず困っています。

    • ベストアンサー
    • Perl
  • [perl5.8] SJISで出力したはずのファイルにutf8フラグが

    1)SJISで以下の2行を含むファイルを作成し、   sjis.txtという名前で保存します。 "ホツカイドウ" "北海道" 2)SJISで以下のスクリプトを作成します。 #=== one.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis.txt'; my $outfile = 'sjis2.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print OU @lines; close(OU); 3)SJIJSで以下のスクリプトを作成します #=== two.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis2.txt'; my $outfile = 'sjis3.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print @lines; close(OU); 4)one.pl を実行し、続いてtwo.plを実行すると 以下のエラーがコマンドプロンプトに表示されます。 #------------------------------------------- D:\zipcode\utf8mondai>two.pl Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "・趣セゑスカ・イ・・セ橸スウ" Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "蛹玲オキ驕・ これは何故なのでしょうか。 エラーメッセージは、printしようとしている 文字列にutf8フラグがついているという意味 らしいです。

    • ベストアンサー
    • Perl
  • 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