尝试在Perl中使用正则表达式从字符串中获取两个子字符串

时间:2019-02-01 01:01:16

标签: regex perl

我正在尝试构建一个获取以下字符串的正则表达式:

Invalid version of perl: 5.8.7

格式:

Invalid version of _: _

我想知道是否可以在一行中获得语言名称和版本,例如:my ($language,$version) =~ /.../

所以输出将是:

$language = perl
$version = 5.8.7

也许可以使用if-else吗?

2 个答案:

答案 0 :(得分:2)

这是基本的正则表达式,因此请阅读例如perlretut"Mastering Regular Expressions" by Jeffrey E.F. Friedl

TMTOWDTI当然,但这是其中之一:

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

my $input = "Invalid version of perl: 5.8.7";

my($language, $version) = ($input =~ /(\w+):\s+(\d+(?:\.\d+)*)/)
    or die "Can't detect language or version!\n";

print "'${language}' '${version}'\n";

exit 0;

输出

$ perl dummy.pl
'perl' '5.8.7'

答案 1 :(得分:0)

您可以使用“捕获”从字符串中提取多个值。基本版本是这样的。通过用(...)包围文本,可以捕获匹配的正则表达式中的文本。在此示例中,我们将提取“:”两侧的非空格字符。

use feature 'say'; # for "say()"

$_ = 'Invalid version of perl: 5.8.7';

if (/(\S+): (\S+)/) {
  say "Language = $1";
  say "Version  = $2";
}

捕获的文本被放入名为$1$2的变量中。请注意,我们将整个匹配项放在if语句中,以确保在显示任何内容之前匹配正则表达式。

让您的代码更易于理解的另一种方法是将匹配的数据复制到这样的命名变量中:

use feature 'say'; # for "say()"

$_ = 'Invalid version of perl: 5.8.7';

if (my ($language, $version) = /(\S+): (\S+)/) {
  say "Language = $language";
  say "Version  = $version";
}

正如其他人指出的那样,如果您是该语言的新手,那么Perl文档非常值得一读。在这种情况下,您应该花一两个小时来学习perlretut