【发布时间】:2013-09-03 11:58:36
【问题描述】:
我有一个数组散列和一个普通数组,根据情况(即用户在程序运行时选择的选项),只会定义其中一个。
演示问题的示例代码:
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
我很可能在这里忽略了一些显而易见的事情,但看不到这样做的合乎逻辑的方法?
【问题讨论】:
-
这个答案可能会有所帮助:stackoverflow.com/questions/18574215/…
-
不推荐在数组和哈希上使用
defined。 -
@perl-user 是deprecated in v5.6.0。
标签: perl foreach code-duplication