我基本上有一个变量COUNTRY
以及变量SUBJID
和TREAT
,我希望像 ABC002-123 / NZ / ABC 那样连接它。
假设COUNTRY变量的值为“New Zealand”。我想提取每个单词的第一个字母,但是我想只在COUNTRY变量中只有一个单词时提取值的前两个字母。我想知道如何简单地下面的代码。如果可能,请使用 perl编程。
If COUNTW(COUNTRY) GT 1 THEN
CAT_VAR=
UPCASE(SUBJID||"/"||CAT(SUBSTR(SCAN(COUNTRY,1,' '),1,1),
SUBSTR(SCAN(COUNTRY,2,' '),1,1))||"/"||TREAT);
答案 0 :(得分:4)
my @COUNTRY = ("New Zealand", "Germany");
# 'NZ', 'GE'
my @two_letters = map {
my @r = /\s/ ? /\b(\w)/g : /(..)/;
uc(join "", @r);
} @COUNTRY;
答案 1 :(得分:4)
SAS Perl正则表达式解决方案是使用CALL PRXNEXT
以及PRXPOXN
或CALL PRXPOSN
(或类似函数,如果您愿意):
data have;
infile datalines truncover;
input @1 country $20.;
datalines;
New Zealand
Australia
Papua New Guinea
;;;;
run;
data want;
set have;
length country_letter $5.;
prx_1 = prxparse('~(?:\b([a-z])[a-z]*\b)+~io');
length=0;
start=1;
stop = length(country);
position=0;
call prxnext(prx_1,start,stop,country,position,length);
do while (position gt 0);
matchletter = prxposn(prx_1,1,country);
country_letter = cats(country_letter,matchletter);
call prxnext(prx_1,start,stop,country,position,length);
put i= position= start= stop=;
end;
run;
答案 2 :(得分:3)
我意识到OP可能对另一个答案不感兴趣,但对于浏览此线程并且不想使用Perl表达式的其他用户,我建议使用以下简单解决方案(对于原始的COUNTRY
变量):
FIRST_LETTERS = compress(propcase(COUNTRY),'','l');
propcase函数将每个单词的首字母大写,并将其他单词放在小写字母中。带'l'
修饰符的压缩函数会删除所有小写字母
COUNTRY
可能包含任意数量的字词。
答案 3 :(得分:2)
这个怎么样:
#!/usr/bin/perl
use warnings;
use strict;
my @country = ('New Zealand', 'Germany', 'Tanzania', 'Mozambique', 'Irish Repuublic');
my ($one_word_letters, $two_word_letters, @initials);
foreach (@country){
if ($_ =~ /\s+/){ # Captures CAPs if 'country' contains a space
my ($first_letter, $second_letter) = ($_ =~ /([A-Z])/g);
my ($two_word_letters) = ($first_letter.$second_letter);
push @initials, $two_word_letters; # Add to array for later
}
else { ($one_word_letters) = ($_ =~ /([A-Z][a-z])/); # If 'country' is only one word long, then capture first two letters (CAP+noncap)
push @initials, $one_word_letters; # Add this to the same array
}
}
foreach (@initials){ # Print contents of the capture array:
print "$_\n";
}
输出:
NZ
Ge
Ta
Mo
IR
如果真的没有三个字的国家,这应该做的工作。如果有的话,很容易修复......
答案 4 :(得分:2)
应该这样做。
#!/usr/bin/perl
$init = &getInitials($ARGV[0]);
if($init)
{
print $init . "\n";
exit 0;
}
else
{
print "invalid name\n";
exit 1;
}
1;
sub getInitials {
$name = shift;
$name =~ m/(^(\S)\S*?\s+(\S)\S*?$)|(^(\S\S)\S*?$)/ig;
if( defined($1) and $1 ne '' ) {
return uc($2.$3);
} elsif( defined($4) and $4 ne '' ) {
return uc($5);
} else {
return 0;
}
}