我想匹配一个模式并将其分配给变量。然后我想打印分配给变量的值
#!/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.
答案 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;