【问题标题】:perl null or empty detectionperl null 或空检测
【发布时间】:2012-01-20 23:04:04
【问题描述】:

我有一个包含匹配子字符串结果的哈希。如果字符串之间没有匹配,我想打印一条消息。我尝试了以下方法,但没有成功。

foreach (keys %d) { 
    if ($_ eq "") {
        print "no matches"; # and i've tried (if defined $_
    } else {
        print "$_\n";
    }
}

%d 是这样填充的(它包含匹配的子字符串):

foreach (my $i=0;$i<length($seq1)-$k;$i+=1) { 
    my $common=substr($seq1,$i,$k); 
    if ($seq2=~/$common/) {
        $d{$common}++;
    }
}

【问题讨论】:

  • 你的问题很不清楚。给我们一个样本%d 和你想要的样本%d 所需的输出怎么样。

标签: string perl hash


【解决方案1】:

我想我终于看到了你想要完成的事情。您认为检查 %d 中的键是否等于空字符串,那么您的循环中没有匹配项。这是错误的。如果没有匹配,则没有键,循环永远不会执行。

不幸的是,您无法以这种方式检查%d 是否不包含任何值。你需要这样的东西:

unless (%d) { 
    print "No matches\n";
} else {
    print "$_\n" for keys %d;
}

【讨论】:

  • 当 $_ 为空时,打印转储器不提供任何内容
  • @AWRAM 它不应该打印任何东西,它应该打印$VAR1 = ''。您是否打算检查散列的 key 是否为空字符串?例如。如果你有$d{''} = "some value"
  • 我的意思是我没有得到任何东西,当它被设置时它给出 $var1='AC..' 但当它没有返回任何东西时。我需要检查 $_ 本身
  • @AWRAM 不,Data::Dumper 会总是打印一些东西。 “它没有返回任何东西”是一个错误的陈述。如果您使用的是print Dumper $_,那么您正在检查$_ 本身。
  • @AWRAM 我想我终于弄清楚了你想要做什么。检查我更新的答案。
【解决方案2】:

您对所有现有键进行了迭代,并检查它们是否为空字符串,我猜这不是您想要的。

试试

if (defined $d{$_})

或者如果它被设置为 "" 那么

if ($d{$_} eq "")

为了更有帮助,你必须知道你的哈希是如何填充的。

您还需要初始化不匹配的值。在您的代码中,您可以添加一个

if ($seq2=~/$common/) {
    $d{$common}++;
}
else 
{ $d{$common} = 0 unless (exists($d{common})); }

然后检查

if ($d{$_} > 0)

【讨论】:

  • foreach (我的 $i=0;$i
  • 你只初始化那些匹配的 $common。我在上面的代码中编辑了更多行。
  • 在 else {... 行它给了我语法错误(我更正了 $d{$common}
猜你喜欢
  • 2011-05-28
  • 2021-11-30
  • 2014-08-14
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多