在命令行中进行正确交互

| 暂无评论 | 暂无引用通告

-->

对于不考虑非交互的脚本来说,以下的代码也许很方便!

#!/usr/bin/perl -w
use strict;

print ">";
while(my $next_cmd=<>){
        chomp $next_cmd;
        system($next_cmd);
        print ">";
}
在此,我们并不用考虑非交互的情况。但如果我们考虑非交互呢,毕竟要想让脚本在unix系统中更通用一些,这方面还是要考虑的,如上面的代码:

#!/usr/bin/perl -w

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>有兴趣的朋友可以买一本看看!

暂无引用通告

发送引用通告网址: http://supersun.info/mt/mt-tb.cgi/688
如果您想引用这篇日记到您的Blog,请复制上面的链接,放置到您发表文章时的相应界面中。

发表评论

最新资源

  • IMG_1437.JPG
  • line.png
  • bar.png
  • perl_calander.jpg

关于此日记

此日记由 supersun 发表于 2007年8月17日 00:33

此Blog上的上一篇日记perl中屏蔽多行代码

此Blog上的下一篇日记无债一身轻

首页归档页可以看到最新的日记和所有日记。