您的代码看起来与我所做的差不多,只是在您使用for
循环解析数组时我会犹豫是否要操作数组。
我会遍历我的数组,找到位置,然后在循环之外进行拼接:
my $module_index;
for my $spec_index ( 0..$#spec ) {
my $item = $spec[$spec_index];
if ( $module =~ /$item/ ) {
$module_index = $spec_index;
last;
}
}
splice (@spec, $module_index, 0, $module);
请注意,我使用0..$#spec
来索引我的数组。这样,我不必增加我的 $module_index。无论如何,使用此语法不允许$spec_index
从循环本身设置值。选择是使用while
循环还是使用 C 样式语法:
my $spec_index;
for ( $spec_index = 0; $spec_index <= $#spec; $spec_index++) {
my $item = $spec[$spec_index];
last if $module =~ /$item/;
}
splice (@spec, $spec_index, 0, $module);
但是,使用C style for loops
被认为是déclassé,或者至少难以维护。根据 Damian Conway(Perl 最佳实践):
Perl 从 C 继承的由三部分组成的 for 语句仅用于不寻常的循环控制行为,例如以两个为单位进行迭代或以不规则的顺序进行迭代。但即使在这种情况下,这些 C 风格的循环也会以一种晦涩难懂且难以维护的方式提供这种不寻常的行为。
有一些方法可以做到这一点,map
并且grep
需要更少的打字,但我不确定它们是否会更好。您已经有了map的最佳答案,但是您可以查看它并在不经过它的情况下说出它在做什么吗?
问题之一是支持。如果其他人查看您的代码试图弄清楚发生了什么,会发生什么?