将正则表达式模式匹配分配给perl中的变量

时间:2017-01-20 19:36:29

标签: regex perl variables

我想匹配一个模式并将其分配给变量。然后我想打印分配给变量的值

#!/usr/bin/perl -w
use strict;

my $variable = 'iaw75w8yu';
my $value =~ /w[0-9][0-9]w[0-9]/;
print $value;

这应该是打印w78w8,但我改为

Use of uninitialized value $value in pattern match (m//) at ./temp.pl line 5.
Use of uninitialized value $value in print at ./temp.pl line 6.

3 个答案:

答案 0 :(得分:2)

这也有效:

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

my $variable = 'iaw75w8yu';

my $value = $1 if ($variable =~ /(w[0-9][0-9]\w[0-9])/);

print $value if defined ($value);

它似乎更接近你最初想要尝试的东西。但这种方法的不足之处在于可能会发生您的价值未定义的情况。当您在m //语句中开始使用可选捕获时,请记住这一点很重要。

答案 1 :(得分:-1)

  

这应该是打印w78w8

不,不应该!即使您的代码是正确的,它也永远不会打印w78w8,因为您尝试匹配的源字符串不包含w78w8。在下面的例子中,我假设你想说w75w8

问题是您正在尝试匹配未定义的值,其结果未定义。您的代码正在打印警告,这正是您指定-w后应该打印的警告。

如果你想捕捉某些东西,你需要一个capture group

use strict;
use warnings;

use Data::Dumper;

'iaw75w8yu' =~ /(w\d\dw\d)/;
print Dumper($1);

输出:

$VAR1 = 'w75w8';

如果要将匹配项存储在您选择的变量中,则需要在列表上下文中评估表达式:

my @matches = ('iaw75w8yu' =~ /(w\d\dw\d)/);
print Dumper(\@matches);

输出:

$VAR1 = [
          'w75w8'
        ];

答案 2 :(得分:-2)

我通常这样做

#!/usr/bin/perl -w
use strict;

# the variable
my $variable = 'iaw75w8yu';

# the value
my $value;

# regex for the variable
if ( $variable =~ /(w[0-9][0-9]\w[0-9])/ ) {
    $value = $1;
}
else {
    $value = "regex not found";
}
print $value;
相关问题