Domanda

Ho bisogno di convertire un nome nel formato Parisi, Kenneth nel formato kparisi.

Qualcuno sa come fare questo in Perl?

Ecco alcuni dati di esempio che è anormale:

Zelleb, Charles F.,,IV
Eilt, Giovanni, IV
Wod, Charles R., III
Welkt, Craig P., Jr

Questi nomi specifici dovrebbe finire come czelleb, jeilt, cwoods, cwelkt, etc.


Ho ancora una condizione che sta rovinando il mio nome builder

O'Neil, Paolo

finora, Vinko Vrsalovic la risposta è che funziona in modo ottimale quando strano, danneggiato nomi sono nel mix, ma questo esempio di cui sopra, sarebbe venuto fuori come "pneil"...id essere dannati al di sotto di giuda, se non riesco a ottenere o che tra la p e n

È stato utile?

Soluzione

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
czelleb
jeilt
cwoods
cwelkt

Altri suggerimenti

Vorrei iniziare filtrando i dati anomali in modo da avere solo i nomi regolari. Poi qualcosa come questo dovrebbe fare il trucco

$t = "Parisi, Kenneth";
$t =~ s/(.+),\s*(.).*/\l$2\l$1/;

Prova:

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

\w qui corrisponde a un carattere alfanumerico. Se si vuole essere più precisi, si potrebbe anche usare [a-z] invece, e passare il flag i (case insensitive):

$name =~ s/([a-z]+)\s([a-z])/$2$1/i;

Ecco una soluzione di una riga, a patto di memorizzare tutti i nomi in un file chiamato "nomi" (uno per riga) e si farà duplicato rilevamento del nome in qualche modo più tardi.

cat names | perl -e 'while(<>) {/^\s*(\S*)?,\s*(\S)/; print lc "$2$1\n";}' | sed s/\'//g

Sembra che i dati di ingresso è separato da virgole. Per me, il modo più chiaro per farlo sarebbe essere diviso in componenti, e quindi generare i nomi di login da che:

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";
}
    $rowfetch =~ s/['-]//g; #All chars inside the [ ] will be filtered out.
    $rowfetch =~ m/(\w+), ?(.)/;
    $rowfetch = lc($2.$1);

questo è come ho finito per usare la soluzione di Vinko Vrsalovic ... suo interno un ciclo while che passa attraverso un risultato di una query SQL ... grazie ancora Vinko

Questo dovrebbe fare quello che ti serve

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

uscita

czelleb
jeilt
cwoods
cwelkt
poneil
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top