2017-01-09 4 views
3

ユーザーが入力しない場合、デフォルト値を設定しようとしています論理的に定義された演算子を使用してハッシュに配列をマップする

以下は私のコードです。

$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

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; 

出力されている//オペレータで行うことができる方法を指してください。スカラーコンテキストで評価されます。事前充填ハッシュ必要があります -

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; 

をしかし代替として:これは

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

だから代わりに、あなたはエントリーごとにそれを実行する必要があり

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

と等価であることを意味し私は考える:

#!/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

関連する問題