【问题标题】:Perl Split IssuePerl 拆分问题
【发布时间】:2016-12-29 19:25:03
【问题描述】:

我正在使用 split 函数在空白处拆分字符串,出于某种原因 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 数组中。知道为什么会这样吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    当您split 时,: 将在$value 中得到 8 IN。注意前导空格。

    然后您将获得预期的行为。当使用正则表达式 /.../ 时,字符串被给定的模式适当地分割并返回所有子字符串,除了 trailing 空格被删除。有一些细节和特殊情况,请看split

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

    在您的示例中,似乎有 一个 前导空格,因此返回了一个空字符串。我认为“...数组中的空格”是指数组元素“无”。那些是空的字符串,应该没有空格。

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

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

    所以,如果您不关心多个空格,请使用

    my @fields = split ' ', $value;
    

    请记住,对于接近等效的 /\s+/,您必须注意前导空格。


    请注意,当使用 单个 空格(或制表符)时,可能会出现意外情况。例如,很容易有一个“隐藏”选项卡,当文本和空格恰好具有选项卡的长度时,我们不会注意到任何额外的空间,因为它们都在选项卡上对齐。

    如果不使用多个空格,则使用' ' 会更安全。

    【讨论】:

    • 我怀疑这个问题被错误地陈述了。在冒号上拆分 Wafer Diameter: 8 IN 将留下一个以单个空格开头的 $value。在\s 上拆分它会生成一个列表,其中第一个元素是空字符串。不是 OP 描述的“空白空间”。
    • @Borodin 哦,是的,就是这样——我看错了。我认为问题在于出于某种原因拆分: 之前的部分。现在清楚了,我会调整的。谢谢。
    猜你喜欢
    • 2011-05-30
    • 2023-03-29
    • 1970-01-01
    • 2011-06-13
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2014-06-21
    相关资源
    最近更新 更多