我有一个以下格式的字符串:
word1.word2.word3
在perl中从该字符串中提取 word2 的方法有哪些? 我尝试了以下表达式,但它将1分配给 sub :
@perleval $vars{sub} = $vars{string} =~ /.(.*)./; 0@
修改
我已经尝试了几个建议,但仍然得到值1.我怀疑上面的整个表达式除了解析之外还有问题。但是,当我做简单的任务时,我得到了正确的结果:
@perleval $vars{sub} = $vars{string} ; 0@
将 word1.word2.word3 分配给变量 sub
答案 0 :(得分:3)
尝试:
/\.([^\.]+)\./
。有特殊意义,需要逃脱。然后你想要捕获点之间的值,所以使用像([^ \。] +)这样的负字符类,这意味着至少有一个非点。如果你使用(。*),你会得到:
word1.stuff1.stuff2.stuff3.word2导致:
stuff1.stuff2.stuff3
但也许你想要那个?
这是我的小例子,我确实发现perl one liners有时候难以阅读所以我把它分解出来:
use strict;
use warnings;
if ("stuff1.stuff2.stuff3" =~ m/\.([^.]+)\./) {
my $value = $1;
print $value;
}
else {
print "no match";
}
结果
stuff2
答案 1 :(得分:3)
.
在正则表达式中具有特殊含义,因此需要进行转义。.*
可能超出预期。 [^.]*
更安全。//
)只在标量上下文中返回true / false。您可以使用以下任何一项:
$vars{sub} = $vars{string} =~ /\.([^.]*)\./ ? $1 : undef;
$vars{sub} = ( $vars{string} =~ /\.([^.]*)\./ )[0];
($vars{sub}) = $vars{string} =~ /\.([^.]*)\./;
$vars{sub} = $vars{string} =~ /\.([^.]*)\./r; # Requires Perl 5.14+
如果没有匹配,第一个允许您提供默认值。
答案 2 :(得分:1)
<div class="panel panel-default" >
<div class="panel-heading">
{{title}}
</div>
<div class="panel-body" ng-style="loadingStyle">
<button class="btn btn-sm btn-default" ng-click="openDialog();" type="button">Open</button>
</div>
</div>
具有特殊含义:任何字符(请参阅括号之间的表达式)
因此,如果搜索文字点,则必须将其转义(.
):
\.
答案 3 :(得分:0)
您必须确保在进行搜索时要求列表。
my $x= $string =~ /look for (pattern)/ ;
将$x
设为1
my ($x)= $string =~ /look for (pattern)/ ;
将$x
设置为模式。