Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何解析人';在Perl中将全名转换为用户名?_String_Perl_Parsing_Substring - Fatal编程技术网

String 如何解析人';在Perl中将全名转换为用户名?

String 如何解析人';在Perl中将全名转换为用户名?,string,perl,parsing,substring,String,Perl,Parsing,Substring,我需要将Parisi,Kenneth格式的名称转换为kparisi格式 有人知道如何在Perl中实现这一点吗? 以下是一些异常的示例数据: 泽勒布,查尔斯F.,IV 艾尔特,约翰,IV 沃兹,查尔斯R.,III 韦尔克特,克雷格P.,Jr. 这些具体的名字应该是czelleb、jeilt、cwoods、cwelkt等等 我还有一个条件正在毁掉我的名字生成器 到目前为止,当怪异/腐败的名字混杂在一起时,文科·瓦萨洛维奇的回答效果最好,但上面的这个例子被称为“pneil”。。。如果我不能在p和n之

我需要将Parisi,Kenneth格式的名称转换为kparisi格式

有人知道如何在Perl中实现这一点吗?

以下是一些异常的示例数据:

泽勒布,查尔斯F.,IV
艾尔特,约翰,IV
沃兹,查尔斯R.,III
韦尔克特,克雷格P.,Jr.

这些具体的名字应该是czelleb、jeilt、cwoods、cwelkt等等


我还有一个条件正在毁掉我的名字生成器

到目前为止,当怪异/腐败的名字混杂在一起时,文科·瓦萨洛维奇的回答效果最好,但上面的这个例子被称为“pneil”。。。如果我不能在p和n之间得到o,我会在犹大下面被诅咒的

试试:

$name =~ s/(\w+),\s(\w)/$2$1/;
$name = lc $name;
\w
此处匹配字母数字字符。如果您想更具体一些,也可以使用
[a-z]
,并传递
i
标志(不区分大小写):


我将首先过滤异常数据,这样您就只有常规名称。那么像这样的事情应该会奏效

$t = "Parisi, Kenneth";
$t =~ s/(.+),\s*(.).*/\l$2\l$1/;
vinko@parrot:~$perl genlogname.pl 捷勒布 杰尔特 cwoods cwelkt
这里是一个单行解决方案,假设您将所有名称存储在一个名为“names”(每行一个)的文件中,并且稍后将以某种方式执行重复名称检测

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

看起来您的输入数据是用逗号分隔的。对我来说,最清晰的方法是将其拆分为多个组件,然后根据这些组件生成登录名:

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";
}
while(){
咀嚼;
我的($last,$first)=拆分/,/,信用证$\;
$last=~s/[^a-z]//g;#去掉非字母
$first=~s/[^a-z]//g;#去掉非字母
my$logname=substr($first,0,1)。$last;
打印$logname,“\n”;
}

这就是为什么我最终使用了维科·维萨洛维奇的解决方案。。。它在一个while循环中,通过一个sql查询结果。。。再次感谢vinko

这应该可以满足您的需要

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

康拉德,你把它倒过来了-应该是整个姓氏(排在第一位),然后是首字母(排在第二位)哎哟。谢谢你纠正它,保罗。实际上,我在发布之前测试了代码,但不知何故,我对错误的结果感到满意。;-)很抱歉这么说,但你不是Jon Skeet.:-)是的,我也测试过了。。。它看起来很近,但我没有得到货物——“你不是乔恩·斯基特”——真想不到。但也许他就是我,他创建了第二个账户,匿名发布二流解决方案,以消除他的厌倦感为什么我没有得到所有答案的通知?我花了很长时间,我想知道为什么还没有人回答。。。嘿!不知道。。。他们来得很快。。我只是在10分钟前发布了这个问题。。。。无论如何,谢谢你的意见,我认为拉斯穆森的答案到目前为止效果很好。。。我看到像“奥尼尔,帕特”和“帕里西·凯德,肯尼斯”这样的姓氏以pneil和kcaid的名字出现。。。。第二个是好的,但是奥尼尔,帕特最好在修改前作为波内尔出场。如果您需要过滤掉的字符数超过“and”-您可以将它们添加到“过滤掉不需要的字符”注释下面的[]之间,唯一让我感到困扰的是,我在Perl Monks上发布了一个与此非常类似的问题,对于同一个问题,SO会比Perl Monks提供更多帮助(这是几个月前的事了)我遇到了一个路障“Marphy Smulka,Mara”的名字是“mmarphy Smulka”,你认为我怎样才能去掉“-”或者只使用姓氏的前半部分,不包括任何非字母字符 vinko@parrot:~$ perl genlogname.pl czelleb jeilt cwoods cwelkt
cat names | perl -e 'while(<>) {/^\s*(\S*)?,\s*(\S)/; print lc "$2$1\n";}' | sed s/\'//g
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);
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