【问题标题】:I don't want to use Data::Dumper's default settings, what can I do?我不想使用 Data::Dumper 的默认设置,我该怎么办?
【发布时间】:2011-07-27 21:01:43
【问题描述】:

我发现自己一直在使用这种方法来打印 Perl 值:

sub d {
  Data::Dumper->new([])->Terse(1)->Indent(0)->Values([$_[0]])->Dump;
}

say "x = ", d($x), ' y = ', d($y);

我喜欢这个,因为我不想在输出中出现$VAR1 =,而且我很少处理递归数据结构。

但是每次我调用d() 时创建一个新的Data::Dumper 对象并执行那长长的初始化链的想法让我很困扰。

我可以使用另一个字符串化器吗?

【问题讨论】:

    标签: perl data-dumper


    【解决方案1】:

    选项1,使用Data::Dumper variables

    $Data::Dumper::Terse  = 1;
    $Data::Dumper::Indent = 0;
    
    say Dumper "x =", Dumper($x), " y = ", Dumper($y);  
    

    【讨论】:

    • 不幸的是,它修改了其他所有人的设置。
    • 使用local 设置它们。例如{ local $Data::Dumper::Terse = 1; say Dumper($x); }
    【解决方案2】:
    sub d {
      use feature 'state';
    
      state $dd = Data::Dumper->new([])->Terse(1)->Indent(0);
      return $dd->Values(shift)->Dump;
    }
    

    未经测试,但这样的东西应该可以工作。

    【讨论】:

    • 是的 - 我已经做到了。我还清除了Values,这样转储器对象就不会保留对您转储的最后一个东西的引用。
    【解决方案3】:

    我尝试了Data::Dump 并且从未回头。

    use Data::Dump 'dump';
    
    dump $structure;
    

    【讨论】:

      【解决方案4】:

      Data::Dumper::Concise 很方便。与您需要的设置不同,但可能对其他人有好处。 Sortkeys 尤其重要

      来自文档:

      Data::Dumper::Concise;
      warn Dumper($var);
      

      相当于:

      use Data::Dumper;
      {
        local $Data::Dumper::Terse = 1;
        local $Data::Dumper::Indent = 1;
        local $Data::Dumper::Useqq = 1;
        local $Data::Dumper::Deparse = 1;
        local $Data::Dumper::Quotekeys = 0;
        local $Data::Dumper::Sortkeys = 1;
        warn Dumper($var);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 2018-10-10
        • 2022-12-01
        • 2021-07-15
        • 1970-01-01
        相关资源
        最近更新 更多