Câu trả lời:
Dữ liệu :: Dumper là bạn của bạn.
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
sẽ xuất
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
toán tử trong C và C ++. Lý do nó quan trọng trong ngữ cảnh này là vì trong Perl, nếu bạn gọi một hàm có giá trị băm là đối số, thì giá trị băm đó được liệt kê và mở rộng thành nhiều đối số - vì vậy %hsh=("a" => 1, "b" => 2); foo(%hsh);
sẽ tương đương với foo("a", 1, "b", 2)
. Thay vào đó, nếu bạn muốn hàm hoạt động trên chính hàm băm, bạn cần chuyển một tham chiếu đến hàm băm: foo(\%hsh);
Xem perldoc.perl.org/perlsub.html#Pass-by-Reference
Dễ dàng:
print "$_ $h{$_}\n" for (keys %h);
Thanh lịch, nhưng thực tế chậm hơn 30% (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
, $k
không tồn tại trong ví dụ đó.
for
vòng lặp là nhanh hơn so với while
tiêu chuẩn tối thiểu 10.000 phím: gist.github.com/151792
Đây là cách bạn có thể in mà không cần sử dụng Data::Dumper
print "@{[%hash]}";
Đối với mục đích gỡ lỗi tôi sẽ thường sử dụng YAML
.
use strict;
use warnings;
use YAML;
my %variable = ('abc' => 123, 'def' => [4,5,6]);
print "# %variable\n", Dump \%variable;
Kết quả trong:
# %variable
---
abc: 123
def:
- 4
- 5
- 6
Những lần khác tôi sẽ sử dụng Data::Dump
. Bạn không cần phải đặt nhiều biến để xuất nó thành một định dạng đẹp hơn bạn làm Data::Dumper
.
use Data::Dump = 'dump';
print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
Gần đây tôi đã sử dụng Data::Printer
để gỡ lỗi.
use Data::Printer;
p %variable;
{
abc 123,
def [
[0] 4,
[1] 5,
[2] 6
]
}
(Kết quả có thể nhiều màu sắc hơn trên một thiết bị đầu cuối)
Không giống như các ví dụ khác tôi đã trình bày ở đây, ví dụ này được thiết kế rõ ràng chỉ dành cho mục đích hiển thị. Điều này xuất hiện dễ dàng hơn nếu bạn loại bỏ cấu trúc của một biến bị ràng buộc hoặc của một đối tượng.
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"
}
}
=>
như bạn mong đợi. Thay vào đó, nó luôn luôn in khóa, một vài khoảng trắng và sau đó là giá trị. Điều này giúp một con người quét qua đầu ra.
Câu trả lời phụ thuộc vào những gì trong hàm băm của bạn. Nếu bạn có một hàm băm đơn giản thì đơn giản
print map { "$_ $h{$_}\n" } keys %h;
hoặc là
print "$_ $h{$_}\n" for keys %h;
sẽ làm được, nhưng nếu bạn có một hàm băm được điền với các tham chiếu, bạn sẽ có thứ gì đó có thể dẫn các tham chiếu đó và tạo ra một đầu ra hợp lý. Việc đi bộ này của các tài liệu tham khảo thường được gọi là tuần tự hóa. Có nhiều mô-đun triển khai các kiểu khác nhau, một số mô-đun phổ biến hơn là:
Do thực tế Data::Dumper
là một phần của thư viện Perl cốt lõi, nó có lẽ là phổ biến nhất; tuy nhiên, một số mô-đun khác có những thứ rất tốt để cung cấp.
use
Smart::Comments
, tôi cũng thấy nó theo quan điểm đó. Nhưng đối với quầy, Smart::Comments
hoạt động khá tốt như một mô-đun có phạm vi , không nên có hành vi đầu ra trong bất kỳ mô-đun nào không sử dụng SC. Vì vậy, vấn đề sẽ được tách biệt với các phạm vi đó bằng một tuyên bố sử dụng . Nếu bạn nói rằng một lập trình viên bảo trì không có trách nhiệm đọc tài liệu trên các mô-đun đi kèm, tôi không thể đồng ý. Tuy nhiên, cảm ơn vì đã bình luận
Vòng lặp:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
Chức năng
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Nhưng để thanh lịch hơn, tôi phải chọn wrang-wrang. Đối với mã riêng của tôi, tôi sẽ chọn foreach của tôi. Hoặc sử dụng Dumper của tetro.
foreach
và map
. map
nên được sử dụng cho các phép biến đổi danh sách, không phải trong bối cảnh trống để mô phỏng một vòng lặp
Cách dễ nhất trong kinh nghiệm của tôi là chỉ sử dụng Dumpvalue .
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
Hoạt động như một bùa mê và bạn không phải lo lắng về việc định dạng hàm băm, vì nó xuất ra nó giống như trình gỡ lỗi Perl (rất tốt cho việc gỡ lỗi). Thêm vào đó, Dumpvalue được bao gồm trong bộ mô-đun Perl, vì vậy bạn không phải gặp rắc rối với CPAN nếu bạn đứng sau một loại proxy hà khắc nào đó (như tôi đang làm việc).
Nếu bạn muốn trở thành người phạm tội và giữ nó thành một dòng (không sử dụng câu lệnh và shebang), thì tôi sẽ loại bỏ câu trả lời của tetromino và đề nghị:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Không làm gì đặc biệt ngoài việc sử dụng hàm băm ẩn danh để bỏ qua biến tạm thời;)