Perlで画面から入力された値を使うには?

言いたいこと

画面(ターミナル)からの入力は「改行」が入っているので、 chomp してから使いましょう。

画面(ターミナル)から文字を入力する

画面(ターミナル)から文字を入力するには、 <STDIN> を使います。

1
2
my $x = <STDIN>;
print $x;

実行すると、画面が止まってしまいますが、何が文字を入力して改行を押すと、入力した文字列がそのまま表示されると思います。

改行はわかりづらい

Perl入学式では、画面(ターミナル)からの入力値を計算するプログラムをサンプルで作ったりしていますが、画面からの入力には「改行」が含まれています。

1
2
3
4
my $x = <STDIN>;
my $y = <STDIN>;
print "$x - $y = ";
print $x - $y;

計算式を表示しようとして、これを実行すると、

1
2
3
4
5
5[改行](この行は入力)
1[改行](この行は入力)
5
 - 1
 = 4

このように、改行が入って変な感じになってしまいます。

改行を削除するにはchompを使う

この改行を取り除くには、 chomp を使います。

1
2
3
4
5
6
my $x = <STDIN>;
chomp($x);
my $y = <STDIN>;
chomp($y);
print "$x - $y = ";
print $x - $y;

実行結果は以下のとおり。

1
2
3
5[改行](この行は入力)
1[改行](この行は入力)
5 - 1 = 4

ちゃんと改行が取り除かれています。

chompを使うときに注意すること

慣れてくると、変数に代入すると同時に改行を削除しようとして、こんな感じにやりたくなるんじゃないかと思います。

1
2
3
4
my $x = chomp(<STDIN>);
my $y = chomp(<STDIN>);
print "$x - $y = ";
print $x - $y;

しかし、実行しようとするとエラーに。

1
2
Can't modify <HANDLE> in chomp at stdin.pl line 5, near "<STDIN>)"
Execution of stdin.pl aborted due to compilation errors.

これは、 chomp が渡された値(引数)自体を変更してしまうためです。

chomp は引数の改行を削除して値を返す関数ではなく、引数そのものを変更します。

代入と同時に改行を削除したい場合は、以下のように書くと良いです。

1
2
3
4
chomp(my $x = <STDIN>);
chomp(my $y = <STDIN>);
print "$x - $y = ";
print $x - $y;

画面からの入力はchompで処理しましょう

画面から <STDIN> で入力する時は、入力値に改行も含まれるので、 chomp で改行を取り除くようにしましょう。

Comments

comments powered by Disqus