0

私はPerlでかなり新しいです。ユーザーにフルネームを入力してから、最初だけ、最後だけ、そして「最後、最初」の形式で印刷する必要があります。

私は基本的に持っているだけです

chomp ($name = <\STDIN>);

これまでのところ。そして、うまくいかなかったものの束。STDIN の '\' は無視してください。これは私の最初の投稿であり、書式設定を理解できませんでした。

解決済み:

chomp ($name = <STDIN>);
$first = substr $name, 0, rindex($name, ' ');
$last = substr $name, (rindex($name, ' ')+1);
print "\nFirst Name: ".$first;
print "\nLast Name: ".$last;
print "\nLast, first: ".$last.", ".$first;

いくつかのより良いGoogle検索で理解しました。

4

2 に答える 2

3

名前にスペースを含まない 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 つ以上の非空白文字を消費して記憶し、行末に$固定します。

于 2013-09-14T01:37:39.867 に答える