我有一个以下格式的字符串:
word1.word2.word3
Run Code Online (Sandbox Code Playgroud)
在perl中从该字符串中提取word2的方法有哪些?我尝试了以下表达式,但它将 1 分配给sub:
@perleval $vars{sub} = $vars{string} =~ /.(.*)./; 0@
Run Code Online (Sandbox Code Playgroud)
编辑:
我尝试了几种建议,但仍然得到1的值。我怀疑上面的整个表达式除了解析之外还有问题。但是,当我进行简单的分配时,我得到了正确的结果:
@perleval $vars{sub} = $vars{string} ; 0@
Run Code Online (Sandbox Code Playgroud)
将word1.word2.word3分配给变量sub
.
在正则表达式中具有特殊含义,因此需要对其进行转义。.*
可能比预期匹配更多。[^.]*
更安全。//
) 在标量上下文中仅返回 true/false。您可以使用以下任意一种:
$vars{sub} = $vars{string} =~ /\.([^.]*)\./ ? $1 : undef;
Run Code Online (Sandbox Code Playgroud)
$vars{sub} = ( $vars{string} =~ /\.([^.]*)\./ )[0];
Run Code Online (Sandbox Code Playgroud)
( $vars{sub} ) = $vars{string} =~ /\.([^.]*)\./;
Run Code Online (Sandbox Code Playgroud)
第一个允许您在没有匹配项时提供默认值。
尝试:
/\.([^\.]+)\./
Run Code Online (Sandbox Code Playgroud)
。具有特殊含义,需要转义。然后,您可能希望捕获点之间的值,因此请使用负字符类,例如 ([^\.]+) ,表示至少一个非点。如果你使用 (.*) 你会得到:
word1.stuff1.stuff2.stuff3.word2 结果:
stuff1.stuff2.stuff3
Run Code Online (Sandbox Code Playgroud)
但也许你想要那个?
这是我的小例子,我确实发现 perl one 衬垫有时有点难以阅读,所以我将其分解:
use strict;
use warnings;
if ("stuff1.stuff2.stuff3" =~ m/\.([^.]+)\./) {
my $value = $1;
print $value;
}
else {
print "no match";
}
Run Code Online (Sandbox Code Playgroud)
结果
stuff2
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20258 次 |
最近记录: |