1

私はPDLを使用しています。$fooハッシュ参照、配列参照、スカラー、またはピドル (空または null の可能性がある) の可能性がある変数が与えられた場合、それがピドルかどうかをどのように判断できますか?

4

2 に答える 2

3

何かが特定のクラスに属しているかどうかを確認する典型的な方法は、 を使用することですisa

if( $thing->isa("PDL") ) { ... }

これは継承を尊重します。$thingPDL のサブクラスである (またはそうであると言う)限り、上記は機能します。これにより、カスタム サブクラスと 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 に答える