Perl for循环迭代的批处理



我正在尝试编写一个小的Perl脚本,它需要添加睡眠时间,以延迟for循环中的执行命令。

下面是示例。

use strict;
use warnings;
use v5.26.1;
my $delay = 10;
my $num   = 100;
for (my ($i, $d) = (1, $delay); $i <= $num; $i++, $d+=5 ) {
say "delaying iteration $i by $d";
sleep($d);
}

输出也很简单

delaying iteration 1 by 10
delaying iteration 2 by 15
delaying iteration 3 by 20
delaying iteration 4 by 25
delaying iteration 5 by 30

但是我必须为每5次迭代增加睡眠时间示例如下

前5行应该像这样延迟睡眠时间

delaying iteration 1 by 0
delaying iteration 2 by 0
delaying iteration 3 by 0
delaying iteration 4 by 0
delaying iteration 5 by 0

接下来的5行应该延迟5秒雨夹雪时间,像这样

delaying iteration 6 by 5
delaying iteration 7 by 5
delaying iteration 8 by 5
delaying iteration 9 by 5
delaying iteration 10 by 5

然后每5次迭代,睡眠时间应该增加5秒。

delaying iteration 11 by 10
delaying iteration 12 by 10
delaying iteration 13 by 10
delaying iteration 14 by 10
delaying iteration 15 by 10

有谁能告诉我怎么让它工作吗?

然后每5次迭代更改一次延迟,使用取模(%)运算符,例如:如有需要

use warnings;
use strict;
use feature 'say';
my $delay = 0;
my $num = 100;
foreach my $n (1 .. $num) {
say $n;
sleep $delay;

$delay += 5 if $n % 5 == 0;  # every 5-th
}

使用嵌套的for循环:

use strict;
use warnings;
use feature 'say';
my $num = 7;
my $d = 0;
my $i = 0;
for my $j (1 .. $num) {
for (1 .. 5) {
$i++;
say "delaying iteration $i by $d";
sleep($d);
}
$d += 5;
}

输出:

delaying iteration 1 by 0
delaying iteration 2 by 0
delaying iteration 3 by 0
delaying iteration 4 by 0
delaying iteration 5 by 0
delaying iteration 6 by 5
delaying iteration 7 by 5
delaying iteration 8 by 5
delaying iteration 9 by 5
delaying iteration 10 by 5
delaying iteration 11 by 10
delaying iteration 12 by 10
delaying iteration 13 by 10
delaying iteration 14 by 10
delaying iteration 15 by 10
delaying iteration 16 by 15
delaying iteration 17 by 15
etc.
for my $i ( 1.. $num ) {
my $d = int( ( $i - 1 ) / 5 ) * 5;
say "delaying iteration $i by $d";
sleep($d);
}

my $d = 0;
for my $i ( 1.. $num ) {
say "delaying iteration $i by $d";
sleep($d);
$d += 5 if $i % 5 == 0;
}
delaying iteration 1 by 0
[0 second pause]
delaying iteration 2 by 0
[0 second pause]
delaying iteration 3 by 0
[0 second pause]
delaying iteration 4 by 0
[0 second pause]
delaying iteration 5 by 0
[0 second pause]
delaying iteration 6 by 5
[5 second pause]
delaying iteration 7 by 5
[5 second pause]
delaying iteration 8 by 5
[5 second pause]
delaying iteration 9 by 5
[5 second pause]
delaying iteration 10 by 5
[5 second pause]
delaying iteration 11 by 10
[10 second pause]
...

您已经在注释中指出,您提到的延迟是相对于循环的开始。在这种情况下,您需要以下内容:

for my $i ( 1.. $num ) {
sleep( 5 ) if $i % 5 == 1 && $i != 1;
say "iteration $i";
}
iteration 1
iteration 2
iteration 3
iteration 4
iteration 5
[5 second pause]
iteration 6
iteration 7
iteration 8
iteration 9
iteration 10
[5 second pause]
iteration 11
...

最新更新