2013-12-22 3 views
6

Я заранее извиняюсь, это, наверное, очень глупый вопрос с очевидным решением, которое ускользает от глаз довольно новичка в perl, или оно также могло быть в Stackoverflow как решаемый вопрос, но мой отсутствие знаний о том, что именно искать, мешает мне найти ответ.perl split странное поведение

У меня есть строка, как:

$s = FOO: < single blankspace> BAR <some whitespace character> some more text with  whitespace that can span over multiple lines, i.e. has \n in them ; 

#please excuse the lack of quotes, and large text describing the character in angular brackets, but in this example, but I have the string correctly defined, and in plase of <blankspace> I have the actual ASCII 32 character etc. 

Теперь я хочу, чтобы разделить $ S, таким образом:

($instType, $inst, $trailing) = split(/\s*/, $s, 3); 
#please note that i do not use the my keyword as it is not in a subroutine 
#but i tested with my, it does not change the behavior 

Я бы ожидать, что $ тип_установки принимает значение FOO:, без какого-либо окружающего пространства, в реальной тестовой строке есть двоеточие, и я считаю, насколько мне известно, что он останется в $ instType. Тогда довольно очевидно ожидать, что $ inst примет аналогичное значение BAR без каких-либо окружающих пространств, а затем, наконец, можно также опираться на $ trail, чтобы взять остальную часть строки.

Однако, я получаю: $ тип_установки занимает F, то есть только единственный символ, $ инст занимает O, единственный charater во 2-й позиции в строке $ след занимает O: BAR и остальные.

Как решить проблему?

PS Perl является 5.18.0

+0

Вы сделали опцию '\ s *', поэтому она ничего не соответствует нигде, когда это возможно. – sln

ответ

12

проблема квантор * что позволяет нулевое пространство (ноль или более), вы должны использовать вместо +, что означает 1 или более.

Обратите внимание, что существует ровно нулевое пространство между F и О.

+0

привет, спасибо. он просит меня подождать 4 минуты до принятия – Sean

+0

@Sean: fröhliche Weihnachten! –

+0

aw, danke sehr, euch auch! – Sean

1

Вы писали:

#please note that i do not use the my keyword as it is not in a subroutine 
#but i tested with my, it does not change the behavior 

Вы можете и должны использовать my вне подпрограммами, тоже. Пользуясь тем, что в сочетании с use strict предотвращает глупые ошибки, как это:

$some_field = 'bar'; 
if ($some_feild) { ... } 

Если эти заявления были разделены, это может быть очень трудно отследить, что ошибка.

Смежные вопросы