• ベストアンサー

overloadの使い方

演算子のオーバーロードを行うパッケージ「overload」の使い方を教えてください。 例えば、 2 + 3 のような加法演算子「+」をオーバーロードして減法演算子にし、 -1 と出力させるには、どのように書けばよいのでしょうか? http://perldoc.jp/docs/perl/5.6.1/overload.pod 上記のperldocの日本語訳を読みましたが、理解するに至っていません。 どなたか、簡単にご説明頂けないでしょうか。ご教示よろしくお願い致します。

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

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

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

手元の「プログラミングPerl」 (O'reilly) を見ながら, っと. まず次のようなモジュール foo.pm を作ります: -------------------- ここから -------------------- package foo; use overload '+' => \&add_foo, q("") => \&stringify; sub import { overload::constant integer => \&make_foo, float => \&make_foo; } sub unimport { overload::remove_constant integer => \&make_foo, float => \&make_foo; } sub make_foo { bless { val => $_[1] }; } sub add_foo { my ($foo1, $foo2) = @_; bless { val => $foo1->{val} - $foo2->{val} }; } sub stringify { $_[0]{val}; } 1; -------------------- ここまで -------------------- これを使って次のような test.pl を作ると -------------------- ここから -------------------- use strict; use foo; print 1+2, "\n"; -------------------- ここまで -------------------- めでたく期待通りの結果.

_--_--_-_-
質問者

お礼

早速試してみました。 大変ご丁寧にお教え頂き、本当に助かりました。 是非とも活用していきたいと思います。 ご回答有難うございました。

その他の回答 (1)

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

「本当にそうしたい」とすると, ・integer を overload して整数表現からオブジェクトを作る ・そのオブジェクトに対し + を overload して実際の処理を定義する という 2段階が必要な気がします... が, なんでそんなことしたいんだろう?

_--_--_-_-
質問者

お礼

動機は、単なる好奇心に過ぎません。 できれば、実際のコードをお教え頂ければ幸いですが、非常に参考になりました。 頑張って勉強します。 ご回答有難うございました。

関連するQ&A

  • log2の「正確な」計算方法

    perlでlog2を計算するにはどのようにしたらよいのでしょうか。 perldocによると sub log2 { my $n =shift; return log($n)/log(2); } でよいはずですが、log2 が「正しく整数を返すかどうか」は保証されていないので、時として問題があるようです。 通常、log2 の結果 $a を単に print $a などとして出力する分には Perl が適当? に判断して丸め処理をしてる傾向があるようですが、これを printf "%d", $a とすると、本当に整数部だけが出力され、演算精度によっては意図 しない数値になる場合があるとのこと、計算機環境にインストール した Perlで、演算精度を上げるオプションを追加した場合などで、実際に出力結果が異なる、との報告を受けました。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 関数が使えない

    関数が使えない状態になっており、困っています。 メッセージは下記が出ています。 Can't locate object method "%s" via package "%s" そのパッケージにも、基底クラスにも、該当のメソッドが定義されていないとうことのようですが、 使おうとしている関数が所属しているパッケージを、しっかりとuse しています。 また、「perlobj manpage」というページに情報があるらしいというのを情報として得たのですが、↓ http://fleur.hio.jp/perldoc/mix/pod/perlobj.html 「Can't locate object method」ということに関係している箇所みつからず、また、ここに書かれている内容は難しく情報があまり得られませんでした。 宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • Class::DBIの使い方を教えてください!

    いつも参考にさせていただいています。 私はperlを勉強しています。そこで今度Class::DBIを使うことになりました。 最初検索して↓ http://perldoc.jp/docs/modules/Class-DBI-0.96/lib/Class/DBI.pod は確認しました。 でも実際の使い方を初心者向けに解説しているサイトがなく。。。 いいサイトをご存知の方、教えてください。

  • どうしてそうなるのかわからない

    perlでカレンダーを出力したいと思い検索すると下記のページがヒットしました Calendar::Simple - シンプルなカレンダーを作る為のPerl拡張 http://perldoc.jp/docs/modules/Calendar-Simple-1.07/Simple.pod このページにCalendar::Simpleを使ったサンプルが提示されているのですが、その動作が理解できません。最後の部分なのですが foreach (@month) { print map { $_ ? sprintf "%2d ", $_ : ' ' } @$_; print "\n"; } @$_というのがわかりません。手元のポケットリファレンスには載っていませんでした。@$_はここでは@monthのことを指しているのでしょうか? とすると、まず@monthから一個要素を取り出して、そこに値が存在すればsprintfするということでよいでしょうか? もうひとつあります。@monthの中に何が入っているのか調べようと、 print @month[1]; とすると ARRAY(0x1afe81c)ARRAY(0x1afea20)ARRAY(0x1afe81c)ARRAY(0x1afea20)ARRAY(0x1afe81c) と意味不明な文字列が出力されます。これはどういうことなのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • セッションデータの使い方など

    http://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.podを読みながら、セッションについて勉強しています。セッションIDはだいたい理解しました。セッションデータは、具体的にどのようなデータが格納され、どのように使用するものなのでしょうか?

    • ベストアンサー
    • CGI
  • (visual)C++から(active)perlを呼ぶ

    Vista sp1 64 bit, visual C++ 2008 express, active perl 5.1を使用しています。 しばらくの間active perlを使ってテキスト処理のスクリプトを書き溜めてきました。 最近になってC++ を使うようになり、今後はC++中心にプログラミングをしていこうと思っています。 ただ、これまで書き溜めたperlスクリプトをどうにかしてC++で再利用できないかと思っています。またテキスト処理に関してはC++よりやはりperl が優れていると感じ、C++ のプログラムを主体として必要に応じてその中にperlのスクリプトを組み込みたいと考えています。 たとえばテキストファイルを読み込みや最終的な出力するのはメインのC++で書き、各行のテキスト処理はC++からperlのサブルーチンにデータを渡して処理するというような形です。 perlのドキュメントを見る限りではperlembedがこの目的に適しているようでした。 http://perldoc.jp/docs/perl/5.10.0/perlembed.pod サンプルコードなども書いてあるのですが、どうやらunix環境、gcc(?)の例のみのようです。 windows環境でvisual C++ とactive perlを用いて C++からperlを呼び出すようなプログラムを書くにはvisual c++の設定をどのようにしたらよいでしょうか?

  • ペアノの公理の5番目の公理(いわゆる数学的帰納法)

    ペアノの公理の5番目の公理(いわゆる数学的帰納法の原理)について、 なぜこれが自然数の定義に必要なのか気になって、考えたり調べたりしています。 (つまり、1~4の公理だけでは何が不十分なのかについてです) そんな中、自然数の加法を定義するときに公理5が必要であるということを聞きました。自然数の加法を定義するときに公理5が必要な理由について、 ご教示、またはアドバイスいただけないでしょうか。 もうすこし具体的には、 N=(N,S,0) S:successorの写像 において、以下のように加法(二項演算a)を定義するとき (i) a(x,0) = x (ii) a(x,S(y)) = S(a(x,y)) この(ii)の定義の際に必要だと思いますが、 どのように第五公理が効いているのかが理解できていません。

  • 正規表現 regular renamerで単語先頭1文字目だけを大文字にしたい

    http://www.geocities.jp/nanasiya3/app.html#REGULAR-RENAMER 上記のregular renamerというソフト(正規表現ライブラリはBREGEXP.DLLで、Perl の tr/// 演算子を利用することもできるそうです)で半角英数字の単語先頭一文字目だけを大文字に変換したいんです。正規表現でどのように表現すればいいのでしょうか?そもそも可能かどうかも分かっていないのですが、宜しければご教示下さい。

  • Net::FTP使用時の取得値をどうやって取得するのですか

    perlでftpをしたいので調べたら以下のようなページを見つけました。 http://perldoc.jp/docs/modules/libnet-1.12/Net/FTP.pod 接続 $ftp = Net::FTP->new("some.host.name", Debug => 0); ログイン $ftp->login("anonymous",'-anonymous@'); のようにしていけばいいのはわかったのですがpwdなどのコマンドの場合 「返します」と書いてあるんですが、どうすれば取得できるのかわかりません。 たとえばpwdであれば $ftp->pwd(); だと思うのですが、その結果はどうとるのでしょうか・・・ $ftpのなかかと思ったのですが、 print $ftp とすると Net::FTP=GLOB(0x8067224) と出てきました・・・ あとコネクトも成功、失敗はどうしたらわかるのでしょうか。

    • ベストアンサー
    • Perl
  • ソラリス8のperl5.8が漢字を正しく表現しない

    Solaris8(SPARC)にperl5.80をインストールしました。 下記スクリプトを実行すると ------------------------------ #!/usr/local/bin/perl use encoding "sjis"; printf("噂のC言語\n"); ------------------------------ 出力される文字が 奄フC言語 となってしまいます。 漢字コードはシフトJIS(ja_JP.PCK)を設定しています。 上記スクリプトは、Windows-2000上のperl5.80では、 正しく「噂のC言語」と出力されます。 同一条件(soralis8(SPARC) perl5.80 (ja_JP.PCK))で 正しく日本語を表示出来た方は、おりますでしょうか。 また、この文字化けの改修方法をご存じの方、おりましたら教えてください。

専門家に質問してみよう