0

我在 perl 中编写了一个子过程来检查我的字符串数组是否包含特定值。

sub check_if_entity_exists() {

    my $entity      = shift;
    my @entityarray = @_;

    print "my entity to be checked $entity  \n";
    print "entity array before change  @entityarray : \n";

    join(" ", map { s/^\s*|\s*$//g; $_ } @entityarray);

    print " array after change @entityarray \n";

    my $status = "FALSE";

    if (grep { $_ eq $entity } @entityarray) {
        $status = "TRUE";
        return $status;
    }
    else {
        return $status;
    }
}

在上面的代码中@entityarray= xyz.com $entity= xyz.com 由于实体存在于实体数组中,我希望设置为 true,但 flow 将变为 false

输出日志:我的实体在更改 xyz.com 之前要检查 xyz.com 实体数组:更改 xyz.com 后的数组

4

1 回答 1

3

您的check_if_entity_exists子程序有一个空原型。那坚持这个子例程必须没有参数,这是错误的。你永远不应该在 Perl 中使用原型——它们的工作方式与其他语言中的原型不同,并且适用于非常具体的事情。

您还在mapvoid 上下文中使用,并join生成一个立即丢弃的字符串。你应该总是

use strict;
use warnings;

所有程序的顶部,它会告诉你

在 void 上下文中使用无用的连接

你应该把map循环写成

for (@entityarray) {
  s/^\s+//;
  s/\s+\z//;
}

除此之外,您的代码为我做了它应该做的事情。如果我这样称呼它

my @entityarray = ('    xyz.com    ');
my $entity = 'xyz.com';

print check_if_entity_exists($entity, @entityarray);

输出

my entity to be checked xyz.com  
entity array before change      xyz.com     : 
 array after change xyz.com 
TRUE

最好使用firstfrom 的函数来编写它List::Util,就像这样

use List::Util 'first';

sub check_if_entity_exists {
  my $entity = shift;
  defined(first { /^\s*\Q$entity\E\s*$/ } @_) ? 'TRUE' : 'FALSE';
}
于 2013-04-18T10:01:05.393 回答