1

我基本上有一个变量COUNTRY和变量SUBJIDTREAT我想像这样连接它ABC002-123 /NZ/ABC

假设 COUNTRY 变量的值是否为“新西兰”。我想提取每个单词的第一个字母,但是当 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);
4

5 回答 5

4
my @COUNTRY = ("New Zealand", "Germany");

# 'NZ', 'GE'
my @two_letters = map {
  my @r = /\s/ ? /\b(\w)/g : /(..)/;
  uc(join "", @r);
} @COUNTRY;
于 2013-10-04T07:18:51.967 回答
4

SAS Perl 正则表达式解决方案是CALL PRXNEXTPRXPOXNor 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;
于 2013-10-04T13:58:54.263 回答
3

我意识到 OP 可能对另一个答案不感兴趣,但是对于浏览此线程并且不想使用 Perl 表达式的其他用户,我建议使用以下简单的解决方案(对于原始COUNTRY变量):

FIRST_LETTERS = compress(propcase(COUNTRY),'','l');

propcase 函数将每个单词的首字母大写,其他字母小写。带有修饰符的 compress 函数'l'删除所有小写字母。
COUNTRY可以有任意数量的单词。

于 2015-09-22T15:21:40.557 回答
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

如果确实没有三字国家,这应该可以完成工作。如果有的话很容易修复......

于 2013-10-07T10:18:33.160 回答
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;
    }
}
于 2013-10-11T14:15:54.823 回答