如何将Perl的split命令与空白区域修剪结合起来?

前端之家收集整理的这篇文章主要介绍了如何将Perl的split命令与空白区域修剪结合起来?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Repost from Perlmonks为同事:

我编写了一个perl脚本来分隔由分号分隔的长电子邮件列表.我想用代码做的是将分割与白色空间的修剪相结合,所以我不需要两个数组.加载第一个数组时是否需要修剪.输出是一个排序的名称列表.
谢谢.

#!/pw/prod/svr4/bin/perl
use warnings;
use strict;

my $file_data =
  'Builder,Bob  ;Stein,Franklin MSW; Boop,Elizabeth PHD   Cc: Bear,+ Izzy';
my @email_list;

$file_data =~ s/CC:/;/ig;
$file_data =~ s/PHD//ig;
$file_data =~ s/MSW//ig;

my @tmp_data = split( /;/,$file_data );

foreach my $entry (@tmp_data) {
    $entry =~ s/^[ \t]+|[ \t]+$//g;
    push( @email_list,$entry );
}

foreach my $name ( sort(@email_list) ) {
    print "$name \n";
}

解决方法

您不必使用相同的功能一次完成两个操作.有时单独执行操作可能更清楚.也就是说,首先拆分,然后从每个元素中删除空格(然后对结果进行排序):

@email_list =
    sort(
        map {
                s/\s*(\S+)\s*/\1/; $_
            }
            split ';',$file_data
    );

编辑:同时剥离一个以上的字符串的一部分可能导致陷阱,例如思南的观点是关于在“伊丽莎白”部分留下尾随空格.我编写了该代码片段,假设名称不会有内部空格,这实际上是非常错误的,如果我有意识地注意到它,它会突出显示不正确.代码在下面得到了很大改进(也更具可读性):

@email_list =
    sort(
        map {   
                s/^\s+//;  # strip leading spaces
                s/\s+$//;  # strip trailing spaces
                $_         # return the modified string
            }
            split ';',$file_data
    );

猜你在找的Perl相关文章