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

ckocjqey  于 2023-06-23  发布在  Perl
关注(0)|答案(5)|浏览(151)

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

foreach (0 .. 10) {
    print $_ if $_ % 2;
}

应该给予13579我正在寻找一个类似Python中循环理解的语句,例如:

[i for i in range(10) if i % 2]

我知道print $_ foreach 0 .. 10;可以工作,但问题是在语句中也添加了条件...

brjng4g3

brjng4g31#

对于列表中的奇数元素

$_%2 and print for 0..10;

$_&1 and print for 0..10;

或者可能需要奇数索引的元素,其中0..10代表数组索引

my @ary = 0..10;

$_&1 and print $ary[$_] for 0..$#ary;

语法$#ary用于数组@ary的最后一个元素的索引。
关键是Perl的and短路了,所以如果左边的表达式不为真,那么右边的表达式就不会运行。(与or相同-如果LHS为真,则不计算RHS。
如果确实需要数组元素的奇数索引也可以做

my @ary = 0..10; 

print for @ary[grep { $_&1 } 0..$#ary];

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

perl -we'$_%2 and print for 0..10'

如果您实际上需要将每个数字单独打印在一行中,根据发布的评论判断,请将print替换为say。例如,对于来自阵列@ary的奇数阵列元素

$_%2 and say for 0..$#ary;

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

$_&1 and say $ary[$_] for 0..$#ary;

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

a0zr77ik

a0zr77ik2#

为什么不像下面这样?

use warnings;
use strict;

print ($_ % 2 ? $_ : "") for (1..10);
rxztt3cl

rxztt3cl3#

如果你想构建一个特定的列表,你可以使用经典的c风格for循环。此外,如果你想要它“在一行”,你可以只塞到一行。Perl不是Python,对换行符或缩进没有要求。但是,将代码放在一行上会降低可读性。

for (my $i = 1; $i <= 10; $i += 2) { print $i; }

你不必建立列表,并以这种方式删除一半。可能会有一些性能差异,你可以随时进行基准测试,但对我来说,这听起来像是过早的优化。
对于这个问题,如果您愿意,也可以使用while循环,使用相同的逻辑。

my $i = 1; while ($i <= 10) { print $i; $i += 2; }
huus2vyu

huus2vyu4#

Perl不是Python。列表解析很好,但Perl没有。
最接近的perl习惯用法可能类似于

grep $_ % 2 , (0..9);

一行程序来尝试一下:

$ perl -e '@a = grep $_ % 2 , (0..9); print "@a\n"'
1 3 5 7 9

注意,可能在内存和时间方面存在性能差异。我非常确定Perl将构建一个包含10个项目的完整列表,并对其进行过滤以生成一个新列表。列表理解可以直接构建过滤列表。

bxgwgixi

bxgwgixi5#

一般的答案是使用grep

say for grep $_ % 2, 0..10;

作为特定于案例的解决方案,您可以使用以下方法:

say $_ * 2 for 0..5;

相关问题