在等号Perl之后从字符串中获取哈希值中的所有值

时间:2016-09-27 09:31:19

标签: perl

我有一个像"Test string has tes value like abc="123",bcd="345",or it it can be xyz="4567" and ytr="434""这样的字符串。

现在我想在等号后获取值。哈希结构如下:

$hash->{abc} =123,
$hash->{bcd} =345,
$hash->{xyz} =4567,

我试过这个$str =~ / (\S+) \s* = \s* (\S+) /xg

3 个答案:

答案 0 :(得分:3)

正则表达式返回捕获的对,可以将其分配给散列,匿名。

use warnings 'all';
use strict;
use feature 'say';

my $str = 'Test string has tes value like abc="123",bcd="345",or it '
        . 'it can be xyz="4567" and ytr="434"';    

my $rh = { $str =~ /(\w+)="(\d+)"/g }

say "$_ => $rh->{$_}" for keys %$rh ;

打印

bcd => 345
abc => 123
ytr => 434
xyz => 4567

发表评论 - 针对=符号周围的可能空格,将其更改为\s*=\s*

答案 1 :(得分:1)

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $string = q{Test string has tes value like abc="123",bcd="345" and xyz="523"};
my %hash = $string =~ /(\w+)="(\d*)"/g;
print Dumper \%hash;

输出

$VAR1 = {
          'xyz' => '523',
          'abc' => '123',
          'bcd' => '345'
        };

Demo

答案 2 :(得分:0)

您的测试字符串如下所示(稍微编辑以修复引用问题)。

'Test string has tes value like abc="123",bcd="345",or it it can be xyz="4567" and ytr="434"'

我用这段代码来测试你的正则表达式:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Data::Dumper;

my $text = 'Test string has tes value like abc="123",bcd="345",or it it can be xyz="4567" and ytr="434"';

my %hash = $text =~ /(\S+)\s*=\s*(\S+)/g;

say Dumper \%hash;

这给出了这个输出:

$VAR1 = {
          'abc="123",bcd' => '"345",or'
          'ytr' => '"434"',
          'xyz' => '"4567"'
        };

问题是\S+匹配任何非空白字符。这太过分了。您需要对有效字符更具描述性。

你的钥匙似乎都是字母。并且您的值都是数字 - 但它们被您不想要的引号字符包围。所以请尝试使用此正则表达式= /([a-z]+)\s*=\s*"(\d+)"/g

这给出了:

$VAR1 = {
          'bcd' => '345',
          'abc' => '123',
          'ytr' => '434',
          'xyz' => '4567'
        };

对我而言看起来是正确的。