在perl中,如何以这种理想的方式分割字符串?

时间:2011-11-28 10:22:18

标签: perl split chomp chop

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

中得到它

如何实现这一目标?

2 个答案:

答案 0 :(得分:5)

当你保持秩序时,

split是好的。如果你打破了这样的订单,你就会遇到一些问题。你有两个选择:

  1. 根据\t进行拆分,然后加入您想要的。
  2. 明确。
  3. 首选的一个例子是:

    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;