Sunday, July 25, 2010

learning perl exercise 3

ex-3-1
#! /usr/bin/perl

@mylist = <STDIN>;
@mylist = reverse @mylist;
print "@mylist" ;

chomp(@mylist = <STDIN> ;)
としたら配列要素がつながって読みづらくなった。

最後の出力の後にも改行を入れようと思い、最初
print @mylist . "\n";
とやったらできなかった。

print "@mylist" . "\n";
だとできた。

UNIXでの標準入力の終わり「Ctrl + D」は1つの入力が終わった状態で打つ。

ex-3-2
#! /usr/bin/perl

@names = qw / fred betty barney dino wilma pebbles bamm-bamm /;
$n = @names - 1;
$message = "hit a number between 1 to $n";
print "$message" . ".\n";
chomp ($num = <STDIN>);

while (($num < 1) or ($num > $n)) {
 print "$message" . ", PLEASE.\n";
 chomp ($num = <STDIN>);
}

 $num = $num - 1;
 print "$names[$num]" . "\n";


0の入力の除外と要素数以上の数の入力があった場合のメッセージを入れようとしたらよくわからなくなった。でもこれだと文字を入力されたらダメだよなあ。とりあえず今は「1から$n以外の数字だったら」という条件の作り方がまだわからない。

ex-3-3
#! /usr/bin/perl

print "enter names you like. press Ctrl+D when you finish.\n";
@namelist = <STDIN>;

print "chomp? enter Y/N.\n";
chomp ($chomp = stdin);

if ($chomp eq Y) {
 foreach $namelist (@namelist) {
 chomp $namelist;
 }
 @namelist = sort @namelist; 
 print "@namelist" . "\n" ;
}

elsif ($chomp eq N) {
 @namelist = sort @namelist; 
 print "@namelist" . "\n" ;
}

これもY/N以外の入力に対して無力。Nの場合はY以外のどのキーでもOKのようにすればごまかせるのかな。あとchompしたほうの表示は全要素の前にスペースが入る。

【答えの一例を見ながら】

3-1
print reverse <STDIN>;
てやってもいいんですね。

3-2は、複数の数字を受け入れる想定だったのか。

3-2
print sort <STDIN>;
もOK。

【もう一度ex-3-2】

#! /usr/bin/perl

@names = qw / fred betty barney dino wilma pebbles bamm-bamm /;
$n = @names - 1;
print "hit some numbers between 1 to $n and ctrl+d when you finish.\n";
chomp (@nums = STDIN);

foreach $nums (@nums) {
print "$names[$nums - 1] \n";
}

教科書通りにやると最後のforeachの後の$numsを省略して{}の中では$_を使うことができる。
foreach (@nums) {
print "$names[$_ - 1] \n";
}

@numにきちんと指定範囲内の数が入力されたかどうかの判定を入れておかないとどうも落ち着かない。配列の中の文字判定はどうやってやるのだろうか。たぶん入力の段階で割り込んでやる感じなのだろうか。

foreachは「配列の要素をひとつずつスカラー変数に代入して、要素の最後まで{}内の作業をやりつづける」という理解。変数名を指定しない場合はデフォルトの$_に代入される。

スカラーは$calar。
配列は@rray。


【ex-3-3 again】
いろいろ変だったのでもう一度。

print "enter names you like. press Ctrl+D when you finish.\n";
@namelist = <STDIN>;

print "chomp? enter Y/N.\n";
chomp ($chomp = <STDIN>);

if ($chomp eq Y) {
 chomp @namelist;
 print sort @namelist ;
 print "\n";
}

elsif ($chomp eq N) {
 print sort @namelist ;
}

配列のchompは chomp @配列名 でできる。

演算子はクオーテーションの中では実行されずに文字として表示されるので
print "sort @list" . "\n";
はできない。

結果をchompするかの切り分けを最初に持ってくると print sort STDIN が使えてelseのところが少しすっきりしてちょっといい気分。
#! /usr/bin/perl

print "press Y if you like to chomp the result. if not, press any other key.\n";
chomp ($chomp = <STDIN>);

print "enter names you like. press Ctrl+D when you finish.\n";

if ($chomp eq Y) {
 chomp(@names = <STDIN>);
 print sort @names;
 print "\n";
}

else {
 print sort <STDIN>;
}

No comments:

Post a Comment