在perl中当我们需要创建一个进程的时候,一般都是用比较简单易用的system,exec,或者``(反单引号),这几种用法都非常简单,但是他们不能结合一些操作系统中的管道等高效的东西。
所以在perl中还有一种创建进程的方法,就是把进程当做文件句柄那样使用。
open(WHOPROC, "who|"); # open who for reading
观察这句代码,当其中我们不写|的时候,who被认为是一个文件名,然后WHOPROC最终将是一个真实的文件句柄。
但当加上|的时候就表示将要开始一个命令。
当然,|可以在who的前面,也可以在后面。表达的意思也不一样。
当|在后面的时候,表示其前面的命令的的结果将会输出到前面的进程句柄里。而当|在命令前面的时候,表示前面的句柄是用来输入的,输入的数据将会被传给后面的命令。
举例说明:
(1)
如上面所讲,开始先执行dir命令,然后其结果将输出到FLIST,然后后面的循环将结果依次输出
(2)
如上所述,SEARCH将会传递数据到后面的命令。第二句中给SEARCH写入数据,则该数据将会作为参数传递给find命令。
然后运行。
下面以上述两种方法写一个综合的例子,以说明他们的好处。
首先dir的结果输出到FLS句柄里,然后SEARCH将会传递到find命令,在while循环里面将FLS的数据写入SEARCH,这是find命令以SEARCH句柄传递的数据作为参数执行,输出。
最后关闭两个句柄。
值得注意的是,当你不关闭句柄的时候,则你创建的进程有可能在你的perl进程结束的时候将不会退出,它将不受你的perl进程的控制。当我们使用close来关闭句柄,则你的perl进程将会等到你的进程安全退出的时候才会退出。
当然我们一次可以运行多个命令,
如open(WHOPR, "ls | tail -r |");
通过上面的这个例子,我们可以看到这种用法的方便之处,即完全可以通过管道来传递数据,或者得到结果,从而很方便的执行一系列操作,更高效,更方便。
所以在perl中还有一种创建进程的方法,就是把进程当做文件句柄那样使用。
open(WHOPROC, "who|"); # open who for reading
观察这句代码,当其中我们不写|的时候,who被认为是一个文件名,然后WHOPROC最终将是一个真实的文件句柄。
但当加上|的时候就表示将要开始一个命令。
当然,|可以在who的前面,也可以在后面。表达的意思也不一样。
当|在后面的时候,表示其前面的命令的的结果将会输出到前面的进程句柄里。而当|在命令前面的时候,表示前面的句柄是用来输入的,输入的数据将会被传给后面的命令。
举例说明:
(1)
- #! /usr/bin/perl -w
- open (FLIST,"dir | ");
- while(<FLIST>){
- print $;
- }
(2)
- open(SEARCH,'| find "learning"');
- print SEARCH "learningPerl.pl";
- close(SEARCH);
然后运行。
下面以上述两种方法写一个综合的例子,以说明他们的好处。
- #! /usr/bin/perl -w
- print "Using Processes as Filehandles/n";
- open (FLS,"dir |");
- open (SEARCH,'| find "learning"');
- while(<FLS>){
- print SEARCH $_;
- }
- close(FLS);
- close(SEARCH);
最后关闭两个句柄。
值得注意的是,当你不关闭句柄的时候,则你创建的进程有可能在你的perl进程结束的时候将不会退出,它将不受你的perl进程的控制。当我们使用close来关闭句柄,则你的perl进程将会等到你的进程安全退出的时候才会退出。
当然我们一次可以运行多个命令,
如open(WHOPR, "ls | tail -r |");
通过上面的这个例子,我们可以看到这种用法的方便之处,即完全可以通过管道来传递数据,或者得到结果,从而很方便的执行一系列操作,更高效,更方便。