2008-10-23 111 views
25

我发现PHP中的print_r非常有用,但不知道Perl中是否有远程等价物?什么是Perl相当于PHP的print_r()?

+7

当寻找相同的功能,它通常是一个好主意,说明原来做什么。并不是每个Perl程序员都会知道PHP的print_r()函数的功能。 – 2008-10-23 14:49:33

回答

42

注意:@ tchrist建议使用Data::Dump而不是Data::Dumper。我没有意识到这一点,但从它的外观来看,它似乎使用起来更容易,产生更好看,更容易解释结果。

Data::Dumper

在上述链接中示出的示例的片断。

use Data::Dumper; 

package Foo; 
sub new {bless {'a' => 1, 'b' => sub { return "foo" }}, $_[0]}; 

package Fuz;      # a weird REF-REF-SCALAR object 
sub new {bless \($_ = \ 'fu\'z'), $_[0]}; 

package main; 
$foo = Foo->new; 
$fuz = Fuz->new; 
$boo = [ 1, [], "abcd", \*foo, 
     {1 => 'a', 023 => 'b', 0x45 => 'c'}, 
     \\"p\q\'r", $foo, $fuz]; 

######## 
# simple usage 
######## 

$bar = eval(Dumper($boo)); 
print([email protected]) if [email protected]; 
print Dumper($boo), Dumper($bar); # pretty print (no array indices) 

$Data::Dumper::Terse = 1;   # don't output names where feasible 
$Data::Dumper::Indent = 0;   # turn off all pretty print 
print Dumper($boo), "\n"; 

$Data::Dumper::Indent = 1;   # mild pretty print 
print Dumper($boo); 

$Data::Dumper::Indent = 3;   # pretty print with array indices 
print Dumper($boo); 

$Data::Dumper::Useqq = 1;   # print strings in double quotes 
print Dumper($boo); 
+0

确保您本地化任何包变量。例如`local $ Data :: Dumper :: Indent = 3;`。 – 2009-01-28 20:25:48

+1

`Data :: Dump`远远优越。 – tchrist 2012-02-17 15:43:45

8

由于通常使用Perl,你可能更喜欢古老的数据::自卸车的替代解决方案:

  • Data::Dump::Streamer比数据::自卸车一个更简洁的输出,并还可以序列化的一些数据优于Data :: Dumper,
  • YAML(或Yaml::Syck,或其他YAML模块)在YAML中生成的数据非常清晰。

当然,使用调试器,您可以使用'x'命令显示任何变量。我特别喜欢'x 2 $complex_structure'的形式,其中2(或任何数字)告诉调试器仅显示2级嵌套数据。

6

Data::Dumper的替代方法不生成有效的Perl代码,而是一种更易于删除的格式(与Perl调试器的x命令相同)为Dumpvalue。它也消耗更少的内存。

还有Data::Dump::Streamer,它比Data::Dumper更适合各种边缘和角落的情况。

2

我使用Data::Dump,它的输出比Data :: Dumper's(no $ VAR1)更清洁一些,它提供了快捷方式,它也尝试DTRT,即在void context中调用时将打印到STDERR并返回转储字符串时不。

2

我去找同样的东西,发现this lovely little Perl function,明确意味着生成像print_r()这样的结果。

该脚本的作者在论坛here上询问您的确切问题。

print objectToString($json_data); 

给出了这样的输出:

HASH { 
time        => 1233173875 
error       => 0 
node        => HASH { 
    vid        => 1011 
    moderate       => 0 
    field_datestring     => ARRAY { 
     HASH { 
      value       => August 30, 1979 
     } 
    } 

    field_tagged_persons    => ARRAY { 
     HASH { 
      nid        => undef 
     } 
    } 

...and so on...