「初めての Perl」勉強2日目

「リストと配列」です。難関です。意味が分からない。スカラーとかコンテキストとかリストとか違いがだんだん分からなくなっていく。chaos

第三章 リストと配列

練習問題1

文字列のリストを入力の終わりまで読み込んで、そのリストを逆順に表示するプログラムを書いてください。

#!/usr/local/bin/perl -w

@list = <STDIN>;
foreach $list (reverse @list) {
    print "$list\n";
}
練習問題2

数のリストを入力の終わりになるまで読み込んで、「fred betty barny dino wilma pebbles bamm-bamm」の人名リストの中から、数に対応する人名を表示するプログラムを書いてください。

id:vkgtaro

#!/usr/local/bin/perl -w

use strict;

my @list = <STDIN>;
my @name = qw / fred betty barney dino wilma pebbles bamm-bamm /;

foreach my $n (@list) {
    print "$name[$n]\n";
}

id:ysk_lucky-star(つまり自分)版

#!/usr/local/bin/perl -w

@list = <STDIN>;
@name = qw / fred betty barney dino wilma pebbles bamm-bamm /;

foreach $n (@list) {
    print "@name[$n]\n";
}

@name じゃなくて $name が正しい><

練習問題3

文字列のリストを入力の終わりまで読み込んで、読み込んだ文字列を ASCII コード順に表示するプログラムを書いてください。すべての文字列が一行に出力されますか、それとも別々の行に出力されますか? 出力をどちらのスタイルでも表示できるように出来ますか?

別々の行に出力するパターン

#!/usr/local/bin/perl -w

@list = <STDIN>;

foreach $n (sort @list) {
    print "$n\n";
}

一行に出力されるパターン

#!/usr/local/bin/perl -w

chomp (@list = <STDIN>);

foreach $n (sort @list) {
    print "$n ";
}
print "\n";

書いててこれはキモイと思った。もっと別のやり方がありそうだけど。

第四章 サブルーチン

練習問題1

数値のリストを受け取って、その合計を返すサブルーチン &total を書いてください。書き上げたサブルーチンを、以下に示すサンプルプログラムにいれて動かしてみましょう。

my @fred = qw { 1 3 5 7 9 };
my $fred_total = &total(@fred);
print "The total of \@fred is $fred_total.\n";
print "Enter some numbers on separate lines: ";
my $user_total = &total(<STDIN>);
print "The total of those numbers is $user_total.\n";

全く分かりませんでした><
回答を見て記述しました。

#!/usr/local/bin/perl -w

my @fred = qw { 1 3 5 7 9 };
my $fred_total = &total(@fred);
print "The total of \@fred is $fred_total.\n";
print "Enter some numbers on separate lines: ";
my $user_total = &total(<STDIN>);
print "The total of those numbers is $user_total.\n";

sub total {
    my $n = 0;
    foreach (@_) {
        $n += $_;
    }
    $n;
}

思えば「なるほど」と言える。発想の問題な気がしてきた。

練習問題2

前の問題で作成したサブルーチンを使用して、1から1000までの合計を求めるプログラムを書いてください。

また分かりませんでした><
と言うか前の問題に引きずられました><

#!/usr/local/bin/perl -w

use strict;

print &total(1..1000),"\n";

sub total {
    my $n = 0;
    foreach (@_) {
        $n += $_;
    }
    $n;
}

最初は

my @number = qw { 1..1000 };
my $total = &total(@number);
print "$total\n";

sub total {
    my $n = 0;
    foreach (@_) {
        $n += $_;
    }
    $n;
}

って書いたら怒られた。この違いがよく分からん。たろさんに聞いてみる。

聞いてみた。範囲演算子がリストになっていたのが問題だったみたい。

だから

my @number = (1..1000);

だと問題なくいける。ミス><