Perl用のandandはありますか?

andand perl

もっとやりたいのですが。

$ shop-> ShopperDueDate-> andand-> day_name();と言う。

対 この:

$ shop-> ShopperDueDate-> day_name()の場合、$ shop-> ShopperDueDate;とします。

何か案は?

(このアイデアはRubyの andand拡張機能に触発されています。)

(実際にはGroovy言語に触発されていますが、ほとんどの人はそれを知りません;-)

  • update *:maybe()とeval \ {}の両方が良い解決策だと思います。 これはルビーではないので、私はとにかく左から右へすべてのメソッド/関数を読むことを期待することができないので、多分確かに助けになるかもしれません。 そしてそれからもちろんevalは本当にそれをするためのperlの方法です。

  4  3


ベストアンサー

未定義の引数でメソッドを呼び出そうとした場合も含めて、Perlの `eval`ステートメントを使って例外をキャッチすることができます。

eval {
    say $shop->ShopperDueDate->day_name();
};

eval`は最後に評価された文を返すか、失敗した場合には undef`を返すので、曜日名を次のように変数に記録することができます。

my $day_name = eval { $shop->ShopperDueDate->day_name(); };

実際に例外を調べたいのなら、特別な変数 `$ @`を調べることができます。 これは通常Perlの組み込み例外の単純な文字列ですが、例外がhttp://search.cpan.org/perldoc?autodie[autodie]またはその他のオブジェクト例外を使用するコードから発生した場合は、完全な例外オブジェクトになることがあります。

eval {
    say $shop->ShopperDueDate->day_name();
};

if ([email protected]) {
    say "The error was: [email protected]";
}

`eval`ブロックを使って一連のコマンドをつなぎ合わせることも可能です。 次の例は、 `$ day_name`を検索するときに例外がスローされていなければ、週末かどうかをチェックするだけです。

eval {
    my $day_name = $shop->ShopperDueDate->day_name();

    if ($day_name ~~ [ 'Saturday', 'Sunday' ] ) {
        say "I like weekends";
    }
};

evalは他の言語のtryと同じであると考えることができます。実際、CPANのhttp://search.cpan.org/perldoc?Error[Error]モジュールを使用している場合は、「try」と綴ることもできます。 ブロック形式のeval(これは私が上で説明してきた)にはパフォーマンス上のペナルティが伴うことはなく、残りのコードとともにコンパイルされることも注目に値します。 `eval`の文字列形式(これは私が示していません)はまったく異なる獣であり、もしあるとしても控えめに使うべきです。

`eval`は技術的にはPerlの文であると考えられているので、ブロックの終わりにセミコロンが表示される数少ない場所の1つです。 あなたが定期的に `eval`を使わないのなら、これらを忘れるのは簡単です。

ポール

9


私はあなたの2番目の例がより良いはずだと思います:

say $shop->ShopperDueDate ? $shop->ShopperDueDate->day_name() : undef;

それが実際に言うことの代わりに。

とにかく、 `undef`はオブジェクトではなく、単項演算子ではないので、ソースフィルタなしではその構文で_exactly_することはできません。したがって、メソッドを持つことはできません。

代わりに、これを検討してください。

package noop;
our $maybe = bless [], 'noop';
sub AUTOLOAD { undef };
この `$ noop

maybe`はオブジェクトです。しかし、そのメソッドはすべて `undef`を返します。 他の場所では、このような通常の関数があります。

sub maybe { $_[0] || $noop::maybe; }

それからあなたはこれを書くことができます:

say maybe($shop->ShopperDueDate)->day_name()
trueの場合は “maybe”が引数を返すので、これはうまくいきます。そうでなければ常にundefを返すメソッドを持つ `$ noop

maybe`オブジェクトを返します。

EDIT:訂正しました! ` – > andand→`シンタックスは、Perlの内部構造で巧みに動くhttp://search.cpan.org/src/CHOCOLATE/autobox-2.55/autobox.xs [XS]を使用することによって、ソースフィルタなしで持つことができる。 https://stackoverflow.com/questions/422837/is-there-an-andand-for-perl#424902 [Leon Timmermans]はこのルートをたどる実装をしました。 これは `undef()`関数をグローバルに置き換えるもので、私のメソッドよりはるかに遅くなる可能性があります。

9


私はちょうどそれを書いたと思います。 CPANにアップロードしたところです。 here

4


(未テスト)のようなもの:

Object :: Generic :: Falseを使用してください。 sub UNIVERSAL :: andand {$ _ [0] || Object :: Generic :: False  - > false}

UNIVERSALは自動的に他のすべてのクラスのサブクラスになるので、これはandandをすべてのオブジェクトに提供します。 (明らかにUNIVERSALでメソッドを作成することは矛盾や意外な行動の可能性があるので、不用意に使われるべきではありません。)andandメソッドが呼ばれるオブジェクトが本当なら、それを返してください。それ以外の場合は、それに対して使用されたメソッド呼び出しに対してそれ自身を返す汎用のfalseオブジェクトを返します。

0


タイトルとURLをコピーしました