-->
对于不考虑非交互的脚本来说,以下的代码也许很方便!
#!/usr/bin/perl -w
use strict;
print ">";
while(my $next_cmd=<>){
chomp $next_cmd;
system($next_cmd);
print ">";
}
在此,我们并不用考虑非交互的情况。但如果我们考虑非交互呢,毕竟要想让脚本在unix系统中更通用一些,这方面还是要考虑的,如上面的代码:
use strict;
print ">" if -t *ARGV && -t select;
while(my $next_cmd=<>){
chomp $next_cmd;
system($next_cmd);
print ">" if -t *ARGV && -t select;
}
在打印提示符之前,我们应该判断一下,脚本是否处在交互的情况,在这里需要注意的是测试交互的条件:
-t *ARGV && -t select
因为运算符<>是从ARGV读入而不是从STDIN读入,通常情况下print写至STDOUT,但是如果明确select了其他目的地,就不会写至STDOUT了,而每次无参数的调用select将会得到每次print输出至目标文件的句柄。
对于判断是否交互最方便的方法自然是使用CPAN上的模块了IO::Interactive
情况一提供一个判断交互的函数
#!/usr/bin/perl -w
#从测试交互的麻烦中解脱出来,使用模块来完成它
#此种方法比用-t的测试更准一些!可以对比一下此脚本与interactivetest.pl的输出
use strict;
use IO::Interactive qw( is_interactive );
print ">" if is_interactive;
while(my $next_cmd=<>){
chomp $next_cmd;
system($next_cmd);
print ">" if is_interactive;
}
方法二提供一个可写的文件句柄
#!/usr/bin/perl -w
#从测试交互的麻烦中解脱出来,使用模块来完成它
#此种方法比用-t的测试更准一些!可以对比一下此脚本与interactivetest.pl的输出
#此处使用的是模块提供一个可写的文件句柄,实现相互作用的陷式测试
use strict;
use IO::Interactive qw( interactive );
print {interactive} ">";
while(my $next_cmd=<>){
chomp $next_cmd;
system($next_cmd);
print {interactive} ">";
}
以上的例子来自于<PERL HACKS>有兴趣的朋友可以买一本看看!

发表评论