0

2つの名前付きパラメーターのいずれかを受け取るメソッドがあり、そのうちの1つが存在する必要がある場合、Params :: Validateを使用してそれを処理する方法はありますか?

  $store->put( content_ref => $stringref );

また

  $store->put( path => $path_to_file );

ドキュメントには表示されていませんが、明らかなユースケースのように思われるので、質問する必要があると思いました。

4

1 に答える 1

3

callbacksこれらの線に沿って何かを達成するために使用できます。

#!/usr/bin/env perl

use strict;
use warnings;

package My::Class;

use Params::Validate;
use YAML;

sub new { bless {} => shift }

sub _xor_param {
    my $param = shift;
    return sub { defined($_[0]) and not defined($_[1]->{$param}) }
}

my %validation_spec = (
    content_ref => {
        'default' => undef,
        callbacks => {
            "Provided only if no 'path' is given"
                => _xor_param('path')
        },
    },
    path => {
        'default' => undef,
        callbacks => {
            "Provided only if no 'content_ref' is given"
                => _xor_param('content_ref')
        },
    },
);

sub put {
    my $self = shift;
    validate(@_, \%validation_spec);
    print Dump \@_;
}

package main;

my $x = My::Class->new;

$x->put(path => 'some path');
$x->put(content_ref => \'some content');
$x->put(path => 'another_path', content_ref => \'some other content');

出力:

---
- 道
-いくつかのパス
---
--content_ref
-!! perl / ref
  =:一部のコンテンツ
My :: Class :: putへの'content_ref'パラメータ( "SCALAR(0xab83cc)")が渡されませんでした
'パス'が指定されていない場合にのみ提供される'コールバック
 C:\ temp\v.plの37行目
        My :: Class :: put(undef、'path'、'another_path'、'content_ref'、
'SCALAR(0xab83cc)')C:\ temp\v.pl行47で呼び出されます
于 2012-11-14T03:15:35.923 に答える