2013-04-30 15 views
5

Benim hashref'in 0 elementi içerip içermediğini test etmem gerekiyor. Bu kodu kullandı:Bir hash referansının perl içinde boş olup olmadığını nasıl kontrol edeceğim

$self = { fld => 1 }; 
%h = ("a" => "b"); 
$self->{href} = { %h }; 
print STDERR $self->{href}{ "a" }; 
print STDERR "\n"; 
print "size of hash: " . keys(%h) . ".\n"; 
print "size of hashref: " . keys($self->{href}) . ".\n"; 

Bu perl 5.16 ile iyi çalışır, ancak Perl 5.10 ile başarısız:

Type of arg 1 to keys must be hash (not hash element) at - line 7, near "}) " 
Execution of - aborted due to compilation errors. 

cevap

12

: Maksimum uyumluluk için, önce söz konusu KQUEUE gerek o

keys %{ $self->{href} } 

Not var: P baz versiyonunda erl, keys referans kabul eder. Ancak, bu terk edilmiş bir deneysel özellikti. Bunu kullanmamalı. Bir karma olarak kendisine KQUEUE gerek

+0

olsun. Tüm Perl versiyonlarında aynı şekilde mi çalışacak? –

+0

Hayır. Bu, terk edilmiş bir deneysel özellikti. – ikegami

+0

Bu dönüş boş mu yoksa 0? – landesko

2

yalnızca daha yeni Perls desteklenir keys gibi yerleşik fonksiyonları ile başvurular kullanma. Eğer bir karma için

%hash 

kullanmayı tercih ediyorsanız bu yüzden, bir başvuru için

%{ $hash } 

kullanmak istiyorum,

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
2

: herhangi tuşlar varsa kontrol etmek, TIMTOWTDI için

print "size of hashref: ", keys %{ $self->{href} }, "\n"; 

, sen keys gerekmez:

print "undefined" unless %{ $self->{href} }; 
+1

Kullanmakta olduğu Perl sürümünde, bu son kod parçacığının tüm karma boyunca gereksiz yere yinelemesi gerekir. Sadece kahkaha. – ikegami

1

olmadığını öğrenmek için karma öğesi vardır, sadece skaler bağlamında kullanabilirler:

scalar %h 

veya

%h ? "yup" : "nope" 

scalar keys %h%h anahtarlarını sayarak aynı amacı yerine, ama eğer gerçekten bilmek ne istediğini sormak daha iyidir.

Her iki şekilde de, %h bir karma değildir ve bir hashref değildir. (Perl'in bazı sürümleri keys'a karşı bir argüman olarak bir hashref tolere etmesine rağmen.) Bir hashref değerlendiren bir EXPR ifadesi verildiğinde, %{ EXPR } diyerek karşılık gelen kareye ulaşırsınız. {} `Açıklamada eğer - _ref_ bu` if (> { 'href'}! Tuşları $ kendini) yapmak mümkün karma değilse sizin örnek kodla birlikte bu koyarak, biz

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
print "hash " . (%{ $self->{href} } ? "does" : "does not") . " contain elements\n"; 
İlgili konular