私はPDLを使用しています。$foo
ハッシュ参照、配列参照、スカラー、またはピドル (空または null の可能性がある) の可能性がある変数が与えられた場合、それがピドルかどうかをどのように判断できますか?
2 に答える
3
何かが特定のクラスに属しているかどうかを確認する典型的な方法は、 を使用することですisa
。
if( $thing->isa("PDL") ) { ... }
これは継承を尊重します。$thing
PDL のサブクラスである (またはそうであると言う)限り、上記は機能します。これにより、カスタム サブクラスと PDL 自体への変更の両方から保護されます。以下は例です。
use strict;
use warnings;
use v5.10;
package MyPDL;
our @ISA = qw(PDL);
package main;
use PDL;
use Scalar::Util qw(blessed);
my $stuff = pdl [1..10];
say blessed $stuff; # PDL
say "\$stuff is a PDL thing" if $stuff->isa("PDL"); # true
my $bar = MyPDL->new([1..10]);
say blessed $bar; # MyPDL
say "\$bar is a PDL thing" if $bar->isa("PDL"); # true
ただし、メソッド呼び出しは非参照および unblessed 参照では機能しません。しようとするとエラーになります。これは 2 つの方法で回避できます。まず、別の言語のeval BLOCK
ように、エラーをトラップするために使用します。try
if( eval { $thing->isa("PDL") } ) { ... }
$thing
がオブジェクトでない場合eval
、エラーをトラップして false を返します。$thing
がオブジェクトの場合、それを呼び出してisa
結果を返します。
欠点は、これにより、 からのエラーを含むすべてのisa
エラーがトラップされることです。まれですが、起こります。これを回避するには、Scalar::Util のblless()を使用して、最初に$thing
がオブジェクトかどうかを判断します。
use Scalar::Util qw(blessed):
if( blessed $thing && $thing->isa("PDL") ) { ... }
于 2016-04-25T23:14:10.000 に答える