如何将条件和循环放在同一行中?

Li *_* JY 4 perl

我想将条件和循环放在 Perl 的同一行上。这就是我想要实现的目标:

foreach (0 .. 10) {
    print $_ if $_ % 2;
}
Run Code Online (Sandbox Code Playgroud)

这应该给我13579。我正在寻找类似Python中的循环理解的语句,例如

[i for i in range(10) if i % 2]
Run Code Online (Sandbox Code Playgroud)

我知道这print $_ foreach 0 .. 10;可行,但问题是将条件添加到语句中......

zdi*_*dim 8

对于列表中的奇数元素

$_%2 and print for 0..10;
Run Code Online (Sandbox Code Playgroud)

或者

$_&1 and print for 0..10;
Run Code Online (Sandbox Code Playgroud)

或者人们可能想要奇数索引处的元素,其中它0..10代表数组索引

my @ary = 0..10;

$_&1 and print $ary[$_] for 0..$#ary;
Run Code Online (Sandbox Code Playgroud)

该语法$#ary适用于 array 最后一个元素的索引@ary

关键在于 Perl 的and短路,因此如果其左侧的表达式不为 true,则右侧的表达式将不会运行。(同样or- 如果 LHS 为真,则不评估 RHS。)

如果您确实需要奇数索引处的数组元素也可以

my @ary = 0..10; 

print for @ary[grep { $_&1 } 0..$#ary];
Run Code Online (Sandbox Code Playgroud)

以上全部打印13579(无换行)。在一行中,在命令行上输入并运行

perl -we'$_%2 and print for 0..10'
Run Code Online (Sandbox Code Playgroud)

如果您实际上需要在自己的行上打印每个数字(根据发布的评论判断),请替换printsay。例如,对于数组中的奇数数组元素@ary

$_%2 and say for 0..$#ary;
Run Code Online (Sandbox Code Playgroud)

或者,对于奇数索引处的数组元素

$_&1 and say $ary[$_] for 0..$#ary;
Run Code Online (Sandbox Code Playgroud)

添加use feature 'say';到程序的开头(除非其他加载的工具/库已启用它)。