名前にスペースを含まない 1 つの姓と、任意の数の名が含まれていると仮定すると、次のようにすることができます。
use strict; use warnings; use feature 'say';
chomp(my $full_name = <>); # read a name
my @names = split ' ', $full_name; # split it at spaces
my $last_name = pop @names; # remove last name from the @names
my $first_name = join ' ', @names; # reassemble the remaining names
say "First name: $first_name"; # say is print that always appends a newline
say "Last name: $last_name";
say "Last, first: $last_name, $first_name";
常にuse strict; use warnings;
できるだけ多くのエラー レポートを取得します。それらを無視すると、バグがある可能性があります。また、すべての変数を宣言する必要があります。
rindex
やのような関数index
は、Perl ではめったに使用されません。多くの場合、正規表現はより表現力豊かな代替手段です。次のこともできます。
use strict; use warnings; use feature 'say';
chomp(my $full_name = <>);
my ($first_name, $last_name) = $full_name =~ /^(.*)\s+(\S+)$/;
say "First name: $first_name";
say "Last name: $last_name";
say "Last, first: $last_name, $first_name";
その正規表現の意味は次のとおり^
です。文字列の先頭に固定し、(.*)
できるだけ多くの文字を消費して記憶し、1 つ以上の空白文字に\s+
一致させ、 (\S+)
1 つ以上の非空白文字を消費して記憶し、行末に$
固定します。