4

Parisi、Kennethという形式の名前をkparisiという形式に変換する必要があります。

Perlでこれを行う方法を知っている人はいますか?

異常なサンプルデータは次のとおりです。

Zelleb、CharlesF。,,IV
Eilt、John ,, IV
Wods、CharlesR。,,III
Welkt、CraigP。,,Jr。

これらの特定の名前は、最終的にczelleb、jeilt、cwoods、cwelktなどになります。


これまでのところ、私の名前ビルダー

O'Neil、Paulを台無しにしているもう1つの条件があり

ます。奇妙な/破損した名前が混在している場合、Vinko Vrsalovicの答えが最も効果的ですが、上記の例は「pneil」として表示されます...私がpとnの間にそのoを得ることができない場合、idはjudasの下で酷評されます

4

7 に答える 7

7
vinko@parrot:~$ cat genlogname.pl
use strict;
use warnings;

my @list;
push @list, "Zelleb, Charles F.,,IV";
push @list, "Eilt, John,, IV";
push @list, "Woods, Charles R.,,III";
push @list, "Welkt, Craig P.,,Jr.";

for my $name (@list) {
        print gen_logname($name)."\n";
}

sub gen_logname {
        my $n = shift;
        #Filter out unneeded characters
        $n =~ s/['-]//g;
        #This regex will grab the lastname a comma, optionally a space (the 
        #optional space is my addition) and the first char of the name, 
        #which seems to satisfy your condition
        $n =~ m/(\w+), ?(.)/;
        return lc($2.$1);
}
vinko@parrot:~$ perl genlogname.pl
ツェレブ
ジェイルト
ウッド
ウェルクト
于 2008-12-18T19:27:05.960 に答える
6

異常なデータをフィルタリングすることから始めて、通常の名前だけを持つようにします。次に、このようなものがうまくいくはずです

$t = "Parisi, Kenneth";
$t =~ s/(.+),\s*(.).*/\l$2\l$1/;
于 2008-12-18T19:18:42.937 に答える
4

試す:

$name =~ s/(\w+),\s(\w)/$2$1/;
$name = lc $name;

\wここでは英数字に一致します。より具体的にしたい場合は、[a-z]代わりに使用して、フラグを渡すこともできますi(大文字と小文字は区別されません)。

$name =~ s/([a-z]+)\s([a-z])/$2$1/i;
于 2008-12-18T19:14:30.107 に答える
2

すべての名前を "names" というファイル (1 行に 1 つ) に格納し、重複した名前の検出を後で何らかの方法で行うと仮定すると、1 行のソリューションを次に示します。

cat names | perl -e 'while(<>) {/^\s*(\S*)?,\s*(\S)/; print lc "$2$1\n";}' | sed s/\'//g
于 2008-12-20T00:59:17.253 に答える
1

入力データはカンマ区切りのようです。私にとって、これを行う最も明確な方法は、コンポーネントに分割し、そこからログイン名を生成することです。

while (<>) {
    chomp;
    my ($last, $first) = split /,/, lc $_;
    $last =~ s/[^a-z]//g;  # strip out nonletters
    $first =~ s/[^a-z]//g; # strip out nonletters
    my $logname = substr($first, 0, 1) . $last;
    print $logname, "\n";
}
于 2008-12-20T02:53:51.810 に答える
0
    $rowfetch =~ s/['-]//g; #All chars inside the [ ] will be filtered out.
    $rowfetch =~ m/(\w+), ?(.)/;
    $rowfetch = lc($2.$1);

これが私がVinkoVrsalovicのソリューションを使用することになった方法です...SQLクエリ結果を通過するwhileループの内側...ありがとうございましたvinko

于 2008-12-23T18:07:34.023 に答える
0

これはあなたが必要とすることをするはずです

use strict;
use warnings;
use 5.010;

while ( <DATA> ) {
    say abbreviate($_);
}


sub abbreviate {
    for ( @_ ) {
        s/[-']+//g;
        tr/A-Z/a-z/;
        tr/a-z/ /c;
        return "$2$1" if /([a-z]+)\s+([a-z])/;
    }
}


__DATA__
Zelleb, Charles F.,,IV
Eilt, John,, IV
Woods, Charles R.,,III
Welkt, Craig P.,,Jr.
O'Neil, Paul

出力

czelleb
jeilt
cwoods
cwelkt
poneil
于 2015-07-02T15:34:33.410 に答える