如何仅在字符串表示整数时转为Int?探讨Perl 6类型强制转换特性
如何仅在字符串代表整数时将其转换为Int类型?
在Perl 6里,本身有一套类型强制转换机制——你可以指定某个类型能被强制转换到目标类型。比如当你需要Int类型,但拿到的是能转换成Int的Str时,这个机制就很省心:不用专门写分支分别处理原生Int和代表整数的字符串,直接用强制转换就能搞定。
但这里有个坑:这个转换机制有点过于激进。它不光会帮你把类型从Str改成Int,还会悄悄修改数据——本质上是Perl 6把类型转换和数值截断的概念混在一起了。比如你要是把"123.45"这种带小数的字符串转成Int,它会直接截断小数部分返回123,但这显然不是我们想要的「仅转换代表整数的字符串」的效果。
那要实现严格的转换,也就是只有当字符串完全是整数的表示时才转成Int,可以试试这两种方法:
方法1:先做正则匹配检查
先通过正则确认字符串是纯整数格式,再调用.Int方法转换:
sub safe-str-to-int(Str $input) { if $input ~~ /^ <[0..9]>+ $/ { return $input.Int; } else { die "输入的字符串 '$input' 不是有效的整数表示"; } } # 测试示例 say safe-str-to-int("789"); # 输出 789 # safe-str-to-int("789.0"); # 会抛出异常,因为包含小数点
方法2:用异常捕获处理转换失败
如果字符串无法被解析为整数(比如包含非数字字符或小数),.Int方法会抛出异常,我们可以用try块来捕获这个异常:
my $test-str = "101"; my $result = try { $test-str.Int }; if $result.defined { say "转换成功,结果是: $result"; } else { say "字符串 '$test-str' 不能转换为整数"; }
这种方式也能过滤掉那些不是纯整数的字符串,因为带小数或非数字的字符串在调用.Int时会抛出异常,try块会返回Any,之后我们通过检查是否defined来判断转换是否成功。
内容的提问来源于stack exchange,提问作者brian d foy
相关产品推荐
相关产品推荐

