Perl调用外部命令的方法

发布时间:2020-06-24编辑:脚本学堂
Perl调用外部命令的方法

perl调用外部命令,主要方法:

1. system("command");
使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码。
 

复制代码 代码如下:

#!/usr/bin/perl
@args = (“command”, “arg1″, “arg2″);
system(@args) == 0
or die “system @args failed: $?”

if ($? == -1) {
     print “failed to execute: $!n”;
}
elsif ($? & 127) {
     printf “child died with signal %d, %s coredumpn”,
     ($? & 127), ($? & 128) ? ‘with’ : ‘without’;
}
else {
     printf “child exited with value %dn”, $? >> 8;
}

2. exec("command");
效果同system命令类似,区别是不会开启子进程,而是取代父进程,因此执行完引号中的命令后进程即结束。一般和fork配合使用。
 

复制代码 代码如下:
#!/usr/bin/perl
exec (‘foo’) or print STDERR “couldn’t exec foo: $!”;
{ exec (‘foo’) }; print STDERR “couldn’t exec foo: $!”;

而对于exec这个函数来说,仅仅是执行一个系统的命令,一般情况下并没有返回值。exec只有在系统没有你要执行的命令的情况下,才会返回false值。

3. `command`;
使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车。反引号中的变量在编译时会被内插为其值。
若要获取命令返回值,需要$?>>8

a.sh
 

复制代码 代码如下:
#!/bin/bash
echo "script out put"
exit 2

test.pl
 

复制代码 代码如下:
#!/usr/bin/perl -w
$output = qx(/home/liqing/a.sh);
$exitcode = $?>>8;
print "output = " . $output;
print "exitcode = " . $exitcode;

执行perl文件:
[liqing@localhost ~]$ ./test.pl
output = script out put
exitcode = 2

若$exitcode = $?; 则exitcode=512.

4.

复制代码 代码如下:
open LIST "ls -l|";
    open MORE "|more";
    @list=<LIST>;
    print MORE @list;
    close(LIST);
    close(MORE);
 

使用带管道的文件句柄来执行外部命令,使用方式与读写文件类似。可以从外部命令的输出读取数据,也可以将数据输出到外部命令作为输入。

5.

复制代码 代码如下:
defined(my $pid=fork) or die "Can not fork: $!n";
    unless ($pid) {
        exec ("date");
    }
waitpid ($pid,0);
 

使用fork将会开启子进程与父进程同时执行之后的代码,其中父进程中fork会返回一个非零的数,而子进程中将返回零。上面的代码完成和system("date")相同的功能。比起system单纯地调用外部命令,fork可以完成更加复杂的进程操作。