【问题标题】:How can I compare 2 variables if I don't know what they are?如果我不知道它们是什么,如何比较 2 个变量?
【发布时间】:2014-10-23 03:49:52
【问题描述】:

如果我在代码流的某处有 2 个变量 $x$y,我真的不知道它们是否包含数字或字符串,我该如何比较它们?
我的意思是对于字符串我们使用eq 等,而对于数字==<=
还有更多/更少等呢?

【问题讨论】:

    标签: string perl numbers comparison


    【解决方案1】:

    如果你不知道它们是什么,你怎么能问它们是否相同?

    具体来说,你认为这两者是一样的吗?

    "1"
    "1.0"
    

    在数字上,它们都代表一个,但在字符串上它们包含不同的字符,所以是不同的。

    【讨论】:

      【解决方案2】:

      字符串的大/小可以用 cmp 完成。

      if    ( ( $a cmp $b ) == 0 ) { print "a == b\n" }
      elsif ( ( $a cmp $b )  < 0 ) { print "a  < b\n" }
      elsif ( ( $a cmp $b )  > 0 ) { print "a  > b\n" }
      

      重申“123”以上的评论 cmp “56”将给出小于。

      所以你可能想做这样的事情:

      if    ( compareEm($a, $b) == 0 ) { print "a == b\n" }
      elsif ( compareEm($a, $b)  < 0 ) { print "a  < b\n" }
      elsif ( compareEm($a, $b)  > 0 ) { print "a  > b\n" }
      
      sub compareEm {
          my ( $a, $b ) = @_;
          my $isnum = qr/(?=.)(?!^\.$)^[\-\+]?\d*\.?\d*$/o;
          return ( $a =~ $isnum && $b =~ $isnum ) ? $a <=> $b : $a cmp $b;
      }
      

      【讨论】:

        【解决方案3】:

        使用eq,它将永远有效...

        【讨论】:

        • 大于/小于等怎么样?
        • 字符串的“更大/更少”是什么意思?一些字典顺序?
        • 在 Perl 中没有类型,因此您可以将所有标量作为字符串处理。出于这个原因,更大/更少也可以工作,但ltgt 等运算符会将它们作为字符串进行比较。这意味着“123”将小于“56”。
        • Scalar::Util 模块中你有looks_like_number,你可以用它来检查字符串是否是一个数字(或者你可以写一个正则表达式,取决于你的期望,检查一个整数很简单)。
        • @glezmen:那么,如果该函数说它看起来像一个数字,这是否意味着它是整数类型或只有数字的字符串?
        【解决方案4】:

        如果您不知道您的数据是字符串还是数字,那么将它们视为字符串通常是完全安全的。如果您想将数据视为数字,那么您可能应该验证输入以确保其格式正确。

        【讨论】:

          猜你喜欢
          • 2015-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-22
          相关资源
          最近更新 更多