0

ここでばかげたことをしていることはわかっていますが、疲れていて、どうやらそれが見えていないようです。次のスクリプトがあります。

#!/usr/bin/perl
use strict;
use warnings;

my @names = (
    "John Q. Public",
    "James K Polk"
);

foreach (@names)
{
    print "Before: $_\n";
    s/\b[A-Z]\.?\b//;
    print "After:  $_\n";
}

このスクリプトを実行すると、次の出力が得られます。

Before: John Q. Public
After:  John . Public      <== Why is the period still here?
Before: James K Polk
After:  James  Polk

John Q. Publicの例では、ピリオドが残っていることに注意してください。オプションの match 引数 ( ?) が貪欲ではありませんか? perlre docsによると:

? 1回または0回一致

ピリオドはミドルイニシャルと一緒に消えるべきではありませんか? ここで何が欠けていますか?

4

2 に答える 2

4

問題は

". " =~ /\.\b/ or print "There is no word boundary between a dot and a space.\n"
于 2012-11-30T19:12:16.970 に答える
1

名前を空白で分割し、最初と最後のフィールドだけを選択することを選択すると思います。

このような:

use strict;
use warnings;

my @names = ("John Q. Public", "James K Polk");

foreach (@names) {
  print "Before: $_\n";
  $_ = join ' ', (split)[0, -1];
  print "After:  $_\n";
}

出力

Before: John Q. Public
After:  John Public
Before: James K Polk
After:  James Polk
于 2012-12-04T21:33:02.057 に答える