Perl分裂问题

时间:2016-12-29 19:25:03

标签: perl

我使用split功能在白色空间上分割一个字符串,由于某种原因,分裂是保持数组中的空格我保存它。这是代码

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数组中的空格。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

split : 8 IN后,您$value获得/.../。注意领先的空间。

然后你得到了预期的行为。当使用正则表达式/\s/时,字符串将按给定模式正确分割并返回所有子字符串,但仅删除尾随空格除外。有一些细节和特殊情况,请参阅split

一个值得注意的例子是带有前导空格的字符串,其中/\s+/我们将空字符串作为返回列表中的第一个元素。即使使用' ',我们也会将空字符串作为第一个元素,因为它位于与模式匹配的空白之前。

在您的示例中,似乎有一个前导空格,因此返回一个空字符串。我把它带到了#array; 空格......阵列&#34;你的意思是有数组元素&#34;什么都没有。&#34;那些是空的字符串,应该没有空格。

这可以通过使用模式' '来更改,指定任何数量的空白

  

...当省略PATTERN或由单个空格字符组成的字符串(例如"\x20"/ /,但不是/\s+/)时。在这种情况下,EXPR中的任何前导空格都会在拆分发生之前被删除,而PATTERN则被视为/ /;特别是,这意味着任何连续的空格(不只是单个空格字符)都用作分隔符。但是,通过指定模式" "而不是字符串my @fields = split ' ', $value; 可以避免这种特殊处理,从而只允许单个空格字符作为分隔符。在早期的Perls中......

因此,如果您不在乎多个空间,请使用

/\s+/

请记住,对于近似等效的' ',您必须注意领先的空间。

请注意,使用单个空间(或标签页)时,可能会出现意外情况。例如,可以很容易地隐藏&#39;选项卡,当文本和空格碰巧有一个标签的长度,所以我们没有注意到任何额外的空间,因为它都在标签上对齐。

如果没有使用多个空格,使用// Get the elements var owl_1 = $('.carousel01'); var owl_2 = $('.carousel02'); var owl_3 = $('.carousel03'); // Apply OWL Carousel owl_1.owlCarousel({ items: 1, loop: true, autoplay: true, autoplayTimeout: 5000, smartSpeed: 300, animateOut: 'fadeOut', animateIn: 'fadeIn', nav: false, dots: false }); owl_2.owlCarousel({ items: 1, loop: true, autoplay: true, autoplayTimeout: 5000, smartSpeed: 300, animateOut: 'fadeOut', animateIn: 'fadeIn', nav: false, dots: false }); owl_3.owlCarousel({ items: 1, loop: true, autoplay: true, autoplayTimeout: 5000, smartSpeed: 300, animateOut: 'fadeOut', animateIn: 'fadeIn', nav: false, dots: false }); // STOP AUTOPLAY (without this it wont work, oddly...) owl_1.trigger('stop.owl.autoplay'); owl_2.trigger('stop.owl.autoplay'); owl_3.trigger('stop.owl.autoplay'); // START AUTOPLAY SEQUENCIALLY setTimeout(function(){ owl_1.trigger('play.owl.autoplay', [10]) // <-- 10 is the delay of scroll }, 1000); setTimeout(function(){ owl_2.trigger('play.owl.autoplay', [10]) // <-- 10 is the delay of scroll }, 1500); setTimeout(function(){ owl_3.trigger('play.owl.autoplay', [10]) // <-- 10 is the delay of scroll }, 2000); 会更安全。