• ベストアンサー

Perlでオーバーライド?

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

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

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

#1>ラッパー風にPerlで書きたかったということです。 そういうことであれば、#1でも回答していますが、 パッケージ修飾すればいいと思います。 #1>具体的なトラブルはXMLから受け取ったデータをdecodeした時に、…というエラーが発生 使っているParser が正しくエンコードできていないとそういうエラーが発生します。 Parser によって対処が異なります。 Perl モジュールとして提供されているいくつかのParser では、例えばエレメントとしてワイド文字を使っていると想定していないものもあります。 最悪Parser を修正しないといけません。 場合によっては、エンコードを登録するだけで良いものもあります。

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

その他の回答 (1)

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

Perl でオーバーロードやオーバーライドのようなことは できるにはできると思いますが、 何がしたいのかよくわかりません。 オーバーロードということなので、引数の違うdecode を定義したいということのように思いますが、 単に自分のパッケージの中で、呼び出すようなラッパー関数を作るというような感じなのかなと思います。 質問のリスト中のencode は、decode の誤りなのですか? Encode::decode みたいな形でパッケージ修飾してやればいいんじゃないでしょうか(それでも 引数が合わないような気がしますが)

mine_23
質問者

お礼

回答ありがとうございます。 したいことは、デコードする前にデコードする必要があるかどうか調べて、必要あるならば、本来のデコードを行い、必要なければそのまま値を返すといったことをラッパー風にPerlで書きたかったということです。 オブジェクト指向を使わず、そのようなことが簡単にできればいいなと思い質問しました。 具体的なトラブルはXMLから受け取ったデータをdecodeした時に、 Cannot decode string with wide characters at C:/usr/local/lib/Encode.pm line 186. というエラーが発生し、ソースはすでにあちこちでdecodeを使っていますので、一箇所の暫定的な書き換えで対処できれば、管理しやすいためです。 また、今後の対策となるために、decodeの大元や、たくさん使っているdecodeの箇所を触りたくないためです。 >質問のリスト中のencode は、decode の誤りなのですか? 間違っていました。 is_utf8もそれでよかった自信なしです。

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

関連するQ&A

  • オブジェクト? 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
  • オーバーライドについて

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

    • ベストアンサー
    • Perl
  • Perlの5.8のデコードと from_to関数?

    UTF-8に不慣れで感じがまだ、つかめておりません。 ○ encode('shiftjis', decode('utf8', $utf_str)); とすると、正しく漢字が表示されましたが、 × encode('shiftjis', $utf_str)); とすると、?????などの文字列が表示されます。 $utf_strは UTF-8だと思いますが、 decode('utf8', $utf_str)が必要な理由はなんでしょうか? あと、Perl5.8では from_toがありますが上と同じ事を from_to($utf_str, "utf8", "shiftjis"); とできるということでしょうか?

    • ベストアンサー
    • Perl
  • Perl 禁止語句

    テキストの中に禁止語句一覧があります。 それと一致した場合、エラーを返すのですが、 現在のコードですと、 完全一致で、これを部分一致にする 方法を教えてください。 またコードの指摘があればよろしくお願いいたします! ◆ngword.txt◆ あい いう うえ えお ・ ・ ・ 1000行ほど(もっとあるかもしれません) ◆test.pl◆「UTF-8」 #/usr/bin/perl use Encode; my $Name = "え"; $Name = encode('cp932', decode('UTF-8', $Name)); open my $fh, '<', 'ngword.txt'; chomp(@ngword = <$fh>); if(&ban($Name, \@ngword)) { print "error\n"; } sub ban { my $body = shift; my $word = shift; $body =~ s/(\x0d\x0a|\x0a|\x0d|\n|\s|\x81\x41|\xff)//g; return map { $body =~ /$_/m } @$word; }

    • ベストアンサー
    • Perl
  • Perlの文字コード変換についての質問です。

    Perlの文字コード変換についての質問です。 ホームページ全体は、UTF-8で作成されています。 そのため、$qsは、どうも、S-JISのようなので、UTF-8に変換して URLデコードさせたいのですがうまくいきません。 文字化けしないで、UTF-8で作成されたページに表示させたいのですがどうすればよいでしょうか? 宜しくお願い致します。 ------------------------------------ $qs = $ENV{'QUERY_STRING'}; use Encode::Guess qw/ shiftjis /; use Encode qw/ decode /; $enc = guess_encoding ( $qs ); if ( ref $enc ) { $utf8 = decode ( $enc->name , $qs ); } $qs =~ tr/+/ /; $qs =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print "$qs";

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

    1.CTestDlgクラスを作成 class CTestDlg : public CDialog { // コンストラクション public: BOOL Create(CWnd *pWnd); CWnd * m_pParent; CTestDlg(CWnd* pParent = NULL); // 標準のコンストラクタ・ ・ 2.メンバ関数の定義 BOOL CTestDlg::Create(CWnd *pWnd) { m_pParent = pWnd; BOOL bret = CDialog::Create( CTestDlg::IDD, m_pParent); if( bret == TRUE) { this->ShowWindow( SW_SHOW); } return bret; 以上のような場合において、 1.Create(CWnd *pWnd)は、引数が異なるため virtual BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); をオーバーライドしたとは言わず、オーバーロードしたということで良いのでしょうか? 2.オーバーロードしたということであれば、 Create(CWnd *pWnd)と virtual BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); の両方の関数が使えると思っていたのですが、後者方は引数が異なるとエラーが出て使えませんでした。 どうしてなのでしょうか? 以上、2点についてご教授ください。

  • Perl utf8上でshiftjisをデコード

    以下の環境にてURLエンコード(shiftjis)された文字を、UTF8として ブラウザに表示させたいのですが、上手く表示されません。 環境: サーバ:linux apache レンタルサーバ ※Encode.pm、Jcode.pm無し。追加モジュールインストール不可。 Perl version: 5.006001 ソースエンコード:utf-8 実行ソース: ------------------------------------ use utf8; require 'jacode.pl'; # $mojiに予めURLエンコードされた文字が格納されています。 # 例として「マウス」デコード前(%83%7D%83E%83X)とします。 #URLデコード $moji =~ s/%(..)/pack("c",hex($1))/ge;  #デコードされたsjis文字をUTF8へコンバート jcode::convert(\$moji, "utf8","sjis"); print ($moji); ----------------------------------- 例のように「マウス」と言う文字が$mojiに格納されている場合、 以下のような文字化けとなってしまいます。 ツマ燿セツス 正常にマウスと表示させるにはどうすればよろしいのでしょうか。 アドバイスを宜しくお願いします。

    • ベストアンサー
    • 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 ========================= 質問: どのように修正すればよいか?

  • 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の文字変換について質問があります。 文字コードをJISからShift_JISに変換するには、下記のどれが正しい記述なのでしょうか? ・Encode::from_to($_, "jis", "shiftjis" ) ・encode("shiftjis", $_) ・encode("shiftjis", decode("utf8", $_)) 以上、よろしくお願い致します

    • ベストアンサー
    • Perl