[英]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中有两种类型的上下文。
列表是标量的集合,我们使用数组和哈希来命名它们。
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
将包含您的匹配项。
通常,您可以参考$1
来查看第一个匹配括号的内容:
$inFileLine = '<recordNum>SW001</recordNum><state>Assigned</state><title>Fix Something</title>';
$inFileLine =~ m(<State>(.*?)<\/State>)i;
$finishState = $1;
print $finishState;
输出
已分配
在列表上下文中,// g返回匹配的分组的列表,如果没有分组,则返回与整个正则表达式匹配的列表。
但是通常的方法是检查正则表达式的返回值以找出是否存在匹配项,并引用$1
, $2
等来查看匹配项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.