【问题标题】:Adding a string while using the split function [Perl]使用拆分功能时添加字符串 [Perl]
【发布时间】:2018-12-03 17:59:27
【问题描述】:

我想在 Perl 中处理一个字符串。在我之前的线程 (link) 上,我询问了如何解析选项。考虑以下字符串:key1=abc,key2=123,key3=xwz。在上一个帖子中,我得到了一个解析的建议:

$arg{"multi"} = { split /[=,]/, $arg{"multi"}};

所以我得到以下输出:

$VAR1 = {
          'multi' => {
                       'key2' => '123',
                       'key1' => 'abc',
                       'key3' => 'xwz'
                     }
        };

我想在键之前插入“自定义”,所以输出将是:

$VAR1 = {
          'multi' => {
                       'custom.key2' => '123',
                       'custom.key1' => 'abc',
                       'custom.key3' => 'xwz'
                     }
        };

我可以通过遍历散列的键来做到这一点,但如果可能的话,我想用与 $arg{"multi"} = { split /[=,]/, $arg{"multi"}}; 相同的命令来做到这一点。

我尝试将custom 放在split$arg{"multi"} 之前,但它没有按预期工作。如何解决这个问题?

编辑:有没有办法做到这一点,而无需导入任何新功能和模块?如果我们需要将$arg{"multi"} = { split /[=,]/, $arg{"multi"}};改成别的东西,也算是一种解决方案。

【问题讨论】:

    标签: perl split


    【解决方案1】:

    您可以使用/r 修饰符(“return”)进行替换:

    $arg{multi} = { split /[,=]/, $string =~ s/(^|,)/$1custom./gr };
    

    /r 是在 Perl 5.14 中引入的。

    【讨论】:

      【解决方案2】:

      您可以使用List::Util 中的pairmap 函数:

      use List::Util 1.29 'pairmap';
      $arg{multi} = { pairmap { ("custom.$a" => $b) } split /[=,]/, $arg{multi} };
      

      或者由于您在此处创建哈希,您可以简单地将值移动到新键。

      $arg{multi} = { split /[=,]/, $arg{multi} };
      $arg{multi}{"custom.$_"} = delete $arg{multi}{$_} for keys %{$arg{multi}};
      

      【讨论】:

        【解决方案3】:

        据我所知,没有一种简洁优雅的方式可以从列表中动态挑选出每一个奇怪的元素。在一个语句中做到这一点的一种方法

        use feature 'state';
        
        $arg{multi} = 
            map { state $cnt; (++$cnt % 2 != 0) ? qq(custom.$_) : $_ } 
            split /[=,]/, $arg{multi};
        

        【讨论】:

          【解决方案4】:

          = 上拆分和在, 上拆分有两个不同的目的,现在您要处理= 拆分的一侧,您应该考虑将它们分开。这不需要让操作过于简洁。

          $arg{"multi"} = { map { ($k,$v)=split/=/; "custom.$k" => $v } split /,/, $str };
          

          $arg{"multi"} = { map { split /=/,"custom.$_"} split /,/,$str }; 
          

          【讨论】:

            猜你喜欢
            • 2011-12-03
            • 2020-04-07
            • 2013-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-21
            • 2011-05-03
            • 1970-01-01
            相关资源
            最近更新 更多