Yanıtlar:
Veri :: Damper senin arkadaşın.
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
çıktı olacak
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
C ve C ++ 'daki operatör gibi bir referans oluşturur . Bu bağlamda önemli olmasının nedeni, Perl'de, bağımsız değişken olarak karma değerine sahip bir işlev çağırırsanız, bu karma değerin listelenir ve birden çok bağımsız değişkene genişletilir - böylece %hsh=("a" => 1, "b" => 2); foo(%hsh);
eşdeğer olur foo("a", 1, "b", 2)
. Bunun yerine işlevin karma üzerinde çalışmasını istiyorsanız, karma değerine bir referans iletmeniz gerekir : foo(\%hsh);
Bkz. Perldoc.perl.org/perlsub.html#Pass-by-Reference
Kolay:
print "$_ $h{$_}\n" for (keys %h);
Zarif, ama aslında% 30 daha yavaş (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
, $k
bu örnekte yok.
for
Döngü daha hızlı olduğu while
: en az 10.000 tuşlara kadar gist.github.com/151792
Kullanmadan nasıl yazdırabilirsiniz Data::Dumper
print "@{[%hash]}";
Hata ayıklama amacıyla sık sık kullanacağım YAML
.
use strict;
use warnings;
use YAML;
my %variable = ('abc' => 123, 'def' => [4,5,6]);
print "# %variable\n", Dump \%variable;
Sonuçlar:
# %variable
---
abc: 123
def:
- 4
- 5
- 6
Diğer zamanlarda kullanacağım Data::Dump
. Sizden daha güzel bir biçimde çıktı alabilmesi için çok sayıda değişken ayarlamanıza gerek yoktur Data::Dumper
.
use Data::Dump = 'dump';
print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
Son zamanlarda Data::Printer
hata ayıklama için kullanıyorum .
use Data::Printer;
p %variable;
{
abc 123,
def [
[0] 4,
[1] 5,
[2] 6
]
}
(Sonuç bir terminalde çok daha renkli olabilir)
Burada gösterdiğim diğer örneklerin aksine, bu açıkça sadece görüntüleme amaçlı olacak şekilde tasarlanmıştır. Bağlı bir değişkenin veya bir nesnenin yapısını dökerseniz daha kolay görünür.
use strict;
use warnings;
use MTie::Hash;
use Data::Printer;
my $h = tie my %h, "Tie::StdHash";
@h{'a'..'d'}='A'..'D';
p %h;
print "\n";
p $h;
{
a "A",
b "B",
c "C",
d "D"
} (tied to Tie::StdHash)
Tie::StdHash {
public methods (9) : CLEAR, DELETE, EXISTS, FETCH, FIRSTKEY, NEXTKEY, SCALAR, STORE, TIEHASH
private methods (0)
internals: {
a "A",
b "B",
c "C",
d "D"
}
}
=>
beklediğiniz gibi çıkmadığını görürsünüz . Bunun yerine her zaman anahtarı, birkaç boşluğu ve sonra değeri yazdırır. Bu, bir çıktı üzerinde insan taramasına yardımcı olur.
Bu sorunun cevabı, karma değerinizde ne olduğuna bağlıdır. Basit bir karma varsa
print map { "$_ $h{$_}\n" } keys %h;
veya
print "$_ $h{$_}\n" for keys %h;
ancak referanslarla doldurulmuş bir karmanız varsa, bu referansları yürütebilecek ve makul bir çıktı oluşturabilecek bir şey elde edersiniz. Referansların bu şekilde yürümesine normalde serileştirme denir. Farklı stilleri uygulayan birçok modül var, daha popüler olanlardan bazıları:
Aslında nedeniyle Data::Dumper
çekirdek Perl kitaplığının parçasıdır, muhtemelen en popüler olduğu; ancak, bazı diğer modüllerin sunabileceği çok iyi şeyler var.
use
Smart::Comments
, onu da bu perspektiften görüyorum. Ancak, karşı, Smart::Comments
oldukça kapsamlı bir modül gibi davranır , SC kullanmayan herhangi bir modülde çıkış davranışı olmamalıdır . Bu nedenle, sorun bir kullanım bildirimi ile bu kapsamlara ayrılacaktır . Bir bakım programcısının dahil edilen modüller hakkındaki dokümanı okuma sorumluluğu olmadığını söylüyorsanız, kabul edemem. Yine de, yorum yaptığınız için teşekkürler
Döngü:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
fonksiyonel
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Ama saf zerafet için, wrang-wrang'ları seçmeliydim. Kendi kodum için, foreach'mi seçerdim. Veya tetro'nun Dumper'ı kullanın.
foreach
ve map
. map
bir for-loop öykünmek için boşluk bağlamında değil, liste dönüşümleri için kullanılmalıdır
Deneyimlerimdeki en kolay yol sadece Dumpvalue kullanmaktır .
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
Bir cazibe gibi çalışır ve Perl hata ayıklayıcısının yaptığı gibi çıktıyı biçimlendirmek için endişelenmenize gerek yoktur (hata ayıklama için harika). Ayrıca, Perl modüllerinin stok setinde Dumpvalue bulunur, bu nedenle bir çeşit acımasız proxy'nin arkasındaysanız (işteyim gibi) CPAN ile uğraşmak zorunda kalmazsınız.
Bilgiçlikçi olmak ve bir satırda tutmak istiyorsanız (kullanım ifadeleri ve shebang olmadan), o zaman bir tür domuzcuk tetromino cevabından geri döner ve öneririm:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Temp değişkenini atlamak için anonim karma kullanmak dışında özel bir şey yapmamak;)