【问题标题】:How to modify the value if the key is matched with regexp in perl hash?如果键与perl哈希中的正则表达式匹配,如何修改值?
【发布时间】:2013-01-04 07:50:25
【问题描述】:

我有一个名为%coins 的哈希。 如果散列的键与某个字符串匹配,我将尝试修改散列的值。 我尝试了以下代码,但无法成功。它正在创建新密钥,而不是修改现有密钥的值。

请帮忙

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %coins;
%coins = ( "abc" , 1,
          "mno pqr" , 2,
          "xyz",  3 );

print Dumper \%coins;

if(grep {/mno/} keys %coins)
{
    print"matched \n";
    $coins{$_} = s/$coins{$_}/new_val/g;
}

print Dumper \%coins;

【问题讨论】:

标签: regex perl hash


【解决方案1】:

一种方式:

#!/usr/bin/perl
use strict;
use warnings;

use Data::Dumper;

my %coins;
%coins = ( "abc" , 1,
          "mno pqr" , 2,
          "xyz",  3 );

print Dumper \%coins;

my $newval=9;
foreach my $k (keys%coins){
        $coins{$k}=$1.$newval.$2 if ($k =~/(.*)mno(.*)/);
}

【讨论】:

  • 感谢您的回答。但我想用9 pqr 替换mno pqr(即2)的值。
  • 好的。说清楚:我想用与键相同的值替换匹配键的值,但通过替换键中的匹配内容。 Pheww .. 越来越混乱了.. 例如(在上面的代码中):如果匹配的键是“mno pqr”,那么我希望将“mno pqr”的值设为“new_value pqr”。
  • 如果密钥是ghi mno pqr怎么办?修改后的值为9 pqr。应该是ghi 9 pqr.....
【解决方案2】:

对于初学者来说,改变

if(grep {/mno/} keys %coins)
{
    ...
}

for(grep {/mno/} keys %coins)
{
    ...
}

至于价值,你想

( my $new_val = $_ ) =~ s/mno/new_value/g;
$coins{$_} = $new_val;

$coins{$_} = $_ =~ s/mno/new_value/gr;    # Perl 5.14+

【讨论】:

  • 如果我这样做,输出是$VAR1 = { 'mno pqr' => 2, 'abc' => 1, 'xyz' => 3 }; matched $VAR1 = { 'mno pqr' => '', 'abc' => 1, 'xyz' => 3 }; 但替换后应该是'mno pqr' => new_value pqr
  • 该值已完成替换为new_val。应该在哪里new_val pqr
  • 例如(在上面的代码中):如果匹配的键是“mno pqr”,那么我希望“mno pqr”的值为“new_value pqr”
  • 哇,这是一件很奇怪的事情。也修复了那个错误。大师的回答并没有我想象的那么糟糕。 (它只是不处理“mno”的多个实例,这可能是也可能不是问题。)
  • 感谢您的回答。这修复了对“mno”多个实例的处理。
猜你喜欢
  • 2011-07-08
  • 2016-02-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2021-12-26
  • 2013-07-05
相关资源
最近更新 更多