我有两个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.
我希望它创建一个输出文件,其日志名称与当前文件的名称相同。
我的另一个限制是在$OUTFILE
和a.pl
中都使用abc.pl
。
如果有更好的方法,请提出建议。
答案 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
。在您的示例中,您已经知道第一个程序的价值。