我想在 Perl 的同一行上放置一個條件和回圈。這就是我想要實作的目標:
foreach (0 .. 10) {
print $_ if $_ % 2;
}
這應該給我13579。我正在尋找像 Python 中的回圈理解這樣的陳述句,例如
[i for i in range(10) if i % 2]
我知道這print $_ foreach 0 .. 10;行得通,但問題是在陳述句中添加條件......
uj5u.com熱心網友回復:
對于串列中奇數的元素
$_%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,例如
$_%2 and say for 0..$#ary;
對于來自 array 的奇數陣列元素@ary,或
$_&1 and say $ary[$_] for 0..$#ary;
對于奇數索引處的陣列元素。
添加use feature 'say';到程式的開頭(除非它已被其他加載的工具/庫啟用)。
uj5u.com熱心網友回復:
Perl 不是 Python。串列推導很好,但 Perl 沒有。
最接近的 perl 成語可能類似于
grep $_ % 2 , (0..9);
一個 1-liner 來試試:
$ perl -e '@a = grep $_ % 2 , (0..9); print "@a\n"'
1 3 5 7 9
請注意,記憶體和時間可能存在性能差異。我很確定 Perl 將構建 10 個專案的完整串列并對其進行過濾以創建一個新串列。串列推導可以直接構建過濾串列。
uj5u.com熱心網友回復:
為什么不像下面這樣?
use warnings;
use strict;
print ($_ % 2 ? $_ : "") for (1..10);
uj5u.com熱心網友回復:
如果你想建立一個特定的串列,你總是可以使用經典的c 風格的 for loop。此外,如果你想要它“在一條線上”,你可以把它塞到一條線上。Perl 不是 Python,對換行或縮進沒有要求。但是,將代碼放在一行會降低可讀性。
for (my $i = 1; $i <= 10; $i = 2) { print $i; }
您不必以這種方式構建串列并洗掉其中的一半。可能會有一些性能差異,你可以隨時對其進行基準測驗,但對我來說這聽起來像是過早的優化。
就此而言,while如果您愿意,也可以使用回圈,使用相同的邏輯。
my $i = 1; while ($i <= 10) { print $i; $i = 2; }
uj5u.com熱心網友回復:
一般的答案是使用grep.
say for grep $_ % 2, 0..10;
作為特定于案例的解決方案,您可以使用以下內容:
say $_ * 2 for 0..5;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425537.html
標籤:perl
