Saya terus mencetak hash saya sebagai # kotak / # yang dialokasikan. Bagaimana cara mencetak konten hash saya?
Tanpa menggunakan while
perulangan akan lebih disukai (misalnya, satu-liner akan lebih baik).
Saya terus mencetak hash saya sebagai # kotak / # yang dialokasikan. Bagaimana cara mencetak konten hash saya?
Tanpa menggunakan while
perulangan akan lebih disukai (misalnya, satu-liner akan lebih baik).
Jawaban:
Data :: Dumper adalah teman Anda.
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
akan menampilkan
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
operator di C dan C ++. Alasan penting dalam konteks ini adalah bahwa di Perl, jika Anda memanggil fungsi dengan nilai hash sebagai argumen, nilai hash akan didaftar dan diperluas menjadi beberapa argumen - jadi %hsh=("a" => 1, "b" => 2); foo(%hsh);
akan sama dengan foo("a", 1, "b", 2)
. Jika Anda menginginkan fungsi untuk beroperasi pada hash itu sendiri, Anda perlu memberikan referensi ke hash: foo(\%hsh);
Lihat perldoc.perl.org/perlsub.html#Pass-by-Reference
Mudah:
print "$_ $h{$_}\n" for (keys %h);
Elegan, tapi sebenarnya 30% lebih lambat (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
, $k
tidak ada dalam contoh itu.
for
loop lebih cepat daripada while
hingga setidaknya 10.000 kunci: gist.github.com/151792
Di sini bagaimana Anda dapat mencetak tanpa menggunakan Data::Dumper
print "@{[%hash]}";
Untuk keperluan debugging, saya akan sering menggunakan YAML
.
use strict;
use warnings;
use YAML;
my %variable = ('abc' => 123, 'def' => [4,5,6]);
print "# %variable\n", Dump \%variable;
Hasil dalam:
# %variable
---
abc: 123
def:
- 4
- 5
- 6
Lain kali saya akan menggunakan Data::Dump
. Anda tidak perlu mengatur sebanyak mungkin variabel untuk mengeluarkannya dalam format yang bagus daripada yang Anda lakukan Data::Dumper
.
use Data::Dump = 'dump';
print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
Baru-baru ini saya telah menggunakan Data::Printer
untuk debugging.
use Data::Printer;
p %variable;
{
abc 123,
def [
[0] 4,
[1] 5,
[2] 6
]
}
(Hasilnya bisa jauh lebih berwarna di terminal)
Berbeda dengan contoh-contoh lain yang telah saya perlihatkan di sini, yang ini dirancang secara eksplisit hanya untuk tujuan tampilan. Yang muncul lebih mudah jika Anda membuang struktur variabel terikat atau objek.
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"
}
}
=>
seperti yang Anda harapkan. Alih-alih itu selalu mencetak kunci, beberapa spasi, dan kemudian nilainya. Yang membantu pemindaian manusia atas output.
Jawabannya tergantung pada apa yang ada di hash Anda. Jika Anda memiliki hash sederhana, sederhana
print map { "$_ $h{$_}\n" } keys %h;
atau
print "$_ $h{$_}\n" for keys %h;
akan dilakukan, tetapi jika Anda memiliki hash yang diisi dengan referensi Anda akan sesuatu yang bisa berjalan referensi tersebut dan menghasilkan output yang masuk akal. Referensi berjalan ini biasanya disebut serialisasi. Ada banyak modul yang menerapkan gaya yang berbeda, beberapa yang lebih populer adalah:
Karena fakta yang Data::Dumper
merupakan bagian dari perpustakaan inti Perl, itu mungkin yang paling populer; Namun, beberapa modul lain memiliki hal-hal yang sangat baik untuk ditawarkan.
use
Smart::Comments
, saya melihatnya dari perspektif itu juga. Tetapi bagi penghitung, Smart::Comments
berperilaku cukup baik sebagai modul cakupan , seharusnya tidak ada perilaku keluaran dalam modul apa pun yang tidak juga menggunakan SC. Jadi, masalahnya akan diisolasi untuk lingkup tersebut dengan pernyataan penggunaan . Jika Anda mengatakan bahwa seorang programmer pemeliharaan tidak memiliki tanggung jawab untuk membaca dokumen pada modul yang disertakan, saya tidak bisa setuju. Namun, terima kasih telah berkomentar
Looping:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
Fungsional
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Tapi untuk keanggunan belaka, saya harus memilih wrang-wrang. Untuk kode saya sendiri, saya akan memilih foreach saya. Atau gunakan Dumper tetro.
foreach
dan map
. map
harus digunakan untuk transformasi daftar, bukan dalam konteks kosong untuk meniru for-loop
Cara termudah dalam pengalaman saya adalah dengan hanya menggunakan Nilai Dump .
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
Bekerja seperti pesona dan Anda tidak perlu khawatir tentang memformat hash, karena menghasilkan seperti hash debugger Perl (bagus untuk debugging). Plus, Dumpvalue disertakan dengan set modul Perl, jadi Anda tidak perlu mengacaukan CPAN jika Anda berada di belakang semacam proxy kejam (seperti saya di tempat kerja).
Jika Anda ingin menjadi orang yang bertele-tele dan menjaganya tetap pada satu baris (tanpa menggunakan statemen dan shebang), maka saya akan menyortir piggy dari jawaban tetromino dan menyarankan:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Tidak melakukan sesuatu yang istimewa selain menggunakan hash anonim untuk melewati variabel temp;)