3

Perl の定義済み関数を使用して、要素が定義されているかどうかを確認しようとしています。

コード :

$mylist[0][0]="wqeqwe";
$mylist[0][1]="afasf";
$mylist[1][0]="lkkjh";

print scalar(@mylist), "\n";

if (defined($mylist[2][0])){print "TRUE\n";}

print scalar(@mylist), "\n";

出力

2
3

定義済み関数を使用する前は、 の最初の次元に 2 つの要素がありました@myarray定義済み関数を使用すると、要素の数が 3 に増えます。

新しい要素を追加せずに定義済み関数を使用するには?

4

5 に答える 5

7

まず、第1レベルの参照が存在することを確認します。

if ( defined($mylist[2]) && defined($mylist[2][0]) ) {
    print "TRUE\n";
}

あなたが遭遇したのは自動生存と呼ばれます:ある状況下では、Perlはそれらをすでに存在しているかのように使用すると複雑なデータ構造を作成します。

于 2012-06-27T17:39:29.983 に答える
5

autovivificationと呼ばれるコア以外のプラグマがあり、コードを実行するとno autovivification;問題が解決することに注意してください。

于 2012-06-27T17:57:23.983 に答える
3

を参照すると$mylist[2][0]、perlの自動生存によって配列要素が作成されます$mylist[2]

これを防ぐために、最初にこの要素を確認できます。

if ( (defined $mylist[2]) && (defined $mylist[2][0]) )
于 2012-06-27T17:40:52.527 に答える
3
defined($mylist[2][0])

と同等です

defined($mylist[2]->[0])

の略です

defined( ( $mylist[2] //= [] )->[0])

自生のため。autovivificationプラグマを使用して autovivification を無効にすることができます。

no autovivificatoin;
if (defined($mylist[2][0]))

または、それをトリガーするコードの評価を避けることができます。

if (defined($mylist[2]) && defined($mylist[2][0]))
于 2012-06-27T17:50:22.063 に答える
2

実は自動活性化なので、define を使う前後に Data::Dumper で簡単に確認できます。

use Data::Dumper;
my @mylist;

$mylist[0][0]="wqeqwe";
$mylist[0][1]="afasf";
$mylist[1][0]="lkkjh";

print Dumper(@mylist);

前に出力

$VAR1 = ['wqeqwe', 'afasf'];
$VAR2 = [ 'lkkjh'];


print Dumper(@mylist);

後に出力

$VAR1 = [ 'wqeqwe','afasf' ];
$VAR2 = ['lkkjh'];
$VAR3 = [];
于 2012-06-27T17:43:03.680 に答える