在 Perl 中,當它從 sub 回傳時,沒有“簡單”的方法可以直接處理散列,或者我是否遺漏了什么?
我想要這樣的東西。
print ( (hash()){One} ); # Not a thing!
由于回傳的值構成一個串列,因此您可以使用陣列來執行此操作。
print ( (arr())[0] );
但是對于不削減它的哈希。我想出了一些方法來讓這個作業。
print ( ${{hash()}}{One} );
print ( 0 {hash()}->{One} );
但他們似乎有點蹩腳。我的意思是,對于這么簡單的事情,這很難閱讀和參考惡作劇接縫。
這是背景關系的更多代碼。
use strict;
use warnings;
### ARRAY
sub arr {
my @arr = (
1,
2,
3,
);
return @arr;
}
print ( (arr())[0] ); #Output is 1;
### HASH
sub hash {
my %hash = (
One => 1,
Two => 2,
Three => 3,
);
return %hash;
}
my %hash = hash();
#print ( (hash()){One} ); # Does not work
print ( $hash{One} ); # Output is 1
print ( (hash())[0] ); # Output will be One, Two or Three
print ( (hash())[1] ); # Output will be 1, 2, 3
print ( ${{hash()}}{One} ); # Output is 1
print ( 0 {hash()}->{One} ); # Output is 1;
# 0 because Perl gives syntax error otherwise. Not sure why (Scalar context?) but one mystery at a time.
uj5u.com熱心網友回復:
子程式不回傳哈希值,而是回傳值串列。此串列可以轉換為散列。
給定一個回傳偶數大小串列的 sub,我將使用以下運算式來訪問哈希條目:
{hash()}->{One}
有時需要前導來消除{...}陳述句級塊{...}1 中的散列參考文字的歧義。一元加號是一個空操作,只是強制運算式背景關系,而0 將值轉換為數字。
1. 雖然在這個特定的例子中,歧義是由于print(FILEHANDLE LIST)語法,檔案句柄可以用大括號括起來。
如果您可以控制嘗試回傳散列的函式,則可以考慮改為回傳散列參考。您的示例將如下所示:
sub hashref {
# alternatively: "return { One => 1, ... };"
my %hash = (
One => 1,
Two => 2,
Three => 3,
);
return \%hash;
# ^-- create a reference to the hash
}
my %hash = hashref()->%*; # or "%{hashref()}". Note that this makes a copy
print( hashref()->{One} ); # can directly access keys
uj5u.com熱心網友回復:
以下代碼片段演示了陣列參考和哈希參考的用法。
當您必須操作大陣列或散列時,這種方法的優勢會得到跟蹤——無需為復制分配記憶體,節省 CPU 周期。
在某些情況下,演算法可能需要創建副本,這可以通過取消參考資料結構輕松實作(參見示例)。
use strict;
use warnings;
use feature 'say';
### ARRAY
sub arr {
my $ref_arr = [
1,
2,
3,
];
return $ref_arr;
}
my $aref = arr();
say "
Array content:
\$aref->[0] $aref->[0]
\$aref->[1] $aref->[1]
\$aref->[2] $aref->[2]
";
my @array_copy = @$aref;
say "
Array copy content:
\$array_copy[0] $array_copy[0]
\$array_copy[1] $array_copy[1]
\$array_copy[2] $array_copy[2]
";
### HASH
sub hash {
my $ref_hash = {
One => 1,
Two => 2,
Three => 3,
};
return $ref_hash;
}
my $href = hash();
say "
Hash content:
\$href->{Three}: $href->{Three}
\$href->{Two}: $href->{Two}
\$href->{One}: $href->{One}
";
my %hash_copy = %$href;
say "
Hash copy content:
\$hash_copy{One}: $hash_copy{One}
\$hash_copy{Two}: $hash_copy{Two}
\$hash_copy{Three}: $hash_copy{Three}
";
輸出
Array content:
$aref->[0] 1
$aref->[1] 2
$aref->[2] 3
Array copy content:
$array_copy[0] 1
$array_copy[1] 2
$array_copy[2] 3
Hash content:
$href->{Three}: 3
$href->{Two}: 2
$href->{One}: 1
Hash copy content:
$hash_copy{One}: 1
$hash_copy{Two}: 2
$hash_copy{Three}: 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325979.html
