2017-01-09 18 views
0

特定の値の文字数が1000未満であることを確認したいのですが、値が配列かハッシュかスカラーかどうかはわかりません。Perl:文字列の制限文字スカラー変数

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

ただし、数値が入力された場合はどうなりますか?無意識のうちに数字の値を文字列に変換しますか?その場合は、長さをチェックする前に数値をチェックする方法がありますか?

答えて

7

あなたの質問に、あなたは文字列の文字数を確認することを言って、それを含む変数もできることをしていますハッシュリファレンスまたは配列リファレンス。

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は空の文字列を返します。したがって、次のステートメントに実行が続きます。あなたは、単にのでlength(500)3あるlength("500")、同じである、$valueの文字列化の長さを取る

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

この

をしたいです。


$valueが数字への参照である場合、コードも間違っています。 length($value)は参照の文字列の長さをとります。あなたは

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

$$ref${ $ref }用ショート)が$refによって参照するスカラーですたいです。

は(それはスカラーへの参照を持っていることは非常にまれだということに注意してください。)