2017-01-09 27 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