0

我仍然是一个 perl 菜鸟。我得到一个字符串,它可以是 man_1、man_2、woman1、woman2 等。(没有逗号,只有一个字符串作为函数的输入)。

我需要在 if 语句中检查 man_ 或 woman 作为子字符串,以确保提取了适当的数字并添加了一些偏移量。

我可以提取的数字如下

$num =~ s/\D//g
if (<need the substring extracted> == "man_")
    $offset = 100;
else if (<need the substring extracted> == "woman")
    $offset = 10;

return $num + $offset;

现在我如何提取子字符串。我查看了 substr ,它需要偏移量等等。想不通。感谢帮助

4

3 回答 3

0

解决方案:

if ( $num =~ m{^man_(\d+)$} ) {
    return 100 + $1;
} elsif ( $num =~ m{^woman(\d+)$} ) {
    return 10 + $1;
} else {
    die "Bad input: $num\n";
}

在您的示例中存在几个问题:

  1. s/\D//g - 将删除字符,但一个接一个,而不是所有 \D 字符的大块。所以没有变量会是“man_”
  2. 要从正则表达式中获取数据,您应该使用分组括号,例如 s/(\D)//
  3. 要获取所有字符,您应该使用 * 或 + 运算符,例如:s/(\D+)//
  4. 在不修改的情况下进行匹配仍然更好,因为它可以更好地处理格式错误数据的边缘情况。
于 2013-02-06T19:44:09.910 回答
0

depesz 有一个很好的解决方案。这是另一个:

my %offsets = (
   'man_'  => 100,
   'woman' =>  10,
);

my ($prefix, $num) = $str =~ /^(\D+)(\d+)\z/
   or die;
my $offset = $offsets{$prefix}
   or die;
return $num + $offset;
于 2013-02-06T20:26:32.820 回答
0

另外一个选项:

return $2 + ( $1 eq 'man_' ? 100 : 10 )
  if $num =~ /^(man_|woman)(\d+)\z/;

die;
于 2013-02-06T20:48:12.840 回答