【问题标题】:Is there a builtin "hash to string" in Perl?Perl 中是否有内置的“hash to string”?
【发布时间】:2010-10-02 08:38:35
【问题描述】:

我将从 Python 背景中学习 Perl,其中内置了以下哈希到字符串的转换:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> str(d)
"{'a': 1, 'c': 3, 'b': 2}"

是否有内置和/或模块具有子例程,其输出如下:

"('a' => 1, 'b' => 2, 'c' => 3)"

奇怪的是,perl "hash to string" 的网络搜索并没有找到我正在寻找的任何内容。谢谢!

【问题讨论】:

    标签: string perl hash


    【解决方案1】:
    use Data::Dumper;
    local $Data::Dumper::Terse = 1;
    my $str = Dumper({a => 1, b => 2, c => 3});
    

    【讨论】:

      【解决方案2】:

      另见JSON

      #!/usr/bin/perl
      use warnings; use strict;
      use JSON;
      
      my $data = {a => 1, b=> 2, c => 3};
      
      print to_json($data);
      

      这会产生:

      {"c":3,"a":1,"b":2}
      

      【讨论】:

      • +1 虽然 Data::Dumper 似乎被选为答案,但我认为 JSON 方法应该得到同样多的认可,因为它是一个非常简单的字符串散列。
      • 虽然最初的问题并不意味着这是一个问题,但 JSON::to_json fast,所以如果你需要序列化很多东西,这可以是比 Data::Dumper 更好的答案。 (doppnet.com/2011/03/how-to-gain-24861-performance-boost-in-perl)
      • 谢谢,无论如何我应该更多地使用 JSON。当然,在 MacOS 上它没有安装,所以首先“cpan install JSON”,感谢stackoverflow.com/a/16382371/446767
      【解决方案3】:

      Data::Dumper 模块是进行这种转换的一种方法。

      【讨论】:

      • 是的,但它确实在字符串之前添加了$VAR1 =
      • 这是真的,烦人但容易处理。
      【解决方案4】:

      使用 Data::Dump 代替 Data::Dumper。基本上是一样的,只是没有那个烦人的$VAR1 = ...cruft:

      use Data::Dump "pp";
      print pp({a => 1, b => 2, c => 3});
      

      生产:

      { a => 1, b => 2, c => 3 }
      

      如果您使用的是 Windows,则 Data::Dump 自 5.8 版起已预安装 ActivePerl

      【讨论】:

      • 无法在 @INC 中找到 Data/Dump.pm - 它不是标准库。
      • 在 ActivePerl 5.10 上,构建 1004,Data::Dump 1.08 已预装。
      • +1,顺便说一句,我没有意识到这个模块存在。它缺少某些附加组件,例如 HTML 格式,但是很好。
      • Kev: 你是说好的 ol' Data::Dumper 可以产生 HTML 格式的输出吗?如果是这样,那就太酷了……
      【解决方案5】:

      另一个燕子解决方案:

      sub pp {
        my $h = shift();
        qq[{${\(join',',map"$_=>$h->{$_}",keys%$h)}}]
      }
      print pp({a => 1, b => 2, c => 3});
      

      但请改用Data::Dumper

      对于非常精美的输出,您也可以使用:

      use Data::Dumper;
      use Perl::Tidy;
      sub pp {
              local $Data::Dumper::Terse    = 1;
              local $Data::Dumper::Indent   = 0;
              my $source = Dumper(@_);
              my $result;
              Perl::Tidy::perltidy(
                      source      => \$source,
                      destination => \$result,
                      argv        => [qw(-pbp -nst)]
              );
              return $result;
      }
      

      如果你更喜欢一些键应该是第一个而不是你可以使用这种方法(我想要type第一和position第二):

          local $Data::Dumper::Sortkeys = sub {
                  [   sort {
                                  if    ( $b eq 'type' )     {1}
                                  elsif ( $a eq 'type' )     {-1}
                                  elsif ( $b eq 'position' ) {1}
                                  elsif ( $a eq 'position' ) {-1}
                                  else                       { $a cmp $b }
                                  } keys %{ $_[0] }
                  ];
          };
      

      【讨论】:

        【解决方案6】:

        如果您有可能使用多级结构,则上述几种解决方案都会出现问题。

        特别是这个标志:

        $Data::Dumper::Terse    = 1;
        

        正如 Data::Dumper 的 perldoc 页面上所述,“简洁”标志可能会生成非 perl 可解析输出。

        如果您可能要使用多深度结构,那么正确的做法是使用:

        $Data::Dumper::Indent = 0;
        

        eval 保证 perl 可解析,这使得序列化为纯文本提供了一种非常简单的方法...

        【讨论】:

          猜你喜欢
          • 2010-11-30
          • 1970-01-01
          • 2013-12-03
          • 2021-09-08
          • 2012-03-15
          • 2011-10-19
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          相关资源
          最近更新 更多