0

私はまだ perl 初心者です。man_1、man_2、woman1、woman2 などの文字列を取得しています (コンマはなく、関数への入力として 1 つの文字列のみが存在します)。

適切な数値が抽出され、オフセットが追加されていることを確認するために、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

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 に答える
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 - 文字を 1 つずつ削除しますが、すべての \D 文字の大きなブロックではありません。したがって、「man_」になる変数はありません
  2. 正規表現からデータを取得するには、s/(\D)// のようなグループ化括弧を使用する必要があります
  3. すべての文字を取得するには、次のように * または + 演算子を使用する必要があります: s/(\D+)//
  4. 不正なデータのエッジ ケースをより適切に処理できるため、変更せずに一致させる方が良いでしょう。
于 2013-02-06T19:44:09.910 に答える