オブジェクト? perlをオーバーライドする方法?

このQ&Aのポイント
  • Perl5.6での文字コード変換機能の問題を解決するために、既存のprint、getc、read、write関数をオーバーライドする方法はあるのか?
  • Perl5.6と5.8を同じにするために、PerlIOの自動変換機能を5.6でも使いたい。しかし、if文でバージョンを判定するのではなく、関数をオーバーライドする方法はないか?
  • 外部がeucでperl処理がutf8の場合に、文字コード変換を行うために既存の関数をオーバーライドする方法はあるのか?
回答を見る
  • ベストアンサー

オブジェクト? perlをオーバーライドする方法?

perl 5.6を使っております。 Perl5.8では PerlIOが入出力の際に文字コードを自動変換しているのですが この機能を5.6でもスクリプト互換で使いたい(スクリプトを5.6と5.8を同じにする)のですが、 既存のprint, getc, read, write関数をオーバーライド?することは可能でしょうか? 一々、if(5.8 <= $])としたくないためです。 例えば、外部がeucでperl処理がutf8の場合 sub getc{ return Jcode->new(...)->utf8; } sub print{ return Jcode->new(...)->euc; } sub read{ return Jcode->new(...)->utf8; } sub write{ return Jcode->new(...)->euc; }

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>既存のprint, getc, read, write関数をオーバーライド?することは可能でしょうか? printは、オーバーライドすることができません。 それ以外は、置き換えることができます。

参考URL:
http://okweb.jp/kotaeru.php3?qid=1150465

