我想之前已经问过,但我找不到它。
说
my $string = "something_like:this-and/that";
my @w1 = split(/_/, $string);
my @w2 = split(/-/, $w1[1]);
my @w3 = split(/:/, $w2[0]);
print $w3[1]; #print out "this"
无论如何要避免临时数组变量@ w1,@ w2和@ w3并直接得到$ w3 [1]?我记得继续拆分工作,但忘了语法。 感谢。
答案 0 :(得分:4)
是的,这是可能的,但会更难阅读,所以不建议:
my $string = "something_like:this-and/that";
my $this = (split /:/, (split /-/, (split(/_/, $string))[1])[0])[1];
print $this; #print out "this"
或者,您可以在此实例中使用正则表达式,但不要认为它会添加任何内容:
my $string = "something_like:this-and/that";
my ($this) = $string =~ /.*?_.*?:([^-]*)/ or warn "not found";
print $this;
答案 1 :(得分:2)
除非您的实际数据与您的示例明显不同,否则您自己的解决方案会不必要地拆分下划线。你可以写这个
use strict;
use warnings;
my $string = "something_like:this-and/that";
my $value = (split /-/, (split /:/, $string)[1])[0];
print $value;
或者此解决方案使用正则表达式并按照您的要求进行操作
use strict;
use warnings;
my $string = "something_like:this-and/that";
my ($value) = $string =~ /:([^_-]*)/;
print $value;
<强>输出强>
this
答案 2 :(得分:0)
这将修改$string
:
my $string = "something_like:this-and/that";
$string =~ s/^.*:(.+)-.*/$1/;