我正在尋找確保給定值上的字符數小於1000.我的函數不確定值是數組,哈希還是標量。Perl:限制字符串上的字符標量變量
if (ref($value) eq 'SCALAR' && length($value) >= 1000) {
return;
}
但是,如果傳入一個數字會發生什麼?我會不知不覺地將一個數值轉換爲一個字符串,如果有的話,有沒有辦法在檢查數值之前檢查它的長度?
我正在尋找確保給定值上的字符數小於1000.我的函數不確定值是數組,哈希還是標量。Perl:限制字符串上的字符標量變量
if (ref($value) eq 'SCALAR' && length($value) >= 1000) {
return;
}
但是,如果傳入一個數字會發生什麼?我會不知不覺地將一個數值轉換爲一個字符串,如果有的話,有沒有辦法在檢查數值之前檢查它的長度?
在你的問題,你說你檢查字符串中的字符數,而包含變量它也可能是一個哈希引用或數組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
如果$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
以引用的標量。
(請注意,這是非常罕見的有一個標量的參考。)