関連するQ&A

  • Perlでオーバーライド?

    perlでオーバーロードやオーバーライドのようなことがしたいのですが、可能でしょうか? 今はオーバーロードのようなことをしたいのですが Encodeのdecode関数で sub decode{ return Encode::is_utf8($_) ? $_ : encode($_); } のようなことがしたいです。しかし上の例では再帰になります。

    • ベストアンサー
    • Perl
  • オーバーライドについて

    perlの出力結果を加工するため、ラクダ本を読んでprint関数のオーバーライドに挑戦したのですが、 どうしてもうまくいきません。 BEGIN { *CORE::GLOBAL::print = sub{ 1 }; }; print 2; の様にやっても、2が出力されてしまいます。 他の関数ではこの方法で動くようでした。 printはオーバーライドできないのでしょうか。 マニアックな質問かもしれませんが、よろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlでUTF8をEUCに変換

    こんにちは、お力を貸して下さい。 OSX上で日本語のファイル名を取得し そのファイル名をeucに変換しようとすると 半濁音付きのカナが文字化けを起こしてしまうのです。 Web上で “$euc = Jcode($euc, 'utf8')->z2h->h2z->euc;” で、できないこともないみたいだったので、さっそくやってみたんですが… 変換したいファイル名は、「1ドキュメント」とします。 -------------------------------------- #!/usr/bin/perl use strict; use Jcode; my $path = "パスがはいっている"; my @files; opendir DIR, $path; @files = grep /^1/ && -f "$path/$_", readdir(DIR); closedir DIR; foreach (@files) { my $euc = $_; $euc = Jcode->new($euc, 'utf8')->z2h->h2z->euc; print "$euc\n"; } exit; -------------------------------------- 結果:1ト〓キュメント やっぱり文字化けしましたTT 新しい解決法がありましたら、よろしくお願いします。

    • ベストアンサー
    • Perl
  • Jcode.pmでconvertできない

    あけましておめでとうございます。 早速ですが、皆様のお力を拝借したく。 WindowsXPSP2+ActivePerl5.6.1でJcode.pmを使用して、utf8へ変換しようとしました。 http://okwave.jp/qa2600582.html を参考にJcode.pmを導入し(とある事情でインストールしておりません)、以下のソースを記述しました。 ちなみに"sjis"で記述しております。 #!/usr/local/bin/perl use lib "./lib"; use Jcode; $buf = "てすてすてす"; print "BeforeCode=".Jcode::getcode($buf)."\n"; Jcode::convert( \$buf, "utf8"); #$j = Jcode->new($buf); #$buf = $j->utf8; print "$buf\n"; print "AfterCode=".Jcode::getcode($buf)."\n"; exit; すると BeforeCode=sjis AfterCode=euc と表示され、"utf8"を指定したにも関わらず、"euc"に変換されてしまいました。 次に、上記ソースの中ほどを #Jcode::convert( \$buf, "utf8"); $j = Jcode->new($buf); $buf = $j->utf8; と書き換えてみました。すると、 BeforeCode=sjis Undefined subroutine &Jcode::_Classic::euc_utf8 called at lib/Jcode/_Classic.pm line 255. とエラーが出てしまいます。 見た感じeuc_utf8が存在しないと言われているようですが、Jcode\Unicode\NoXS.pmに存在しています。 環境に問題があるような気はしますが、どのようにすれば"utf8"への変換が成功するのでしょうか?ご教授いただければ幸いです。 ちなみに上記ソースで Jcode::convert( \$buf, "jis"); Jcode::convert( \$buf, "euc"); Jcode::convert( \$buf, "sjis"); はすべて成功し、指定した文字コードに変換されました。 "utf8"への変換だけが失敗するという状況で、新年早々頭を抱えております。

    • ベストアンサー
    • Perl
  • 機種依存文字(株)のコード変換について

    perlのバージョンがあがった関係で、jcode.plをJcode.pmに対応する為に記述方法の変更に奮闘中です 機種依存文字(株)に関してうまくいかないようで、下記のように文字化けしてしまいました 例1) $a="あ(株)";->あ+機種依存文字(株) Jcode::convert(\$a,'euc'); print"$a"; ->あ? 例2) $a="あ(株)";->あ+機種依存文字(株) $a= jcode($a)->h2z->euc; print"$a"; ->あ? 例3) $a="あ(株)";->あ+機種依存文字(株) $a = Jcode->new($a,"euc")->tr("あ","わ")->h2z->euc; print"$a"; ->わ? 各記述の後、$a内の機種依存文字(株)は?になってしまいます 機種依存文字(株)としてそのまま認識したいのですが、どのような記述にすればいいのかわかりません (機種依存文字(株)以外の文字化けはまだ調べていません) ※perl5.8.7では認識されず、以前のperlのバージョン5.005_03ではそのまま認識されています ご教授宜しく御願いします

    • ベストアンサー
    • Perl
  • perlで半角カナを検索するには、どうしたらいいのでしょうか?

    perl初心者です。 下記のようなファイルがあったとします。 パナソニック(ナショナル) 三菱電機 日立 東芝 SONY 下記のように、書きました while (<IN>) { use Jcode; Jcode::convert($_, 'euc'); chomp; $line+=1; Jcode::convert($_, 'euc'); if ($_=~ /\x8E/) { print "行=$line $_\n"; } } できあがったファイルは、下記のように、半角カナではなく、字化け状態になってしまいました。 行=2 姉鰭電機 行=4 東芝 よろしくお願い致します。

  • htmlとperlを記述する時の文字コードについて

    今からホームページを作成するところです。 やりたいこととして、 1.html全体はShift_JISで記述 2.Shift_JISのtxtファイルから検索をかけて該当レコードを表示させるページをperl(CGI)でhtmlとして出力 この場合perlはShift_JISで記述すると問題があるでしょうか? CGIでtxtファイルを操作したとき内部ではeuc-jpで扱われる為、入出力の際にはjcodeなどを使った相互変換が必要になるとか思いますが、こちらの問題は取りあえずおいておきます。 perl自体はやはりeuc-jpで記述すべきでしょうか? htmlも含めて全てeuc-jpで記述すれば問題ないかと思うのですが今後の参考の為に聞いておきたいと思い質問させて頂いております。 また、上記のやりたいことを実現するのにperl以外のもっと良い方法があればご紹介頂ければ幸いです。 何卒よろしくお願い致します。

    • ベストアンサー
    • Perl
  • MP3情報の表示

    Windowsで作ったMP3ファイルのタグ情報をちゃんと表示するためにPerlスクリプトを作っているのですが、 Jcodeでeucに変換する所でエラーになってしまいます。 どこをどう直せばちゃんと表示できるようになるのかわかる方がいらっしゃいましたら教えてください。 == mp3info.pl ====== #!/usr/local/bin/perl -w use MP3::Info; use Data::Dumper; usr Jcode; my $file = $ARGV[0]; my $tag = get_mp3tag($file); my $info = get_mp3info$file); my $jtag = jcode($tag)->euc; print Dumper($jtag, $info); ============ $./mp3info.pl aaa.mp3 $Not a SCALAR reference at /usr/lib/perl5/site_perl/5.6.1/i686-linux-multi/Jcode.pm line 579.

    • ベストアンサー
    • Perl
  • sendmailからblatjへ

    初めまして。 今cgiフォームメールがあるのですが、sendmail用で使われています。これをBlatjにソースを変えることはできるのでしょうか?cgi,perlは難しく、誰か教えて頂けないでしょうか?宜しくお願いします。 ソースは以下です。 sub _Send_mail { my ($fromaddress, $toaddress, $subject, $body) = @_; $fromaddress =~ s/\n//g; $fromaddress =~ s/\r//g; $toaddress =~ s/\n//g; $toaddress =~ s/\r//g; $toname =~ s/\n//g; $toname =~ s/\r//g; $subject =~ s/\n//g; $subject =~ s/\r//g; # $subject = encode("cp932", decode("utf-8", $subject)); # $body = encode("cp932", decode("utf-8", $body)); if($moji_code eq "UTF-8"){ $subject = Unicode::Japanese->new($subject)->sjis; $body = Unicode::Japanese->new($body)->sjis; $toaddress = Unicode::Japanese->new($toaddress)->sjis; } open(SENDMAIL, "|/usr/sbin/sendmail -t"); my $str = Jcode->new("From: $fromaddress\n")->mime_encode; $str .= Jcode->new("To: $toaddress\n")->mime_encode; $str .= Jcode->new("Subject: $subject\n")->mime_encode; $str .= "MIME-Version: 1.0\n"; $str .= "Content-Type: text/plain;charset=\"ISO-2022-JP\"\n"; print SENDMAIL $str; print SENDMAIL Jcode->new("$body")->jis; close(SENDMAIL); } __END__

    • 締切済み
    • CGI
  • 全角・半角が混じったテキストの100文字以上を"・・・"にしたい

    perl5.8.5でCGIのプログラムを作っています。 全角・半角が混じったテキストの100文字以上を"・・・"にしたいと思っています。 プログラムの文字コードはEUCで書いています。 文字数の取得は、Jcodeを使って出しています。 $len = Jcode->new( $text )->jlength; これで100文字以上なら100文字以上の部分を削除して"・・・"を付け足すという感じにしたいと思っています。 よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう