从另一个调用一个Perl程序

时间:2018-08-24 07:09:31

标签: perl

我有两个Perl文件,我想用参数从另一个文件中调用一个文件

第一个文件a.pl

$OUTFILE  = "C://programs/perls/$ARGV[0]";
# this should be some out file created inside work like C://programs/perls/abc.log

第二个文件abc.pl

require "a.pl" "abc.log";

# $OUTFILE is a variable inside a.pl and want to append current file's name as log.

我希望它创建一个输出文件,其日志名称与当前文件的名称相同。

我的另一个限制是在$OUTFILEa.pl中都使用abc.pl

如果有更好的方法,请提出建议。

3 个答案:

答案 0 :(得分:7)

require关键字仅包含一个参数。可以是文件名,也可以是包名。您的行

require "a.pl" "abc.log";

是错误的。沿在期望操作符的地方找到字符串的行给出了语法错误。

您可能需要另一个.pl中的一个.pl文件,但这是非常老式的,编写错误的Perl代码。

如果两个文件都未定义包,则将代码隐式放置在main包中。您可以在外部文件中declare a package variable,并在需要的文件中使用它。

abc.pl中:

use strict;
use warnings;

# declare a package variable
our $OUTFILE  = "C://programs/perls/filename";

# load and execute the other program
require 'a.pl';

a.pl中:

use strict;
use warnings;

# do something with $OUTFILE, like use it to open a file handle
print $OUTFILE;

如果运行此命令,它将打印

C://programs/perls/filename

答案 1 :(得分:2)

您应该将要调用的perl文件转换为perl模块:

Hello.pm

#!/usr/bin/perl
package Hello;

use strict;
use warnings;

sub printHello { 
    print "Hello $_[0]\n" 
}
1;

然后您可以将其称为: test.pl

#!/usr/bin/perl

use strict;
use warnings;

# you have to put the current directory to the module search path
use lib (".");
use Hello;

Hello::printHello("a");

我在Windows上的git bash中对其进行了测试,也许您必须在您的环境中进行一些修改。

通过这种方式,您可以传递尽可能多的参数,而不必寻找正在使用且可能未初始化的变量(我认为这是一种不太安全的方法,例如有时您会删除您实际上不需要的文件)。缺点是您需要学习一些有关perl模块的知识,但是我认为这绝对值得。

第二种方法可能是使用exec / system调用(您也可以通过这种方式传递参数;如果可以接受派生子进程),但这是另一回事了。

答案 2 :(得分:2)

我会用另一种方式做。让程序将日志文件的名称作为命令行参数:

% perl a.pl name-of-log-file

a.pl 内,打开该文件以附加到该文件,然后输出所需的内容。现在,您可以在另一个Perl程序之外的其他地方运行它。

# a.pl
my $log_file = $ARGV[0] // 'default_log_name';
open my $fh, '>>:utf8', $log_file or die ...;
print { $fh } $stuff_to_output;

但是,您也可以从另一个Perl程序中调用。 $^X是当前正在运行的 perl 的路径,它以稍微更安全的列表形式使用system

system $^X, 'a.pl', $name_of_log_file

您如何决定如何使用$name_of_log_file。在您的示例中,您已经知道第一个程序的价值。