我有一个数组散列和一个普通数组,根据情况(即用户在程序运行时选择的选项),只会定义其中一个。
演示问题的示例代码:
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
我很可能在这里忽略了一些明显的东西,但看不到这样做的合乎逻辑的方法?