2

这个问题涉及 Perl 的可读性和良好实践。我做了一些检查:

  • 如果我有变量 $array_ref,我只需要知道该数组是否至少有一个元素等于文本“匹配”。$array_ref 可能未定义,或者,如果 $array_ref 已定义,则它引用的数组为空(甚至未定义?这可能吗?)

  • 我检查一个标量是否等于 1

  • 我检查另一个标量是否等于“是”

这是我正在使用的当前代码:

 my $is_compatible = $array_ref and defined grep $_ eq 'match', @{$array_ref}
                     and $my_num = 1 and $my_text eq 'yes'.

可以将其修复为更容易更改和阅读吗?此外,它是否适合 $array_ref 的值的所有可能用例?

4

2 回答 2

7

从不使用开始and。您想坚持使用符号运算符来获得它提供的视觉提示。命名运算符通常出现在找到术语的地方,并且and通常or用于流量控制。这两个提示在这里都是错误的,所以你不想给出这些提示。

下面的安排很容易阅读。证据是,您在本=应使用的地方使用了==.

my $is_compatible = ( $array && grep $_ eq 'match', @$array )
    && $my_num == 1
    && $my_text eq 'yes';

如果您想使用 sub,以下就足够了。

sub is_compatible {
   my ($array, $my_num, $my_text) = @_;
   return 0 if !$array || !grep $_ eq 'match', @$array;
   return 0 if $my_num != 1;
   return 0 if $my_text ne 'yes';
   return 1;
}

这两种方法都使相似的事物看起来相似而不同的事物看起来不同,从而实现了极其有效的代码扫描。

于 2012-07-19T01:06:44.703 回答
3
sub is_compatible {
   my $array_ref = shift;
   defined( $array_ref )
       or return;
   ref $array_ref eq ref []
       or return;
   return unless grep $_ eq 'match', @$array_ref;

   my $my_num = shift;
   $my_num == 1
       or return;

   my $my_text = shift;
   $my_text eq 'yes'
       or return;

   return 1;
}
于 2012-07-18T23:53:47.143 回答