如果您不知道它是字符串,数字还是对象,如何比较Perl中的数据?

时间:2014-07-08 19:32:30

标签: perl equality

我在Perl中编写链接列表。链表具有链接在一起的节点。每个节点都有一个值。此值可以是任何值,对象,字符串,数字,引用等。

我的问题是如何比较平等的价值。在编写find函数时,我需要在链表中找到给定的值。但是,由于价值可以是任何值,我不知道如何实施比较操作。

这是我到目前为止查找操作的相关代码片段:

sub find {
    my $val = shift; # we're looking for this value

    my $node = $LinkedList->{head}; # we start looking at the beginning of LL

    while (defined $node) {
        # this is the relevant part, how do I compare $val to $node->{val}
        if ($node->{val} == $val) {
            return $node;
        }
        if ($node->{val} eq $val) {
            return $node;
        }

        $node = $node->{next};
    }
}

使用==eq的两张支票是否足够? (这会处理引用,对象等吗?)

1 个答案:

答案 0 :(得分:3)

你问错了问题。你不需要通用的比较功能;您只需要提供特定于任务的比较功能。

如果链接列表中的数据类型存在显着差异,则必须能够以某种方式区分它们,否则您将无法使用列表中的信息。究竟如何区分它们并不重要;重要的是你必须已经知道如何这样做。

只需将您已有的知识编码到传递给find或构造函数的比较函数中。

sub find {
   my ($self, $is_equal, $arg) = @_;

   my $ap = do { no strict 'refs'; \*{caller().'::a'} };  local *$ap;
   my $bp = do { no strict 'refs'; \*{caller().'::b'} };  local *$bp;

   *$ap = \$arg;

   for (my $node = $self->{head}; $node; $node = $node->{next}) {
      *$bp = \( $head->{val} );
      return $node if $is_equal->();
   }

   return undef;
}

使用示例:

sub is_same_flight {
   # Returns true if $a and $b represent the same flight.
   ...
}

$flights->find(\&is_same_flight, $flight);

my $is_same_flight = sub {
   # Returns true if $a and $b represent the same flight.
   ...
};

$flights->find($is_same_flight, $flight);