В Perl, как разделить строку таким желаемым способом? - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть строка str a\tb\tc\td\te

Я хочу, чтобы 1-е значение поля a входило в переменную, затем 2-е значение поля b переходило в другую переменную, затем и c\td для перехода в 3-ю переменную, и последнее значение поля 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 ]

5 голосов
/ 28 ноября 2011

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];
1 голос
/ 28 ноября 2011

Вы можете использовать регулярное выражение с отрицательным прогнозным утверждением, например ::10000

my @fields = split /\t(?!d)/, $string;
...