2014-09-19 237 views
0

我想在if語句中使用範圍運算符來打印某些值,只要$ b的值介於1和3之間,但下面的代碼會進入無限循環。 我不確定在if語句中range操作符是如何工作的。範圍運算符if語句進入無限循環

#!/usr/bin/perl 
use warnings; 
for ($b = 0; $b < 10; $b++) { 
    if ($b = 1 .. 3) { 
     print "test\n"; 
    } 
} 

在此先感謝

+3

你不提,其產生的警告。 – ysth 2014-09-19 06:16:04

+0

感謝大家的回覆。還有一件事情,如果我在「..」左側有兩個條件,那麼它將如何工作,即#!/ usr/bin/perl ##使用警告; (($ c = 1和$ b = 3)...不是$ b--) print(「c和b的值是$ c和$ b \ n」); } }「if()」的範圍是什麼? – user2896215 2014-09-20 00:11:06

+0

如果任一操作數爲..是一個常量,則它被視爲如同您所說的那樣是常量,所以檢查行號。如果操作數是任何其他表達式,則該表達式將被評估爲布爾值。所以你的例子根本不依賴於行號。注意($ c = 1和$ b = 3)始終爲真;你的意思是==不= =? – ysth 2014-09-21 03:27:53

回答

0

我認爲問題出在你的if條件

您正在使用

if($b = 1..3){ 

由於它是往裏走if條件是到$b分配值1所以每次它的價值將保持爲1,這就是它無限循環的方式。

使這一循環到範圍內的工作1..3可以使用

if($b == 1 || $b == 2 ||$b == 3)if($b >= 1 && $b <= 3)

+0

'$ b == 1..3'不會做任何有用的東西。 – 2014-09-19 12:23:33

0

我想你想打印「測試」,如果$ b等於1個或2或3。您的代碼會給「在test.pl第6行使用範圍內的未初始化值(或翻轉)」。而不是3次,它會打印10次。

建議代碼將是:

#!/usr/bin/perl 
use strict; 
use warnings; 

for (my $b = 0; $b<10; $b++){ 
    if($b =~ /[1-3]/){ 
    print "test\n"; 
    } 
} 
+1

你需要錨:'/^[1-3] \ z /';否則任何在其中任何位置具有1,2或3的數字也將匹配。 – ysth 2014-09-19 06:24:59

+0

是的,的確如此。他有1到10個硬編碼和<10,所以我沒有提到。但你的一個是通用的:D – Jassi 2014-09-19 06:36:28

+0

哦,好點。 – ysth 2014-09-19 06:42:22

6

一個Range operator ..不工作,你正在嘗試使用它的方式。你if等同於以下內容:

if ($b = ($. == 1) .. ($. == 3)) { 

因爲你沒有做任何文件操作,$.將是不確定的。因此,該範圍將始終發出警告並失敗,並將undef分配給$b。然後,因爲$b正在分配一個值,for循環將永遠不會退出。

您需要使用simple comparators

#!/usr/bin/perl 
use warnings; 

for ($b = 0; $b < 10; $b++) { 
    if ($b >= 1 && $b <= 3) { 
     print "test\n"; 
    } 
} 

輸出:

test 
test 
test 
+0

你當然是對的......我簡單地迷惑了自己。固定。 – Miller 2014-09-19 06:33:37

5

..在標量上下文不在此範圍操作,這是觸發器操作。你會正確使用它是這樣的:直到第一個條件

while (my $line = readline $filehandle) { 
    # print only first three lines 
    if (1..3) { 
     print "line $.: $line\n"; 
    } 
} 

觸發器返回false返回true(隱含地視爲需要被比作$常量,當前的行號)。然後它繼續返回,直到第二個條件成立。因此,在上面的示例中,僅爲輸入的第1行至第3行輸入了if塊。

無限循環是因爲您每次通過循環將''分配給$ b;也許你的意思是==(比較),而不是=(轉讓)。但即使如此,這種方式也不適用於您嘗試的方式。

如果你想檢查一個數字是否在給定的範圍內,不要使用範圍操作符或觸發器操作符;只是比較:

if ($b >= 1 && $b <= 3) { 
0

@Miller響應很好,它適合您的需求。如果您正在尋找一種搜索方法,如果某個值包含在數組中(數值或非數值,非連續值等),請查看List::Util CPAN模塊。

這個例子講解了價值5到一個數組:

use strict; 
use warnings; 
use List::Util qw/any/; 

my @range = (1 .. 100); 
my $search_for = 5; 
my $found_in_range = any { $_ == $search_for } @range; 
print $found_in_range, "\n"; #<-- prints: 1