使用perl匹配字符串

时间:2018-01-05 20:00:23

标签: regex perl

我在一个变量中存储了一段字符串“Strawberry Hill”。但是我试图使用正则表达式来查看字符串是否与特定格式匹配。如果字符串匹配,我想将其存储在变量中。但是,没有任何内容存储在变量中。我在if语句之外的同一个脚本中测试了正则表达式,并且它有效。

  my $address="STRAWBERRY HILL";

    if($address=~ m/(\w+\s+\w+)/)
    {
        my $scheme_name=$1;
    }
    print " Scheme Name: $scheme_name";

2 个答案:

答案 0 :(得分:2)

首先,始终使用use strict; use warnings qw( all );。您的错误将在编译时发现。

my创建一个新变量,该变量的范围限定(仅在其所在的最内部块中可见)。

有许多可能的解决方案。

  • 移动print

    if ( my ($scheme_name) = $address =~ /(\w+\s+\w+)/ ) {
        print "Scheme Name: $scheme_name\n";
    } else {
        print "Scheme Name: default\n";
    }
    
  • if之前创建变量。

    my $scheme_name = "default";
    if ($address =~ /(\w+\s+\w+)/) {
        $scheme_name = $1;
    }
    
    print "Scheme Name: $scheme_name\n";
    
  • 从使用if切换到使用条件运算符。

    my $scheme_name = $address =~ /(\w+\s+\w+)/ ? $1 : "default";
    print "Scheme Name: $scheme_name\n";
    

答案 1 :(得分:0)

$scheme_name需要在if块之外定义。如果if测试为假,则不会声明$scheme_name

根据Perl's documentation of my

  

my将列出的变量声明为本地(词法)   封闭块,文件或eval。如果有多个变量   如果列出,列表必须放在括号中。

代码

See code in use here

my $address="STRAWBERRY HILL";
my $scheme_name="";

if($address=~ m/(\w+\s+\w+)/)
{
    $scheme_name = $1;
}
print " Scheme Name: $scheme_name";