2012-03-13 22 views
10

Trong Perl tôi cần phân tích một băm lớn, vì vậy tôi in nó vào một tệp sử dụng mô-đun Data::Dumper. Bởi vì nó là một tập tin rất lớn, nó rất khó đọc. Có thể bằng cách nào đó để in Dumper đầu ra độc đáo, vì vậy khi tôi sẽ tìm thấy một chuỗi mà tôi đang tìm kiếm, tôi sẽ có thể thấy cấu trúc khóa ngay lập tức mà chuỗi tôi đang tìm được lưu trữ?Dữ liệu băm Perl :: Dumper

Hiện nay tôi đang sử dụng chỉ là một mã đơn giản:

  use Data::Dumper; 
      ... 
      print Dumper $var; 

cú pháp tốt nhất hoặc thay thế để có được kết quả tốt đẹp là gì?

+2

Tại sao không đưa ra ví dụ về đầu ra bạn nhận được và đầu ra bạn muốn? Đầu ra Dumper được định dạng mặc định để bạn có thể dễ dàng xem cấu trúc khóa, vì vậy bạn đang tìm kiếm cái gì khác? – TLP

+2

-1 Bạn đang đặt câu hỏi sai. Các bãi chứa là một đối tượng đan xen rất lớn. Câu hỏi phải là những gì các cuộc gọi API thích hợp là lấy dữ liệu bạn muốn, chứ không phải cách [tạo một bãi chứa] (http://p3rl.org/perltidy). – daxim

Trả lời

20

Tôi gần như luôn đặt

$Data::Dumper::Indent = 1; 
$Data::Dumper::Sortkeys = 1; 

với Data::Dumper. Câu lệnh đầu tiên làm cho đầu ra nhỏ gọn hơn và dễ đọc hơn nhiều khi cấu trúc dữ liệu của bạn có nhiều mức sâu. Những tuyên bố thứ hai làm cho nó dễ dàng hơn để quét các đầu ra và nhanh chóng tìm thấy các phím bạn đang quan tâm nhất.

Nếu cấu trúc dữ liệu chứa dữ liệu nhị phân hoặc tab nhúng/dòng mới, cũng xem xét

$Data::Dumper::Useqq = 1; 

đó sẽ ra một đại diện có thể đọc được phù hợp cho dữ liệu đó.

Phần lớn trong số perldoc.

+0

Có, nó giúp một chút, cảm ơn. –

+0

Xin lỗi, nhưng tôi sẽ hỏi những gì có thể là một câu hỏi mới về câu trả lời này. Nếu pragma nghiêm ngặt có hiệu lực, bạn có phải thực hiện một số loại khai báo $ Data trước các câu lệnh trên không? –

+0

Không, bạn không. '$ Data :: Dumper :: Indent' và' $ foo :: bar' là các tên biến "đủ điều kiện" (chúng chỉ định gói cũng như tên biến) và được cho phép trong 'strict'. – mob

-1

Câu trả lời cho câu hỏi.

my $WWW_Scripter_Plugin_JavaScript_JE = ${ $VAR1->[1]{156192192} }; 
my $JE_Object_String = ${ $WWW_Scripter_Plugin_JavaScript_JE->{pf}{String} }; 
my $JE_Object_Function = ${ $JE_Object_String->{props}{search} }; 
my $REF = ${ $JE_Object_Function->{global} }; 
my $HTML_DOM_Element_Img = $REF->{classes}{'HTML::DOM::Element::Img'}; 

Nó cũng vi phạm đóng gói. Perl cho phép bạn làm điều đó, nhưng bạn nên hỏi làm cách nào để lấy dữ liệu với WWW :: Scripter API đã xuất bản.

+1

Đã từng là một nhận xét gắn liền với câu hỏi trỏ đến tải xuống một bãi chứa lớn của đối tượng WWW :: Scripter, nhận xét đó đã bị xóa. Câu trả lời này là câu trả lời cho nhận xét đó. – daxim

8

Một giải pháp có thể là sử dụng Data::Dumper::Perltidy để chạy đầu ra của Dữ liệu :: Dump thông qua Perltidy.

#!/usr/bin/perl -w 

use strict; 
use Data::Dumper::Perltidy; 

my $data = [{ title => 'This is a test header' },{ data_range => 
      [ 0, 0, 3, 9] },{ format  => 'bold' }]; 

print Dumper $data; 

__END__ 

Prints:

$VAR1 = [ 
    { 'title'  => 'This is a test header' }, 
    { 'data_range' => [ 0, 0, 3, 9 ] }, 
    { 'format'  => 'bold' } 
]; 

Một cách khác là sử dụng Data::Dump.

0
$Data::Dumper::Sortkeys = 1; 

Nếu bạn muốn nhận kết quả đáng tin cậy hơn thì bạn phải làm theo dumper tiếp theo. Đặt từ thích hợp để vận hành chức năng đó.

Các vấn đề liên quan