2017-05-03 72 views
0

我試圖使用crypto_box_keypairCrypt::Sodium麻煩從Perl的匿名數組訪問元素

my @keyPair = crypto_box_keypair(); 

我的理解(由Data::Dumper確認)是Crypt::Sodium返回一個匿名數組:

$VAR1 = [ 
      '[email protected]ʵ????$p?-0?3', 
      '?1????qRo??;???1?' 
     ]; 

但我似乎無法訪問各個元素。

say scalar @keyPair; 

返回1,儘管兩個元件被明確地示出Data::Dumper

而且

$keyPair[1] 

undef

+0

你做'傾銷者(\ @ keyPair)'或'傾銷者(@keyPair)'?我懷疑你做了後者,在這種情況下'$ VAR1'是'@ keyPair'的第一個(也是唯一的)元素。 – ikegami

+0

您的值可以通過$ keyPair [0] [0]和$ keyPair [0] [1]來訪問。 – Borodin

回答

2

你做Dumper(\@keyPair)Dumper(@keyPair)?我懷疑你做了後者,在這種情況下,$VAR1@keyPair的第一個(也是唯一)元素。如果你想轉儲一個數組,傳給它一個引用;掌握這種方式要容易得多。

繼續這個假設,crypto_box_keypair似乎返回對數組的引用而不是多個標量。因此,使用應該是

my $keyPair = crypto_box_keypair(); 
say scalar @$keyPair; 
say $keyPair->[0]; 
say $keyPair->[1]; 
+0

Dumper(@keyPair)的確如此!感謝您指出並解釋錯誤或我的方式! –

6

如果它返回數組引用,則需要使用標量來存儲結果,而不是數組。

my $keyPair = crypto_box_keypair(); 
say scalar @$keyPair; 
say $keyPair->[0]; 
say $keyPair->[1]; 

當你做了my @keyPair=crypto_box_keypair();,你分配整個數組引用到一個新的數組,這就是爲什麼大小爲1,你可以看到的內容,當你放棄它的第一個元素。

根據文檔box_keypair()(不是crypto_box_keypair())確實會返回一個列表。所以在那種情況下

my @keyPair = box_keypair(); 

應該可以正常工作。

+0

雖然這是正確的,文檔說它返回一個列表。 – simbabque

+0

'box_keypair',確實。看起來OP正在使用'crypto_box_keypair',它沒有記錄並返回arrayref。更新了答案以澄清。 –

+0

這不是無證的。這是[基礎XS實施](https://metacpan.org/source/MGREGORO/Crypt-Sodium-0.11/Sodium.xs#L526)。用Perl編寫的'box_keypair'函數調用'crypto_box_keypair'和[取消引用返回的數組ref](https://metacpan.org/source/MGREGORO/Crypt-Sodium-0.11/lib/Crypt/Sodium。下午#L262)。 – simbabque

1

雖然@Adam Millerchip向您展示瞭如何訪問您想要的元素,但我會對您的問題的其他部分發表評論。你說:

我的理解(由Data::Dumper確認)

事實上,沒有這樣的事被證實Data::Dumper。如果您想查看@keyPair中的內容,則必須將對@keyPair的引用傳遞至Dumper。也就是說,你必須使用

print Dumper \@keypair; 

代替

print Dumper @keypair; # I suspect you did this 

如果您已經傳遞到@keyPair一個參考,你會清楚地看到它是含有一個匿名數組的數組。

相反,通過不傳遞引用,您將@keyPair的元素作爲參數傳遞給Dumper。在這種情況下,@keyPair具有單個元素,即對具有兩個元素的匿名數組的引用。從Dumper的輸出,因此愚蠢的你想到@keyPair有兩個要素。

也就是說,你的代碼就相當於:

my @x = (['a', 'b']); 
print Dumper @x; 

是一樣print Dumper $x[0]。如果你想看到的是在@x,你必須通過@x參考,如:

print Dumper \@x; 

例子:

$ perl -MData::Dumper -e "@x=(['a','b']);print Dumper @x" 
$VAR1 = [ 
      'a', 
      'b' 
     ];
$ perl -MData::Dumper -e "@x=(['a','b']);print Dumper $x[0]" 
$VAR1 = [ 
      'a', 
      'b' 
     ];
$ perl -MData::Dumper -e "@x=(['a','b']);print Dumper \@x" 
$VAR1 = [ 
      [ 
      'a', 
      'b' 
      ] 
     ];
+0

非常有用附加背景。謝謝。 –

+2

感謝您承認我的回答:-) –