我想把一个条件和循环放在Perl的同一行上。这就是我想要实现的:
foreach (0 .. 10) { print $_ if $_ % 2; }
应该给予13579我正在寻找一个类似Python中循环理解的语句,例如:
13579
[i for i in range(10) if i % 2]
我知道print $_ foreach 0 .. 10;可以工作,但问题是在语句中也添加了条件...
print $_ foreach 0 .. 10;
brjng4g31#
对于列表中的奇数元素
$_%2 and print for 0..10;
或
$_&1 and print for 0..10;
或者可能需要奇数索引的元素,其中0..10代表数组索引
0..10
my @ary = 0..10; $_&1 and print $ary[$_] for 0..$#ary;
语法$#ary用于数组@ary的最后一个元素的索引。关键是Perl的and短路了,所以如果左边的表达式不为真,那么右边的表达式就不会运行。(与or相同-如果LHS为真,则不计算RHS。如果确实需要数组元素的奇数索引也可以做
$#ary
@ary
and
or
my @ary = 0..10; print for @ary[grep { $_&1 } 0..$#ary];
以上全部打印13579(无换行符)。在一行程序中,进入并在命令行上运行
perl -we'$_%2 and print for 0..10'
如果您实际上需要将每个数字单独打印在一行中,根据发布的评论判断,请将print替换为say。例如,对于来自阵列@ary的奇数阵列元素
print
say
$_%2 and say for 0..$#ary;
或者,对于奇数索引的数组元素
$_&1 and say $ary[$_] for 0..$#ary;
将use feature 'say';添加到程序的开头(除非它已经被其他加载的工具/库启用)。
use feature 'say';
a0zr77ik2#
为什么不像下面这样?
use warnings; use strict; print ($_ % 2 ? $_ : "") for (1..10);
rxztt3cl3#
如果你想构建一个特定的列表,你可以使用经典的c风格for循环。此外,如果你想要它“在一行”,你可以只塞到一行。Perl不是Python,对换行符或缩进没有要求。但是,将代码放在一行上会降低可读性。
for (my $i = 1; $i <= 10; $i += 2) { print $i; }
你不必建立列表,并以这种方式删除一半。可能会有一些性能差异,你可以随时进行基准测试,但对我来说,这听起来像是过早的优化。对于这个问题,如果您愿意,也可以使用while循环,使用相同的逻辑。
while
my $i = 1; while ($i <= 10) { print $i; $i += 2; }
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个项目的完整列表,并对其进行过滤以生成一个新列表。列表理解可以直接构建过滤列表。
bxgwgixi5#
一般的答案是使用grep。
grep
say for grep $_ % 2, 0..10;
作为特定于案例的解决方案,您可以使用以下方法:
say $_ * 2 for 0..5;
5条答案
按热度按时间brjng4g31#
对于列表中的奇数元素
或
或者可能需要奇数索引的元素,其中
0..10
代表数组索引语法
$#ary
用于数组@ary
的最后一个元素的索引。关键是Perl的
and
短路了,所以如果左边的表达式不为真,那么右边的表达式就不会运行。(与or
相同-如果LHS为真,则不计算RHS。如果确实需要数组元素的奇数索引也可以做
以上全部打印
13579
(无换行符)。在一行程序中,进入并在命令行上运行如果您实际上需要将每个数字单独打印在一行中,根据发布的评论判断,请将
print
替换为say
。例如,对于来自阵列@ary
的奇数阵列元素或者,对于奇数索引的数组元素
将
use feature 'say';
添加到程序的开头(除非它已经被其他加载的工具/库启用)。a0zr77ik2#
为什么不像下面这样?
rxztt3cl3#
如果你想构建一个特定的列表,你可以使用经典的c风格for循环。此外,如果你想要它“在一行”,你可以只塞到一行。Perl不是Python,对换行符或缩进没有要求。但是,将代码放在一行上会降低可读性。
你不必建立列表,并以这种方式删除一半。可能会有一些性能差异,你可以随时进行基准测试,但对我来说,这听起来像是过早的优化。
对于这个问题,如果您愿意,也可以使用
while
循环,使用相同的逻辑。huus2vyu4#
Perl不是Python。列表解析很好,但Perl没有。
最接近的perl习惯用法可能类似于
一行程序来尝试一下:
注意,可能在内存和时间方面存在性能差异。我非常确定Perl将构建一个包含10个项目的完整列表,并对其进行过滤以生成一个新列表。列表理解可以直接构建过滤列表。
bxgwgixi5#
一般的答案是使用
grep
。作为特定于案例的解决方案,您可以使用以下方法: