2017-01-09 29 views
3

我想設置默認值,如果用戶不提供它映射數組哈希與邏輯定義運算符

以下是我的代碼。請指出如何將其與//運算符來完成

use Data::Dumper; 
use Getopt::Long; 
my @viewFiles = ("cdl", "lef", "verilog", "lib"); 
my %viewPaths; 
my $pctDir = "."; 
GetOptions(
    "pctDir=s" => \$pctDir, 
    "cdl=s" => \$viewPaths{"cdl"}, 
    "lef=s" => \$viewPaths{"lef"}, 
    "verilog=s" => \$viewPaths{"verilog"}, 
    "lib=s" => \$viewPaths{"lib"}, 
); 
@viewPaths{@viewFiles} //= ("$pctDir/cdl/topCellName.cdl", "$pctDir/lef/topCellName.lef", "$pctDir/model/verilog/topCellName.v", "$pctDir/model/timing/lib/topCellName.lib"); 
print Dumper \%viewPaths; 

輸出爲:

$VAR1 = { 
      'cdl' => undef, 
      'verilog' => undef, 
      'lib' => './model/timing/lib/topCellName.lib', 
      'lef' => undef 
     }; 

預期輸出:

$VAR1 = { 
      'cdl' => './cdl/topCellName.cdl', 
      'verilog' => './model/verilog/topCellName.v', 
      'lib' => './model/timing/lib/topCellName.lib', 
      'lef' => './lef/topCellName.lef' 
     }; 

回答

3

布爾運算符和//操作上標量,所以他們的LHS在標量上下文中進行評估。這意味着,

@viewPaths{@viewFiles} //= ...; 

相當於

$viewPaths{ $viewFiles[-1] } //= ...; 

因此,相反,你需要做的每個條目:

my @viewFiles = ("cdl", "lef", "verilog", "lib"); 
my %defaults; 
@defaults{@viewFiles} = ("pctDir/cdl/topCellName.cdl", "pctDir/lef/topCellName.lef", "pctDir/model/verilog/topCellName.v", "pctDir/model/timing/lib/topCellName.lib"); 

$viewPaths{$_} //= $defaults{$_} for keys %defaults; 

但是作爲替代 - 預填充哈希工作我認爲:

#!/usr/bin/perl 
use warnings; 
use strict; 

use Data::Dumper; 
use Getopt::Long; 
my @viewFiles = ("cdl", "lef", "verilog", "lib"); 
my %viewPaths; 

@viewPaths{@viewFiles} = ("pctDir/cdl/topCellName.cdl", "pctDir/lef/topCellName.lef", "pctDir/model/verilog/topCellName.v", "pctDir/model/timing/lib/topCellName.lib"); 

GetOptions(
    "cdl=s" => \$viewPaths{"cdl"}, 
    "lef=s" => \$viewPaths{"lef"}, 
    "verilog=s" => \$viewPaths{"verilog"}, 
    "lib=s" => \$viewPaths{"lib"}, 
); 

print Dumper \%viewPaths; 
+1

我可能不得不與你的第一個候補。 實際上,來自用戶的變量'$ pctDir'存在依賴關係。 沒有使用循環的替代方法嗎 –

+1

爲什麼你需要避免使用循環?你隱式地循環你所做的任何事情,因爲這是操作的本質。 – Sobrique

+1

'pctDir'是一個變量(如果有人不清楚 - 原始文章將其作爲靜態文本),那麼是的,您可能需要使用第一個示例。否則,你最終會遇到一些令人討厭的使用'eval'。 – Sobrique