我有一个 Perl 脚本,它在顶部附近为它将使用的目录和文件设置变量。它还需要将一些变量设置为命令行参数。例子:
use Getopt::Long;
my ($mount_point, $sub_dir, $database_name, $database_schema);
# Populate variables from the command line:
GetOptions(
'mount_point=s' => \$mount_point,
'sub_dir=s' => \$sub_dir,
'database_name=s' => \$database_name,
'database_schema=s' => \$database_schema
);
# ... validation of required arguments here
################################################################################
# Directory variables
################################################################################
my $input_directory = "/${mount_point}/${sub_dir}/input";
my $output_directory = "/${mount_point}/${sub_dir}/output";
my $log_directory = "/${mount_point}/${sub_dir}/log";
my $database_directory = "/db/${database_name}";
my $database_scripts = "${database_directory}/scripts";
################################################################################
# File variables
################################################################################
my $input_file = "${input_dir}/input_file.dat";
my $output_file = "${output_dir}/output_file.dat";
# ... etc
这在我的开发、测试和生产环境中运行良好。但是,我试图让覆盖某些变量(无需进入调试器)更容易进行开发和测试。(例如,如果我想设置我的 input_file = "/tmp/my_input_file.dat")。我的想法是使用 GetOptions 函数来处理这个问题,如下所示:
GetOptions(
'input_directory=s' => \$input_directory,
'output_directory=s' => \$output_directory,
'database_directory=s' => \$database_directory,
'log_directory=s' => \$log_directory,
'database_scripts=s' => \$database_scripts,
'input_file=s' => \$input_file,
'output_file=s' => \$output_file
);
GetOptions 只能调用一次(据我所知)。我的第一个片段中的前 4 个参数是必需的,上面的最后 7 个是可选的。我认为理想的情况是在我的第一个代码片段中设置默认值,然后以某种方式覆盖在命令行中传递参数时已设置的任何默认值。我考虑过将所有选项存储在哈希中,然后在使用默认值设置每个变量时使用该哈希,除非哈希中存在条目,但这似乎增加了很多额外的逻辑。有没有办法在脚本的两个不同位置调用 GetOptions?
不确定这是否有意义。
谢谢!