0

我有一个字符串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

如何做到这一点?

4

2 回答 2

5

split当你保持订单时很好。如果你像这样破坏顺序,你就会遇到一些问题。你有两个选择:

  1. 根据拆分\t然后加入你想要的。
  2. 明确。

第一个选择的一个例子是:

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];
于 2011-11-28T10:30:18.533 回答
1

您可以使用带有否定前瞻断言的正则表达式,例如:

my @fields = split /\t(?!d)/, $string;
于 2011-11-28T10:30:50.307 回答