我有一個Perl腳本,它爲將要使用的目錄和文件設置頂端附近的變量。它還需要將一些變量設置爲命令行參數。 例子:如何覆蓋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只能被調用一次(據我所知)。我的第一個snippit中的前4個參數是必需的,上面的最後7個是可選的。我認爲一個理想的情況是設置默認值,就像在我的第一個代碼snippit中一樣,然後以某種方式覆蓋任何已經設置的參數在命令行中傳遞的情況。我考慮將所有選項存儲在散列中,然後在設置每個變量時使用該散列,除非散列中存在條目,但似乎會增加大量附加邏輯。有沒有辦法在腳本的兩個不同位置調用GetOptions?
不知道這是否有道理。
謝謝!
我喜歡這個 - 你能解釋一下像我的$ var || =「somevalue」這樣的行嗎? $ var如何從命令行獲取選項?還是有一個步驟丟失,它從哈希%opts中拉出來? – BrianH 2008-12-10 16:24:26