2017-01-09 83 views
0

我正在尋找確保給定值上的字符數小於1000.我的函數不確定值是數組,哈希還是標量。Perl:限制字符串上的字符標量變量

if (ref($value) eq 'SCALAR' && length($value) >= 1000) { 
    return; 
} 

但是,如果傳入一個數字會發生什麼?我會不知不覺地將一個數值轉換爲一個字符串,如果有的話,有沒有辦法在檢查數值之前檢查它的長度?

回答

7

在你的問題,你說你檢查字符串中的字符數,而包含變量它也可能是一個哈希引用或數組ref。

if (ref($value) eq 'SCALAR' && length($value) >= 1000) { 
    return; 
} 

但是,你的代碼不檢查字符串或數字的長度。它假設該變量可能是標量引用,但會檢查標量引用的字符串化的長度。

say \"asdf"; 
# SCALAR(0x268e7f8) 

say length \"asdf"; 
# 17 

在64位系統上該長度應始終爲17,或在32位系統上應爲16。


一旦您實際取消引用您的標量引用,將應用以下內容。

#          here and here 
#          ##  # 
if (ref($value) eq 'SCALAR' && length(${ $value }) >= 1000) { 
    return; 
} 

由於Perl沒有類型,數字將被視爲字符串。通過"500"與通過500相同。

say length 500; 
say length "500"; 

__END__ 
3 
3 

本身不會可變轉換。你根本不需要關心。你的代碼很好,只要你在標量引用中包含數字。

標量引用不關心它是否引用一個字符串或數字。

say length ${ \500 }; 
say length ${ \"500" }; 

__END__ 
3 
3 
1

如果$value是您聲明的數字,那麼ref將返回一個空字符串,因此執行將繼續執行到下一個語句。你只是想

if (!ref($value) && length($value) >= 1000) { 
    return; 
} 

這將採取$value的字串長度,所以length(500)是一樣的length("500"),這是3


如果$value是對數字的引用,那麼您的代碼也是錯誤的。 length($value)將採用引用的字符串化的長度。你想

if (ref($ref) eq 'SCALAR' && length($$ref) >= 1000) { 
    return; 
} 

$$ref(簡稱${ $ref })是$ref以引用的標量。

(請注意,這是非常罕見的有一個標量的參考。)