2016-12-29 2 views
2

Я использую функцию split, чтобы разделить строку на пробел, и по какой-то причине split сохраняет белые пробелы в массиве, который я сохраняю. Вот кодPerl Split Issue

while (<FP>) { 
    if (/$END_SECTION/) { last; } 
    if (/^\s*$/)  { next; } 
    chomp; 
    ($name, $value) = split m/:/, $_; 
    print __LINE__, "name: $name Value: $value\n" if $debug; 
    if ($name =~ /Diameter/) { #if Diameter is found 
     print __LINE__, "Diameter: $value\n" if $debug; 
     @fields = split /\s/, $value; 
     print __LINE__, " Fields:@fields\n" if $debug; 
     my $wafer_size = $fields[1]; #save index [0] to wafer_size 
     print __LINE__, "Diameter: $wafer_size\n" if $debug; 
     if ($wafer_size =~ /8/) { 
      $p->{Diameter} = "200"; 
     } elsif ($wafer_size =~ /6/) { 
      $p->{Diameter} = "150"; 
     } 
     print __LINE__, "Diameter: $p->{Diameter}\n" if $debug; 
    } 
} 

текст Я Расщепление это:

Wafer Diameter: 8 IN         
Flat Location (T,B,L,R): L 
Die X Step: 31800 UM 
Die Y Step: 25795 UM 

когда код находит /Diameter/ это экономит пустые пространства в @fields массиве. Любая идея, почему это происходит?

ответ

3

При split линия : вы получаете  8 IN в $value. Обратите внимание на ведущее пространство.

Затем вы получаете ожидаемое поведение. Когда используется регулярное выражение /.../, строка должным образом разделяется по данному шаблону и возвращаются все подстроки, за исключением только , заканчивающих пробелов, которые отбрасываются. Есть несколько деталей и особых случаев, см. split.

Заметным примером является строка с ведущими пробелами, где с /\s/ мы получаем пустые строки как первые элементы в возвращаемом списке. Даже с /\s+/ мы получаем пустую строку как первый элемент, так как это предшествует пробелу, сопоставляемому шаблону.

В вашем примере отображается ведущее пространство, поэтому возвращается одна пустая строка. Я полагаю, что «пустые места в ... массиве» вы имеете в виду, что есть элементы массива с «ничего». Это пустые строки, не должно быть пробелов.

Это может быть изменен с помощью шаблона ' ', указав любое количество любого пустого пространства

... когда шаблон либо опущен или строка состоит из одного символа пробела (например, ' ' или "\x20", но не, например, / /). В этом случае все ведущие пробелы в EXPR удаляются до того, как произойдет расщепление, а PATTERN обрабатывается, как если бы это было /\s+/; в частности, это означает, что в качестве разделителя используется любое смежное пробельное пространство (а не только один пробельный символ). Однако этого специального лечения можно избежать, указав шаблон / / вместо строки " ", тем самым позволяя одиночному пространственному символу быть разделителем. В более ранних Перлз ...

Так что, если вы не заботитесь для нескольких пространств используют

my @fields = split ' ', $value; 

Помните, что с почти эквивалентно /\s+/ вы должны следить за ведущим пространство.


Обратите внимание, что при использовании одного пространства (или вкладку) могут быть сюрпризы. Например, может быть скрытая вкладка, когда текст и пробелы имеют длину вкладки, поэтому мы не замечаем дополнительного пространства, так как все выравнивается прямо на вкладке.

Если нет использования нескольких пространств, гораздо безопаснее использовать ' '.

+0

Я подозреваю, что проблема была неверно сформулирована. Разделение «Диаметр вафли: 8 IN» в двоеточии оставит «$ value», начиная с одного пробела. Разделение на '\ s' приведет к созданию списка с пустой строкой в ​​качестве первого элемента. Не «пустое пространство», которое описывает ОП. – Borodin

+1

@Borodin О, да, вот что это такое - я неправильно понял. Я думал, что проблема состоит в том, чтобы расщепить часть до ':' по какой-то причине. Теперь ясно, я подкорректирую. Спасибо. – zdim