7

私は今授業を休んでいて、Perlの学習に時間を費やすことに決めました。私はBeginningPerl(http://www.perl.org/books/beginning-perl/)を使用しており、第3章の終わりで演習を終了しています。

演習の1つで、「重要な電話番号をハッシュに保存します。人の名前で番号を検索するプログラムを作成してください」と尋ねられました。

とにかく、私はこれを思いついた:

#!/usr/bin/perl
use warnings;
use strict;

my %name_number=
(
Me => "XXX XXX XXXX",
Home => "YYY YYY YYYY",
Emergency => "ZZZ ZZZ ZZZZ",
Lookup => "411"
);

print "Enter the name of who you want to call (Me, Home, Emergency, Lookup)", "\n";
my $input = <STDIN>;
print "$input can be reached at $name_number{$input}\n";

そして、それはうまくいきません。私はこのエラーメッセージを受け取り続けました:

hello.plxの17行目、1行目での連結(。)または文字列での初期化されていない値の使用

コードをもう少し試してみましたが、各「ソリューション」は、その前にある「ソリューション」よりも複雑に見えました。最後に、答えを確認することにしました。

私のコードと答えの唯一の違いは、chomp ($input);afterの存在でした<STDIN>;

さて、作者はchomp前の例で使用しましたが、彼は実際に何をしていたかをカバーしていませんでしたchomp。だから、私はwww.perlmeme.orgでこの答えを見つけました:

このchomp()関数は、(通常は)文字列の末尾から改行文字を削除します。$/通常私たちが言う理由は、 (入力レコード区切り文字)の現在の値に一致するすべての文字を実際に削除し、$/デフォルトで改行するためです。


とにかく、私の質問は次のとおりです。

  1. どの改行が削除されますか?Perlは"\n"からの入力に自動的にを追加し<STDIN>ますか?「現在の値に一致する文字が実際に削除される」を読んだとき、「コードのどこかに$/置いたのを覚えていない」と思わずにはいられないので、少しわかりません。$/

  2. できるだけ早くベストプラクティスを開発したいのですが、常にchomp後に含めるのが最善<STDIN>ですか、それとも不要なシナリオがありますか?

4

5 に答える 5

9

<STDIN>入力文字列の最後まで読み取ります。これには、Returnキーを押して入力すると、改行が含まれます。これはおそらく実行します。

chomp文字列の最後にある改行を削除します。 $/おそらく心配する必要のない変数(デフォルトでは改行)です。これは、perlに「入力レコード区切り文字」が何であるかを伝えるだけです。これは、<FILEHANDLE>読み取り距離を定義することを意味すると思います。あなたは今のところそれをほとんど忘れることができます、それは高度なトピックのようです。chomp末尾の改行を切り刻むふりをするだけです。正直なところ、今まで聞いたことがありません$/

他の質問については、変数に改行があるかどうかが常にわからないため、変数を常に切り刻み、後で必要に応じて改行を追加する方が一般的にクリーンです。常に変数をチョッピングすることで、常に同じ動作が得られます。それが不要なシナリオもありますが、確信が持てない場合は、それを傷つけることはできませんchomp

お役に立てれば!

于 2011-09-03T00:59:46.960 に答える
3

OK、1)の時点で、perlは入力時に何も追加しません\nEnter数字を入力し終えたときにヒットしたのはあなたです。を指定しない場合$/、デフォルトの\nが設定されます(少なくともUNIXでは)。

2)の時点で、ユーザーから入力があった場合、または行末文字を削除したい場合(たとえば、ファイルからの読み取り)には、chompが必要になります。

最後に、発生するエラーは、perlが最後の二重引用符内の変数を理解していないことが原因である可能性があります。これは、変数に文字printが含まれているためです。_次のように文字列を書いてみてください。

print "$input can be reached at ${name_number{$input}}\n";

{}(最後の変数の周りに注意してください)。

于 2011-09-03T01:03:34.170 に答える
2

<STDIN>のショートカット表記ですreadline( *STDIN );。readline()が行うことは、$ /(別名$ INPUT_RECORD_SEPARATOR)の内容に遭遇するまでファイルハンドルを読み取り、$/の内容を含む読み取ったすべてのものを返すことです。$ /の最後に出現したコンテンツが存在する場合は、それchomp()を削除します。

内容はしばしば改行文字と呼ばれますが、複数の文字で構成されている場合があります。LinuxではLF文字が含まれていますが、WindowsではCR-LFが含まれています。

見る:

perldoc -f readline
perldoc -f chomp
perldoc perlvar and search for /\$INPUT_RECORD_SEPARATOR/
于 2011-09-03T13:21:02.203 に答える
0

ここでのベストプラクティスは次のように書くことだと思います。

chomp(my $input = <STDIN>);

chompこれは、関数(意味はそこで説明されています)がどのように機能するかを示す簡単な例です($/存在する場合)。

chomp (my $input = "Me\n"); # OK
chomp ($input = "Me"); # OK (nothing done)
chomp ($input = "Me\n\n"); # $input now is "Me\n";
chomp ($input); # finally "Me"

print "$input can be reached at $name_number{$input}\n"; 

ところで、それは面白いことです。私もPerlを学んでいて、5分前にハッシュに到達しました。

于 2011-09-03T01:01:37.367 に答える
0

当たり前のことかもしれませんが、なぜchompここでが必要なのかを説明する価値はあります。

作成されたハッシュには、、、、およびの4つ"Me"のルックアップキーが含まれています。"Home""Emergency""Lookup"

$inputからを指定すると、使用されているオペレーティングシステムに応じて、、またはその他の行末バリアントが<STDIN>含まれます。"Me\n""Me\r\n"

"Me\n"キーがハッシュに存在しないため、初期化されていない値のエラーが発生します。そしてこれがchomp必要な理由です:

my $input = <STDIN>; # "Me\n" --> Key DNE, $name_number{$input} not defined
chomp $input;        # "Me"   --> Key exists, $name_number{$input} defined
于 2011-09-03T10:00:38.017 に答える