perlコマンドライン-pパラメータ
操作過程を直接見ましょう
passwdファイルには10行の内容があります.6行目に遭遇した場合nextから7行目、すなわち6行目の内容は印刷されません.
おかしいですね.スキップしていませんね.私の命令も間違いありません.lastを試してみますか?
今回は正常に実行された.これはなぜですか.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には効果がない.
まずlastを見てください.結果は以下の通りです.
lastをnextに変更:
nextが有効になっていないことがわかります.そうしないと、0 1 2 2 2 2...を印刷するデッドサイクルになります.無数の2.
- [root@Centos5 perl]# cat passwd
- 1 root:x:0:0:root:/root:/bin/bash
- 2 bin:x:1:1:bin:/bin:/sbin/nologin
- 3 daemon:x:2:2:daemon:/sbin:/bin/bash
- 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
- 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- 6 sync:x:5:0:sync:/sbin:/bin/sync
- 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
- 8 halt:x:7:0:halt:/sbin:/sbin/halt
- 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
- 10 news:x:9:13:news:/etc/news:
passwdファイルには10行の内容があります.6行目に遭遇した場合nextから7行目、すなわち6行目の内容は印刷されません.
- [root@Centos5 perl]# perl -pe 'next if /^6/' passwd
- 1 root:x:0:0:root:/root:/bin/bash
- 2 bin:x:1:1:bin:/bin:/sbin/nologin
- 3 daemon:x:2:2:daemon:/sbin:/bin/bash
- 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
- 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- 6 sync:x:5:0:sync:/sbin:/bin/sync
- 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
- 8 halt:x:7:0:halt:/sbin:/sbin/halt
- 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
- 10 news:x:9:13:news:/etc/news:
おかしいですね.スキップしていませんね.私の命令も間違いありません.lastを試してみますか?
- [root@Centos5 perl]# perl -pe 'last if /^6/' passwd
- 1 root:x:0:0:root:/root:/bin/bash
- 2 bin:x:1:1:bin:/bin:/sbin/nologin
- 3 daemon:x:2:2:daemon:/sbin:/bin/bash
- 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
- 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には効果がない.
- [root@Centos5 perl]# cat test.pl
- #!/usr/bin/perl -w
- use strict;
- my $i = 0;
-
- while ($i <= 5) {
- print "$i
";
- if ($i == 2) {
- last;
- }
- } continue {
- $i++;
- }
まずlastを見てください.結果は以下の通りです.
- [root@Centos5 perl]# perl test.pl
- 0
- 1
- 2
lastをnextに変更:
- [root@Centos5 perl]# perl test.pl |head -5
- 0
- 1
- 2
- 3
- 4
nextが有効になっていないことがわかります.そうしないと、0 1 2 2 2 2...を印刷するデッドサイクルになります.無数の2.