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
    "; 
  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...を印刷するデッドサイクルになります.無数の2.