繁体   English   中英

匹配返回为数组而不是变量

[英]Match returned as array instead of variable

我正在从两个类似XML的标记之间提取一个简单的字符串,但是该匹配将作为数组而不是变量返回。 我正在使用以下代码:

$finishState = $inFileLine =~ m(<State>(.*?)<\/State>)g;

$inFileLine值为:

<recordNum>SW001</recordNum><state>Assigned</state><title>Fix Something</title>

当我运行此代码时, $finishState存储一个“ 1”。 当我改变$finishState@finishState值“分配”被妥善保存。

我不确定为什么以及如何解决此问题。 我绝对不能使用XML解析器。

虽然在数组中拥有所需的值不会杀死我,但我想找出原因,然后修改我的正则表达式以正确填充变量。 我也考虑过使用grep,sed,awk等,但是匹配似乎是一种简洁明了的方法。

$finishState = $inFileLine =~ m(<State>(.*?)<\/State>)g;

在标量上下文中计算正则表达式,并用true(1)或false( "" )值填充$finishState

@finishState = $inFileLine =~ m(<State>(.*?)<\/State>)g;

甚至

($finishState) = $inFileLine =~ m(<State>(.*?)<\/State>)g;

在列表上下文中评估正则表达式。 标量上下文和列表上下文之间的区别在Perl中很重要,这也是新Perl程序员最大的困惑之源之一。 在两个不同的上下文中,许多函数和操作的行为均不同,通常,要确保在特定上下文中应该执行的操作的唯一方法是阅读docs

在这种情况下@finishState将由与正则表达式中与捕获组匹配的所有字符串的列表填充(即,长度为0或更长的所有字符串,由<State></State>标记括起来),在您的示例中是值为Assigned的一个元素的列表。

这称为上下文。 Perl是基于上下文的语言,操作数给出的结果取决于您正在评估的上下文。

perl中有两种类型的上下文。

  1. 标量上下文。
  2. 列出上下文。

列表是标量的集合,我们使用数组和哈希来命名它们。

my $finishState = $inFileLine =~ m(<State>(.*?)<\/State>)g;

在这种情况下,您将在标量上下文中评估表达式,这将为您提供布尔值,无论该值是否匹配,即您的情况下为1(matched)

my @finishState = $inFileLine =~ m(<State>(.*?)<\/State>)g;

在这种情况下,您将表达式评估为数组,因此它将为您提供数组中的所有匹配项。

因此,您知道只有一个匹配项,并且要将其存储到标量使用parenthesis以在列表上下文parenthesis对其进行求值。

my ($finishState) = $inFileLine =~ m(<State>(.*?)<\/State>)g;

现在$finishState将包含您的匹配项。

如果有多个匹配项,则$finishState将包含第一个匹配项。 选中节点和节点以获取有关上下文的更多信息。

通常,您可以参考$1来查看第一个匹配括号的内容:

$inFileLine = '<recordNum>SW001</recordNum><state>Assigned</state><title>Fix Something</title>';
$inFileLine =~ m(<State>(.*?)<\/State>)i;
$finishState = $1;
print $finishState;

输出

已分配

perlrequick指出

在列表上下文中,// g返回匹配的分组的列表,如果没有分组,则返回与整个正则表达式匹配的列表。

但是通常的方法是检查正则表达式的返回值以找出是否存在匹配项,并引用$1$2等来查看匹配项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM