大佬教程收集整理的这篇文章主要介绍了perl – 比较两个哈希值与混合类型的值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
比较两个哈希与整数,字符串以及可能还有数组的最佳方法是什么?
use warnings; use diagnostics; my $hash1={"key_str"=>"a String","key_int"=>4}; my $hash2={"key_str"=>"b String","key_int"=>2}; foreach my $key ( keys(%$hash1) ) { if ($hash1->{$key} != $hash2->{$key}) { print($key); } }
预期的输出是:
Argument "b String" isn't numeric in numeric ne (!=) at hash_compare.pl line 8 (#1) (W numeriC) The inDicated String was fed as an argument to an operator that expected a numeric value instead. If you're fortunate the message will identify which operator was so unfortunate. Argument "a String" isn't numeric in numeric ne (!=) at hash_compare.pl line 8 (#1)
此外,它在这个级别上的数字和字符串之间没有区别.如果你检查更大或更小的数字上下文和字符串上下文很重要.考虑一下:
@H_691_4@my $foo = 200; my $bar = 99; print $foo > $bar ? $foo : $bar; @H_691_4@my $foo = 200; my $bar = 99; print $foo gt $bar ? $foo : $bar;但是这将打印99,因为9是字母数字(如字符串中)大于2.它比较了字符的代码点数.
但是,如果您只想检查不平等,那么ne运算符就可以了.即使你不确定输入中是否还有数字以外的东西.
foreach my $key ( keys(%$hash1) ) { if ($hash1->{$key} ne $hash2->{$key}) { print($key); } }
eq(和nE)非常聪明,可以看出一个数字最初是一个字符串还是一个没有引号的数字,因为它们的内部表示不同.
警告,技术细节未来.
标量值保存在_SV_s中.这些术语可以包含不同的东西.对于称为IV的简单整数,有一种特殊的内部类型,还有一种称为PV的字符串.当你@R_262_9005@使用数字时,Perl会根据需要在这两者之间进行内部转换,反之亦然.
您可以使用Dump从Devel::Peek获取有关数据内部表示的一些调试信息.
use Devel::Peek; Dump("01"); Dump(01);
这将输出:
SV = PV(0x19560d0) at 0x19327d0 REFCNT = 1 FLAGS = (POK,READONLY,IsCOW,pPOK) PV = 0x1c94fd0 "01"\0 CUR = 2 LEN = 10 COW_REFCNT = 0 SV = IV(0x19739b0) at 0x19739c0 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 1
如您所见,第一个是字符串,第二个是数字.
但如果我们这样做
print "01" eq 01;
没有输出,因为01是一个整数,并将转换为“1”进行比较.由于“01”的0不等于1,因此不会打印任何内容.
如果数据结构的值更复杂,则需要遍历结构.每种类型的元素都需要有自己的处理.可能有数组引用,哈希引用,标量引用,标量,glob引用,dualvars等.可能有您想特别对待的对象.
我建议看看Test::Deep是如何实现这一点的.如果您决定在生产代码中使用它(而不是单元测试),则可以使用Test::Deep::NoTest.
以上是大佬教程为你收集整理的perl – 比较两个哈希值与混合类型的值全部内容,希望文章能够帮你解决perl – 比较两个哈希值与混合类型的值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。