2015-11-25 25 views
0

嗨我正在寫一個Perl腳本來完成一些任務。在我的腳本中,我使用一個if循環來比較兩個字符串,如下所示。'='正在代替'eq'

if($feed_type eq "SE"){ 
...........} 

上面的代碼沒有給我任何警告,但輸出不像我預期的那樣。 而不是'eq'如果我使用'='我收到警告說expectng '==' but '=' is present。但我獲得了預期的產出。 理想的字符串比較我必須使用'eq'和數字'=='。在這種情況下,它不起作用。任何人都可以弄清楚這裏有什麼問題?

更多信息:

if迴路存在於子程序。 $feed_type是該子程序的輸入。我正在讀取輸入如下:

my [email protected]_; 

問題已修復。我只是改變FEED_TYPE的assignemet聲明如下

my $feed_type=$_[0]; 

,它的讀取值SE和代碼工作。 但我仍然不知道爲什麼my $feed_type=$_[0];沒有工作。

+0

我們不禁不知道'$ feed_type'裏面有什麼。在你展示的那一行之前打印一下,看一看。我最好的猜測是它包含一個換行符,因此'eq'不匹配。如果你使用'='它將_assign_'「SE」'賦給'$ feed_type',並且該操作返回一個真值,所以Perl將執行then-block。 – simbabque

+0

@simbabque:我正在使用下面的命令爲SE分配$ feedtype。 my $ feed_type =「SE」 – nithin

+0

這是什麼新行字符?由於我是perl的新手,對此我不太瞭解。 – nithin

回答

1

=用於爲變量賦值,所以您需要'=='來比較數值和'eq'的字符串。

如果抱怨不使用'==',那是因爲$ feed_type不是字符串。

我不能說,因爲沒有更多的代碼。無論$ feed_type是由您設置的,都需要確認它實際上是否包含字符串,或者您是否正確引用它。

+2

你的中間語句在至少幾個級別上是不正確的。 '=='需要數字,而不是字符串。如果找到字符串,它們將被轉換。 OP正在看到的警告是因爲他們正在使用布爾值的上下文中使用賦值,並且使用'='而不是'=='是一個很容易犯的錯誤。 – tjd

+0

是的,你說得對,但我說的是錯的,所以也許我不清楚。 OP期待$ feed_type是一個字符串,它不是那麼警告建議你應該使用'=='。如果碰巧是真的,那麼值爲1,那麼它不是一個字符串,並解釋它。 – Andy

4

=很可能代替eq,但不是因爲你的想法。

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

my $test = "fish"; 
my $compare = "carrot"; 

if ($test = $compare) { 
    print "It worked\n"; 
} 

當然,問題是 - 它會總是的工作,因爲你正在測試一個賦值操作的結果*

* OK,有時賦值操作不起作用。 - 這就是爲什麼一些編碼風格建議測試if (2 == $result)而不是其他方式。

2

這是關於一個核心的Perl概念:上下文。根據上下文,操作員和功能的工作方式不同。在這種情況下:

my $feed_type = @_; 

您正在將標量上下文中的數組分配給該變量。標量上下文中的數組返回其大小,而不是其中的元素。對於此分配按照您的預期工作,您必須直接訪問所需的標量值,如您所建議的:

my $feed_type = $_[0]; 

...或者您也可以通過添加括號把你的變量在列表環境:

my ($feed_type) = @_; 

這有讓您可以執行復雜的任務,這樣的好處:

my ($first, $second, @rest) = @_; 

因此,簡而言之,問題是您比較的是這個樣子:

if($feed_type eq "SE") 

竟是這樣:

if(1 eq "SE") 

並返回false。這是真的。考慮這個自我記錄代碼:

sub foo { 
    my $size = @_; 
    if ($size == 1) { 
     warn "You passed 1 argument to 'foo'\n"; 
     return; 
    } 
} 

它演示了你無意中使用的功能。