Perl命令没有给出预期的输出

时间:2017-11-17 05:46:12

标签: perl

命令:

perl -lpe '1 while (s/(^|\s)(0\d*)(\s|$)/$1"$2"$3/)' test5

输入:

  

1234 012345 0

     

0.000 01234 0

     

01/02/03 5467 0abc

     

01234 0123

     

0000 000054

     

0asdf 0we23-1

当前输出:

perl -lpe '1 while (s/(^|\s)(0\d*)(\s|$)/$1"$2"$3/)' test5
  

1234" 012345" " 0"

     

0.000" 01234" " 0"

     

01/02/03 5467" 0abc"

     

" 01234" " 0123"

     

" 0000" " 000054"

     

0asdf 0we23-1

例外输出:

  

1234" 012345" 0

     

0.000" 01234" 0

     

01/02/03 5467" 0abc"

     

" 01234" " 0123"

     

" 0000" " 000054"

     

" 0asdf" " 0we23-1"

输出中要遵循的条件:

  1. 除了/和之外,所有以0开头的字符串都有字母数字字符。应该加双引号。

  2. 如果字符串以0开头只有0个字符,则不应引用。

  3. 应保留字符串之间的间距。

1 个答案:

答案 0 :(得分:2)

这似乎可以满足您的需求:

#!/usr/bin/env perl

use strict;
use warnings; 

while ( <DATA> ) {
   my @fields = split;
   s/^(0[^\.\/]+)$/"$1"/ for @fields;
   print join " ", @fields, "\n";
}

__DATA__
1234 012345 0
0.000 01234 0
01/02/03 5467 0abc
01234 0123
0000 000054
0asdf 0we23-1

注意 - 它并不像你要求的那样严格保留空白 - 它只是删除它并重新插入一个空格。这似乎符合您的规范,但您可以改为:

my @fields = split /(\s+)/; 

因为这也会占据空间。

join "", @fields;

使用-a进行自动分割可以将其简化为一个衬管:

perl -lane 's/^(0[^\.\/]+)$/"$1"/ for @F; print join " ", @F'

如果你想做第二位(严格保留空白),那么你需要放弃-a并自己使用split