配列のハッシュと通常の配列がありますが、状況 (つまり、プログラムの実行時にユーザーが選択するオプション) に応じて、これらのうちの 1 つだけが定義されます。
問題を示すコード例:
my %hashofarrays;
my @array;
#...
#Some code between here where either %hashofarrays or @array gets defined
#...
if (defined @array) {
foreach my $var1 (@array) {
print "var1 is: $var1\n";
call_subroutine($var1);
print "Something else is printed";
call_anothersubroutine($var1);
call_differentsubroutine($var1);
}
}
if (defined %hashofarrays) {
foreach my $key (keys %hashofarrays) {
print "the key is: $key\n";
foreach my $var1 (@{$hashofarrays{$key}}) {
call_subroutine($var1);
print "Something else is printed";
call_anothersubroutine($var1);
call_differentsubroutine($var1);
}
}
}
上記のコードでわかるように、が定義されている@array
か定義されているかによって%hashofarrays
、対応するif
ステートメントが実行されます。
問題:
ただし、これに関する問題は、次のコード行が両方のif
ステートメントで重複していることです。
call_subroutine($var1);
print "Something else is printed";
call_anothersubroutine($var1);
call_differentsubroutine($var1);
明らかに、これらのforeach
ループに大量のコードが含まれている場合、膨大な量のコードが複製されることになります。
foreach
ループに関して、このコードの重複を回避できる方法はありますか/最善の方法は何ですか?
実際には、次のようなことを行う方法はありますか: (このコードが機能しないことは十分承知していますが、達成しようとしていることを説明しています)
if (defined @array) {
foreach my $var1 (@array) {
} elsif (defined %hashofarrays) {
foreach my $key (keys %hashofarrays) {
print "the key is: $key\n";
foreach my $var1 (@{$hashofarrays{$key}}) {
} #ending bracket of if statement
call_subroutine($var1);
print "Something else is printed";
call_anothersubroutine($var1);
call_differentsubroutine($var1);
} #ending bracket of whatever foreach loop is used
ここで明らかなことを見落としているかもしれませんが、これを行う論理的な方法がわかりませんか?