【问题标题】:Match string using perl [duplicate]使用perl匹配字符串[重复]
【发布时间】:2018-06-15 16:08:27
【问题描述】:

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

  my $address="STRAWBERRY HILL";

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

【问题讨论】:

  • 范围问题:see here -> 将此移至answer
  • 只有一件事要说use strict; use warnings;

标签: regex perl


【解决方案1】:

首先,始终使用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";
    

【讨论】:

    【解决方案2】:

    简介

    $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";
    

    【讨论】:

    • 这太可怕了。你无法区分声明和定义;没有if 语句,所以它不能return 任何东西。问题不在于 "$scheme_name 从未真正被设置" 而是它不存在。请停止“帮助”您的 Perl 见解。
    • 请使用 markdown 并避免使用 HTML
    • @Borodin 是的,我同意我应该更加小心我的术语,这完全是我的错,我非常感谢你指出这些错误并为我纠正它们。不过,真的有必要从我的问题中删除所有附加信息吗?我已添加回编码示例、指向 tio 的链接(以查看它正在运行)和指向 Perl 文档的链接。我相信这些部分是任何程序员成功的关键:知道在哪里可以找到信息并举例说明,这样他们就可以准确地了解如何实现解决方案。感谢您帮助我改进答案
    猜你喜欢
    • 2012-12-30
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多