在linux中,如果要把几个可执行程序结合起来使用,一般是采用shell或者perl,当然,python也可以。

这里说一下在perl里嵌入shell命令的情形。

一般来说,最简单的方式就是采用“(qx//)就可以执行命令

1
2
 $cmd = "du * sh"; 
`$cmd`;

这样命令就执行了,但是却并没有输出。要输入的话,简单的可以这么处理:

1
 print `$cmd`;

这里,如果程序有输入,那就不行了,后面再细说。

 

下面看看另外一种方式,即system执行命令,它可以返回程序的退出状态,也就是说它可以判断程序执行是否成功,我们也可以拿它来做个有趣的东西,看下面的程序:

1
2
3
4
5
6
7
8
#include <iostream> 
using namespace std;  
int main(int argt, char* argv[]){    
     int a = (int)argv[1][0]-48;    
     int b = (int)argv[2][0]-48;    
     cout << a+b << endl;    
     return a+b; 
}

这是一个c++程序,我们把程序的退出状态设定为输入参数的第1和第2个参数的第一个字符代表的数字的和。通过g++,我们把它编译为add程序: g++ add.cc -o add

那么利用perl的system函数,就可以捕获这一退出状态:

1
2
3
4
#!/usr/bin/perl 
 
$a=1;$b=3;
print system("./add $a $b");

输出4

也就是说我们可以利用其他程序来为perl做计算,这个是不是有点像dll的味道? :)

但是这里有个缺点,就是程序的退出状态必须是整数。

那么perl是不是就没办法做这件事了呢? 我要说是,很多perl的fans肯定不乐意了,既然perl强大,我们就见识一下它怎么来做这件事吧

我们把那个c++程序改一改:

1
2
3
4
5
6
#include <iostream> 
using namespace std;  
int main(int argt, char* argv[]){     
    cout << (int)argv[1][0];    
    return 0; 
}

我们用这个程序来输出第一个参数的第一个字符的ascii码,在perl里我们这么来使用:

1
2
3
4
5
#!/usr/bin/perl
 
$a = "a";
$b = `./add $a`;
print $a,":",$b,"n";

输出 a:97

怎么样,是不是更有dll的味道了?

最后来说一下如果调用的程序里有输入,又该怎么处理呢? 我们再把c++程序改一改

1
2
3
4
5
6
7
8
9
#include<iostream> 
using namespace std;  
int main(){  //这次直接采用输入流输入参数,不直接接受参数     
    char a;     
    cout << "input a char:" << endl;   //这里有endl非常重要,下面解释    
    cin >> a;    
    cout << (int)a << endl;     
    return 0; 
}

这个程序让用户手动输入字符,打印字符的ascii码,来看在perl中的调用

1
2
3
4
5
#!/usr/bin/perl 
 
$cmd = "./add";
open(CMD, "($cmd) |");
while(<CMD>){print;}  #一行一行地输出<br />close(CMD);<br /></cmd>

输出:

input a char:
a
97

解释一下为什么第一个endl很重要,因为在输出的时候,无法同时处理输入和输出,所以加换行,让输入单独在一行。

Logo

更多推荐