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

Perl命令没有给出预期的输出,perl,Perl,命令: perl -lpe '1 while (s/(^|\s)(0\d*)(\s|$)/$1"$2"$3/)' test5 输入: 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 012340123 0000 000054 0asdf 0we23-1 电流输出: perl -lpe '1 while (s/(^|\s)(0\d*

命令:

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

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

012340123

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

例外输出:

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
  • 以0开头的所有字符串都具有字母数字字符,但/和除外。应该是双引号

  • 如果以0开头的字符串只有0,则不应引用字符

  • 应保留字符串之间的间距


  • 这似乎是您想要的:

    #!/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
    
    因为这也会占用空间

    join "", @fields;
    
    可使用
    -a
    将其简化为一个用于自动分裂的内衬:

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

    如果要执行第二位(严格保留空白),则需要删除
    -a
    并自己使用
    拆分

    1 while
    的作用是什么?为什么要在这里创建一个神奇的正则表达式,而解决这个问题要简单得多(例如,“0we23-1”如何在模式拾取字符串时被引用?在我的场景中,您的解决方案非常有效。有一件事,我们如何从任何文本文件而不是标量值传递变量或数据,而是使用
    ,它将在命令行上读取STDIN或文件-与
    grep
    /
    sed
    /
    awk
    函数的方式相同。