我有一个字符串str a\tb\tc\td\te
我希望第一个字段值a
放入变量,然后第二个字段值b
放入其他变量,然后c\td
放入第三个变量和最后一个字段将值e
放在一个变量中。
如果我这样做
my ($a,$b,$c,$d) = split(/\t/,$_,4);
$c
仅获取c
而$d
将获得d\te
我能做到:
my ($a,$b,$c) = split(/\t/,$_,3);
然后c
将获得c\td\te
我可以以某种方式(怎么做?)摆脱最后的价值并在$d
如何实现这一目标?
答案 0 :(得分:5)
split
是好的。如果你打破了这样的订单,你就会遇到一些问题。你有两个选择:
\t
进行拆分,然后加入您想要的。首选的一个例子是:
my ($a,$b,$c1, $c2, $d) = split /\t/, $_;
my $c = "$c1\t$c2";
第二种选择的例子是:
my ($a, $b, $c, $d) = (/(.*?)\t(.*?)\t(.*?\t.*?)\t(.*?)/;
每组括号都会捕捉到您想要的内容。在?
之后使用非贪婪修饰符(*
)可确保括号不会捕获\t
。
编辑:如果意图是拥有任意数量的变量,那么最好使用数组:
my @x = split /\t/, $_;
my $a = $x[0];
my $b = $x[1];
my $c = join "\t", @x[2..($#x-1)];
my $d = $x[-1];
答案 1 :(得分:1)
您可以使用具有负前瞻断言的正则表达式,例如:
my @fields = split /\t(?!d)/, $string;