Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何结合Perl';s带空白修剪的拆分命令?_Perl_Split - Fatal编程技术网

我如何结合Perl';s带空白修剪的拆分命令?

我如何结合Perl';s带空白修剪的拆分命令?,perl,split,Perl,Split,对于同事: 我编写了一个perl脚本,用分号分隔电子邮件的长列表。我想对代码做的是将分割与空白的修剪结合起来,这样我就不需要两个数组了。在加载第一个阵列时,是否需要修剪。输出是名称的排序列表。 谢谢 如果您不需要修剪第一个和最后一个元素,这将完成以下操作: @email_list = split /\s*;\s*/, $file_data; 如果确实需要修剪第一个和最后一个元素,请先修剪$file\u data,然后重复上述操作:-P好吧,您可以按照Chris的建议做,但它不能处理$file\

对于同事:

我编写了一个perl脚本,用分号分隔电子邮件的长列表。我想对代码做的是将分割与空白的修剪结合起来,这样我就不需要两个数组了。在加载第一个阵列时,是否需要修剪。输出是名称的排序列表。 谢谢


如果您不需要修剪第一个和最后一个元素,这将完成以下操作:

@email_list = split /\s*;\s*/, $file_data;

如果确实需要修剪第一个和最后一个元素,请先修剪
$file\u data
,然后重复上述操作:-P

好吧,您可以按照Chris的建议做,但它不能处理$file\u数据中的前导空格和尾随空格

您可以像这样添加这些处理:

$file_data =~ s/\A\s+|\s+\z//g;
另外,请注意,不需要使用第二个阵列。选中此项:

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;
}

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

除非出现一些小的sintax错误,否则这将为您完成全部工作。哦,你真漂亮

print join (" \n", sort { $a <=> $b } map { s/^[ \t]+|[ \t]+$//g } split (/;/, $file_data));
print join(“\n”,排序{$a$b}映射{s/^[\t]+|[\t]+$///g}拆分(/;/,$file_data));

您不必使用相同的功能一次性完成两个操作。有时,单独执行操作可能更清晰。也就是说,首先拆分,然后去掉每个元素的空白(然后对结果进行排序):

编辑:同时剥离字符串的多个部分可能会导致陷阱,例如,Sinan下面关于在“Elizabeth”部分中留下尾随空格的观点。我在编写代码片段时假设名称不会有内部空白,这实际上是非常错误的,如果我有意识地注意到它,就会被认为是不正确的。下面的代码有了很大的改进(并且可读性更强):

或者更优雅:

use Algorithm::Loops "Filter";
my @email_list = Filter { s/^[ \t]+|[ \t]+$//g } split /;/, $file_data;
轮到我了:

my @fields = grep { $_ } split m/\s*(?:;|^|$)\s*/, $record;
它还剥离了第一个和最后一个元素。如果
grep
对于去除第一个元素来说过于苛刻:

my ( undef, @fields ) = split m/\s*(?:;|^|$)\s*/, $record;
如果你知道有一个空间,这是可行的,但这不太可能,所以

my @fields = split m/\s*(?:;|^|$)\s*/, $record;
shift @fields unless $fields[0];
是最可靠的方法。

请参见常见问题解答中的

@email_list = sort map {
    s/^\s+//; s/\s+$//; $_
} split ';', $file_data;
现在,还要注意,
for
循环会给数组的每个元素添加别名,因此

@email_list = sort split ';', $file_data;

for (@email_list) {
    s/^\s+//;
    s/\s+$//;
}

也可以。

您是否尝试过:split/\s*\s*/,$file\u data我想您也可以使用unpack(),但我现在无法尝试,而且我无法充分利用unpack()为您提供没有它的解决方案。让map返回s///的结果不是很有用。尝试映射{s/..//g;$},您可能不是指数字排序。显然,注释中不能有多个空格,但在Elizabeth之后有for空格。>首先。。。第二非常好的分数!编辑以上回复。
my ( undef, @fields ) = split m/\s*(?:;|^|$)\s*/, $record;
my @fields = split m/\s*(?:;|^|$)\s*/, $record;
shift @fields unless $fields[0];
@email_list = sort map {
    s/^\s+//; s/\s+$//; $_
} split ';', $file_data;
@email_list = sort split ';', $file_data;

for (@email_list) {
    s/^\s+//;
    s/\s+$//;
}