perl命令行-p参数

直接看操作过程吧
  
  
  
  
  1. [root@Centos5 perl]# cat passwd  
  2. 1 root:x:0:0:root:/root:/bin/bash 
  3. 2 bin:x:1:1:bin:/bin:/sbin/nologin 
  4. 3 daemon:x:2:2:daemon:/sbin:/bin/bash 
  5. 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 
  6. 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 
  7. 6 sync:x:5:0:sync:/sbin:/bin/sync 
  8. 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 
  9. 8 halt:x:7:0:halt:/sbin:/sbin/halt 
  10. 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 
  11. 10 news:x:9:13:news:/etc/news: 

passwd文件有10行内容。如果遇到第6行则next到第7行,也就是不打印第6行内容。

  
  
  
  
  1. [root@Centos5 perl]# perl -pe 'next if /^6/' passwd  
  2. 1 root:x:0:0:root:/root:/bin/bash 
  3. 2 bin:x:1:1:bin:/bin:/sbin/nologin 
  4. 3 daemon:x:2:2:daemon:/sbin:/bin/bash 
  5. 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 
  6. 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 
  7. 6 sync:x:5:0:sync:/sbin:/bin/sync 
  8. 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 
  9. 8 halt:x:7:0:halt:/sbin:/sbin/halt 
  10. 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 
  11. 10 news:x:9:13:news:/etc/news: 
奇怪了没有跳过啊,我的命令也没错。试试last呢?
  
  
  
  
  1. [root@Centos5 perl]# perl -pe 'last if /^6/' passwd      
  2. 1 root:x:0:0:root:/root:/bin/bash 
  3. 2 bin:x:1:1:bin:/bin:/sbin/nologin 
  4. 3 daemon:x:2:2:daemon:/sbin:/bin/bash 
  5. 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 
  6. 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 
这次正常执行了。这是为什么呢?看下perl -h
  -n              assume "while (<>) { ... }" loop around program
  -p              assume loop like -n but print line also, like sed
看不出啥特殊含义来。
其实-p的真正含义是这样的?
-p等于执行了
while (<>) {
         yourcode;
}continue{
         print;
}
这个语句对于next是不起作用的,也就是即使有next也会执行continue语句,但是对于last和redo是没有效果的。
  
  
  
  
  1. [root@Centos5 perl]# cat test.pl  
  2. #!/usr/bin/perl -w 
  3. use strict; 
  4. my $i = 0
  5.  
  6. while ($i <= 5) { 
  7.         print "$i\n"; 
  8.         if ($i == 2) { 
  9.                 last; 
  10.         } 
  11. } continue { 
  12.     $i++; 
先看last:结果如下没有问题。
  
  
  
  
  1. [root@Centos5 perl]# perl test.pl  
last改为next:
  
  
  
  
  1. [root@Centos5 perl]# perl test.pl |head -5 
可见next没有生效,否则将会是一个死循环,打印0 1 2 2 2 ......无数个2.

你可能感兴趣的:(continue,while,perl,命令行,-p)