1

与えられたコード例:

foo(bar=>"test");
foo(bar=>["test"]);

sub foo {
   my $args = {@_};

   say ref($args->{bar});
   say ref(\$args->{bar});
}

出力:

{空白が必要}
SCALAR
ARRAY
REF


私がテストしたいのは、渡されたものがスカラーか配列かを確認する最良の方法です。何かのようなもの:

given( ref($args->{bar}) ){
   when "SCALAR" { }
   when "ARRAY"  { }
}

2 つの ref 型を連結して regex-when を実行することもできますが、それは非効率的です。次のようにテストすることもできますが、それが好ましいかどうかはわかりません。

if    ( ref(\$args->{bar}) eq "SCALAR" ) { ... }
elsif ( ref( $args->{bar}) eq "ARRAY"  ) { ... }
else  { return; }
4

2 に答える 2

3

スカラーと配列を区別しようとしていません。どちらの場合もスカラーを取得します。非参照と配列への参照を区別しようとしています。

if (!ref($x) || ref($x) eq 'ARRAY') {
   # Non-ref or ref to array.
   ...
}

また

if (!ref($x)) {
   # Non-ref
   ...
}
elsif (ref($x) eq 'ARRAY') {
   # Ref to array.
   ...
}

また

for (ref($x)) {
   if (!$_) {
      # Non-ref
      ...
   }
   elsif ($_ eq 'ARRAY') {
      # Ref to array.
      ...
   }
}

また

my $ref_type = ref($x);
if (!$ref_type) {
   # Non-ref
   ...
}
elsif ($ref_type eq 'ARRAY') {
   # Ref to array.
   ...
}

または(これらが許可される値の2つのタイプのみであると仮定します)

if (ref($x)) {
   # Ref to array.
   ...
} else {
   # Non-ref
   ...
}

(Scalar::Utilreftypeは実際には ref 型を取得することに注意してください。ref参照型の代わりにクラス名を返すことができます。)

ストレージ タイプに基づいて値を区別することは、Perl では不適切な設計であることに注意してください。オーバーロードされたオブジェクトを破壊するため、必然的にバグがあります。

于 2012-12-05T20:16:24.677 に答える
1

の範囲内のプラグマが与えられた

use feature qw/ say switch /;

あなたが使うことができます

sub foo {
  my($args) = { @_ };

  given (ref $args->{bar}) {
    say "plain scalar '$args->{bar}'"
      when "";

    say "array, length=@{[scalar @{ $args->{bar} }]}"
      when "ARRAY";

    default { die "unexpected: $args->{bar}" }
  }
}

出力:

プレーンスカラー'テスト'
配列、長さ= 1

あなたの質問は抽象的なものですが、あなたが何をしたいのかについての知識があれば、私たちはあなたの特定の状況に対してより具体的で役立つ提案を提供することができます。

于 2012-12-05T20:54:01.683 に答える