2013-09-25 83 views
1

我使用ActivePerl腳本來接收CSV文件並創建加載到數據庫中的XML文件。這些是用戶數據庫條目,名稱,地址等。我們一直使用家庭電話號碼字段生成初始密碼(我們鼓勵用戶立即更改!)。手機的泛濫意味着我有一羣沒有家庭電話的人,所以我想在家庭電話領域爲空時使用手機領域。Perl「else」語句未執行

我輸入的字段是這樣的:

# 0 Firstname 
# 1 Lastname 
# 2 VP (voicepart) 
# 3 Address 
# 4 City 
# 5 State 
# 6 Zip 
# 7 Phone 
# 8 Mobile 
# 9 Email 

這裏的Perl代碼我工作以創建密碼 - 的create_password子程序工作時,有一個在外地值7:

my $pass_word = ''; 
my $pass_word = create_password($fields[7]); 
if (my $pass_word = '') { 
    print "Use the cell phone number \n"; 
    my $pass_word = create_password($fields[8]); 
} 

「印刷」聲明是告訴我它在做什麼。

這看起來像我應該工作,但「如果」的說法永遠不會觸發。 Print語句不會打印,並且只有字段8中的值纔會生成密碼。我測試$ pass_word的值的方式肯定有問題,但我看不到它。我應該測試$ fields [7]和$ fields [8]的值而不是變量值嗎?如果這不起作用,你如何測試一個Perl變量爲空值?

回答

8

你的代碼有幾個問題。

首先,在使用my聲明變量後,在使用變量前不需要添加my;

其次,對於這一行:

if (my $pass_word = '') 

我認爲你的意思

if ($pass_word == '') 

my被刪除,在第一點講到)

=意味着分配,它返回您分配給$pass_word的值(在此爲''),這就是爲什麼此條件始終返回false。

但是,==在這裏不正確。在Perl中,我們使用eq來比較兩個字符串。 ==用於比較數字。

因此,請刪除第一個以外的所有my,並使用eq來比較您的字符串。

+0

謝謝 - 你們都是正確的,現在就可以工作。我做了徐丁的建議,並且工作。這就是當你經過很長時間後再次拿起Perl並忘記了一個基本的東西時會發生的事情:P我非常感謝幫助! – hedera

5

你在這裏有兩個主要問題。

首先是您的字符串相等性測試。在Perl中,使用運算符eq(如在$string eq 'something'中)比較字符串是否相等。 =是賦值運算符。

第二個是你的(ab)使用my。每個my都會聲明一個「隱藏」前一個變量的新變量,因此實際上你永遠不能重新使用它的值,每次都會遇到undef

在您的if子句中將=替換爲eq;刪除除my的第一次使用以外的所有應用程序,並且應該設置!

+1

此外,我認爲'my'應該從第一個除外的所有語句中刪除。 – paddy

+0

@paddy的確。如果您允許,我會編輯它。 –

+1

如果您有任何興趣在將來避免這些問題,那麼'嚴格使用'和'使用警告'會大聲抱怨這些問題。 – AKHolland

2

my聲明瞭一個新變量,該變量隱藏了周圍範圍中具有相同名稱的變量。刪除過多使用my