2009-09-11 4 views
10

У меня есть строка, которая с нескольких частей, разделенных вкладками:Как я могу разделить строку на две части с Perl?

Hello\t2009-08-08\t1\t2009-08-09\t5\t2009-08-11\t15 

Я хочу разделить его только на первой вкладке, так что «Hello» заканчивается в $k и и остальные оседают в $v. Это не работает:

my ($k, $v) = split(/\t/, $string); 

Как это сделать?

+3

На самом деле, я только что прочитал документ для split(), был озадачен; googled, и пришел сюда. Где я нашел ответ. – Chap

ответ

36

Для того, чтобы получить, что вам нужно использовать 3-й параметр для split(), который дает функцию максимальное количество полей разделить на (если положительный):

my($first, $rest) = split(/\t/, $string, 2); 
+0

Что делать, если длина значения неопределенная, и я хочу записать все это в $ v. Формат $ v будет выглядеть как date_1 \ tvalue_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ... – biznez

+2

Это будет захватывать «date_1» в $ k и «value_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ...» в $ против Для получения дополнительной информации я связался с страницей ссылок perldoc по функции 'split()', и она объяснит, как она работает во всех деталях, которые вы когда-либо захотите. Я предлагаю вам прочитать его. Perldoc очень информативен. –

7

Нет, это даст вам первые два предмета и бросить все остальное. Попробуйте следующее:

my ($k, $v) = split(/\t/, $string, 2); 
+0

Что делать, если длина значения неопределенная, и я хочу записать все это в $ v. Формат $ v будет выглядеть как date_1 \ tvalue_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ... – biznez

+0

Как сказал в своем комментарии Крис Лютц, число сообщает Perl, сколько частей нужно разбить. Итак, со значением 2 первая часть идет в $ v, первая \ t потребляется в split, а остальная часть строки не изменяется в $ v. –

1

Другим вариантом является использование простого регулярного выражения.

my($k,$v) = $str =~ /([^\t]+)\t(.+)/;