相关疑难解决方法(0)

如何测试散列中是否存在值?

假设我有这个

#!/usr/bin/perl

%x = ('a' => 1, 'b' => 2, 'c' => 3);
Run Code Online (Sandbox Code Playgroud)

我想知道值2是否是哈希值%x.

怎么做的?

perl

10
推荐指数
5
解决办法
4万
查看次数

在Perl中确定字符串变量是否与列表中的字符串匹配的惯用方法是什么?

规范的一部分说"有些名字很特别,例如Hughie,Dewey,Louis和Donald.在项目的整个生命周期中,可以随意添加其他名称.每当你输入其中一个名字时,请玩quack.wav."

可以写......

while (<>) {
    if ($_ =~ /Hughie|Dewey|Louis/) {
        quack() ;
    }
    elsif ($_ =~ /Donald/ {
        quack() ;
        you_re_fired_apprentice() ; # Easter egg don't tell QA
    }
}
Run Code Online (Sandbox Code Playgroud)

...但是虽然要实施,但它看起来是WTF-y:二进制搜索在哪里?如果鸭子名字的数量突然大幅增加怎么办?它根本不会扩展!

我可以在临时目录中使用这些名称创建空文件,然后使用"文件存在"API,但这看起来很迂回,我必须确保它们最后被删除.

当然有更好的方法吗?

perl hash list

7
推荐指数
3
解决办法
236
查看次数

外部"如果"的Perl匹配不会在循环上重置$ 1

我正在修补Zoidberg Perl shell以修复现代Perl版本在测试时抛出的一些错误.请注意,我不是原作者,也不是我批评他.我遇到了一个有趣的问题,我想要一点历史.

下面的代码采用一系列输入,每个条带关闭和结束sigil.然后它将该sigil存储在一个变量中,如果它没有找到它存储0.原始文件中的代码看起来像测试A,并且必须已经工作,直到并包括perl v5.8给出cpantesters结果.无论如何问题是如果s ///不在"if"测试中,循环时$ 1变量会持续使用最后一个值.这是我的测试.我想知道人们是否可以解释为什么会发生这种情况和/或为什么它曾经工作,我想我明白发生了什么.

#!/usr/bin/perl

use strict;
use warnings;

my @a = qw/n a$ b@ c/;
my @b = @a;
my @c = @a;

print "Test A -- Doesn't work (c !-> 0)\n";
for (@a) {
  s/([\$\@\%])$//;
  my $arg = $1 || 0;
  print $_ . " -> " . $arg . "\n";
}

print "\nTest B -- Works\n";
for (@b) {
  my $arg;
  if (s/([\$\@\%])$//) {;
    $arg = $1;
  }
  $arg ||= 0;
  print …
Run Code Online (Sandbox Code Playgroud)

regex perl

4
推荐指数
1
解决办法
1661
查看次数

在Perl中,如何检查数组是否与其内容中至少列出一次的值相匹配?

我之前从未真正使用过Perl(尽可能避免使用它),所以我对这个主题的知识很少.

我知道我正在查看的脚本在@ :: s_Ship_sShipProducts中有一个ProductID值数组.

我试图看看数组中的任何ProductID是以B还是S开头并执行一个函数,否则执行另一个函数.但我最终得到的是每个ProductID做声明.这就是我(诚然被打捞)所拥有的.

my $i;
for $i (0 .. $#::s_Ship_sShipProducts) # for each product
    if  ($::s_Ship_sShipProducts[$i] =~ /^(B|S)/) # Determine if B or S product
        {
        if (defined $phashBandDefinition->{'FreeOver'} && CalculatePrice() > 250)
        {$nCost = 0;}
        }
    else    {
        if (defined $phashBandDefinition->{'FreeOver'} && CalculatePrice() > $phashBandDefinition->{'FreeOver'})
        {$nCost = 0;}
        }
Run Code Online (Sandbox Code Playgroud)

我怎么能改变这个以便检查数组以查看是否有任何ProductID为真并返回true,如果没有匹配则返回false?然后根据true或false执行相应的函数?我做了一些阅读,但仍然在黑暗中.谢谢你的时间.

arrays perl match

1
推荐指数
1
解决办法
138
查看次数

标签 统计

perl ×4

arrays ×1

hash ×1

list ×1

match ×1

regex ×1