我想在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";
}
}
在此先感謝
我想在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";
}
}
在此先感謝
我認爲問題出在你的if
條件
您正在使用
if($b = 1..3){
由於它是往裏走if
條件是到$b
分配值1所以每次它的價值將保持爲1,這就是它無限循環的方式。
使這一循環到範圍內的工作1..3
可以使用
if($b == 1 || $b == 2 ||$b == 3)
或if($b >= 1 && $b <= 3)
'$ b == 1..3'不會做任何有用的東西。 – 2014-09-19 12:23:33
我想你想打印「測試」,如果$ 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";
}
}
一個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
你當然是對的......我簡單地迷惑了自己。固定。 – Miller 2014-09-19 06:33:37
..
在標量上下文不在此範圍操作,這是觸發器操作。你會正確使用它是這樣的:直到第一個條件
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) {
@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
你不提,其產生的警告。 – ysth 2014-09-19 06:16:04
感謝大家的回覆。還有一件事情,如果我在「..」左側有兩個條件,那麼它將如何工作,即#!/ usr/bin/perl ##使用警告; (($ c = 1和$ b = 3)...不是$ b--) print(「c和b的值是$ c和$ b \ n」); } }「if()」的範圍是什麼? – user2896215 2014-09-20 00:11:06
如果任一操作數爲..是一個常量,則它被視爲如同您所說的那樣是常量,所以檢查行號。如果操作數是任何其他表達式,則該表達式將被評估爲布爾值。所以你的例子根本不依賴於行號。注意($ c = 1和$ b = 3)始終爲真;你的意思是==不= =? – ysth 2014-09-21 03:27:53