一位同事撰寫了一些執行所有這些操作的 Perl 代碼 (v5.30.0):
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
package main;
sub processScalarHash
{
my $bar = $_[0];
printf "A subroutine can access the scalar hash: \"%s\"\n", $bar->{'key3'};
}
# Build the "Scalar Hash":
my $scalarHash = {};
$scalarHash->{'key1'} = 'dog';
$scalarHash->{'key2'} = 'cat';
$scalarHash->{'key3'} = 'fish';
bless $scalarHash;
printf "I can examine the scalar hash:\n";
print Dumper(\$scalarHash);
printf "I can access the scalar hash: \"%s\"\n", $scalarHash->{'key1'};
my $tmpStr = 'key2';
printf "I can access the scalar hash: \"%s\"\n", $scalarHash->{$tmpStr};
processScalarHash($scalarHash);
輸出是:
me@ubuntu01$ ./ScalarHash.perl
I can examine the scalar hash:
$VAR1 = \bless( {
'key3' => 'fish',
'key1' => 'dog',
'key2' => 'cat'
}, 'main' );
I can access the scalar hash: "dog"
I can access the scalar hash: "cat"
A subroutine can access the scalar hash: "fish"
me@ubuntu01$
我自己只是在學習 Perl,這里讓我印象深刻的是,我從來沒有看到任何關于使用標量 ($) 變數參考散列的檔案。使用散列 (%) 和陣列 (@) 變數,是的,但絕不是標量 ($)!我不知道我的同事為什么這樣編碼,但我有一種沉痛的感覺,即使用“標量哈希”是一種非常糟糕的做法。
作為 Perl 新手提問:這是糟糕的編碼嗎?我最不想做的就是養成以后可能會咬我的壞習慣。
uj5u.com熱心網友回復:
這不是特別糟糕。
考慮一下:
sub f {
my $h = shift; # Ref to hash
for my $k ( keys( %$h ) ) {
say "$k: $h->{ $k }";
}
}
my %h = ( a => 123, b => 456 ); # Hash
$h{ c } = 789;
f( \%h );
不能將哈希傳遞給 sub。但是可以將對哈希的參考傳遞給子。所以我們經常通過參考來處理哈希。
你在問是否可以通過參考來處理散列,即使它不是必需的。
sub f {
my $h = shift; # Ref to hash
for my $k ( keys( %$h ) ) {
say "$k: $h->{ $k }";
}
}
my $h = { a => 123, b => 456 }; # Ref to anon hash
$h->{ c } = 789;
f( $h );
有性能損失,但它肯定是微觀的。唯一真正的缺點是它使代碼更加嘈雜。但還沒有到不能忽視的地步。如果沒問題,那么絕對繼續使用這種風格。
不過,那bless不屬于那里。A blessoutside of a constructor 和 blessing intomain都是要避免的事情。
uj5u.com熱心網友回復:
不適合評論的旁注:構建哈希時,我嘗試通過一次構建所有哈希來最大程度地減少重復代碼的數量。
my $hash_reference = {
key1 => 'dog',
key2 => 'cat',
key3 => 'fish',
};
代替
my $scalarHash = {};
$scalarHash->{'key1'} = 'dog';
$scalarHash->{'key2'} = 'cat';
$scalarHash->{'key3'} = 'fish';
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/534288.html
標籤:perl散列
上一篇:重新排列串列以將第二列條目作為行
下一篇:Perlbrew庫管理
