25.2.6 混合C++(www.cppentry.com)使用Perl和shell脚本(2)
然后,通过正则表达式检测当前行是否包含Password:提示符。如果包含,Perl会将密码保存在变量$1中。
- if ($line =~ m/^Password: (.*)/) {
由于找到了匹配,脚本调用encryptString程序,通过检测到的密码获得一个加密的版本。程序的输出存储保存在$result变量中,从程序的结果状态代码保存在变量$ 中。脚本检查$ 变量,如果出现问题则立即退出。如果一切正常,密码行被写入输出文件,并且用加密的密码替代原来的密码。 - $result = `./encryptString $1`;
- if ($ != 0) { exit(-1) }
- print OUTPUT "Password: $result\n";
如果当前行不是一个密码提示符,脚本则将当前行原样写入输出文件。在循环结束时,脚本关闭这两个文件并退出。- } else {
- print OUTPUT "$line";
- }
- }
- close (INPUT);
- close (OUTPUT);
就是这样。项目中需要的另一部分是实际的C++(www.cppentry.com)程序。加密算法的实现超出了本书的讨论范围。最重要的部分是main()函数,因为这个函数接受一个需要加密的字符串作为参数。
参数都包含在C风格字符串数组argc中。在访问argv的元素之前,总是应该查看argc参数。如果argc等于1,那么参数列表中只有1个元素,可以通过argv[0]访问。argv数组的第0个元素通常是程序的名称,因此实际的参数从argv[1]开始。
下面是这个加密输入字符串的C++(www.cppentry.com)程序的main()函数。注意,这个程序返回0表示成功,返回非0值表示失败,这是Unix中使用的标准。
- int main(int argc, char* argv[])
- {
- if (argc < 2) {
- cerr << "Usage: " << argv[0] << " string-to-be-encrypted" << endl;
- return -1;
- }
- cout << encrypt(argv[1]);
- return 0;
- }
- 代码取自Perl\encryptString.cpp
在这个代码中实际上有一个明显漏洞。要加密的字符串是作为命令行参数传递给这个C++(www.cppentry.com)程序的,因此其他用户可以通过进程表查看到这个参数。C++(www.cppentry.com)程序获得输入的一个更安全的方法是通过标准输入向这个程序发送数据,这也是脚本语言的长处。
现在您已经了解了C++(www.cppentry.com)程序可以很简单地和脚本语言结合在一起,您可以在自己的项目中整合两种语言的强大之处。您可以通过脚本语言和操作系统交互,并且控制脚本的流程,另外利用传统编程(www.cppentry.com)语言完成繁重的任务。
这个例子只是为了演示如何结合使用Perl和C++(www.cppentry.com)。C++(www.cppentry.com)11包含了一个正则表达式库,因此很容易将这个Perl/C++(www.cppentry.com)的解决方案转换为一个纯C++(www.cppentry.com)的解决方案。纯C++(www.cppentry.com)解决方案将运行得更快,因为它避免了调用外部程序。有关正则表达式库的详细信息,请参阅第14章。