sironekotoroの日記

Perl で楽をしたい

Perl言語プログラミングレッスン[入門編] 第6章

おおお

  • いきなりびっくりした。こういうのありなのか。
  • "Hiroshi Yuki , 70,83,41",
    my ( $name, @score ) = split( /,/, $line );
  • つまり、Hiroshi Yuki , 70,83,41はカンマでsplitされHiroshi Yuki 70 83 41になる
  • そして、最初のHiroshi Yukiが$nameに入り、それ以降の数字が@scoreに入る
  • なるほど
use strict;
use warnings;

my @data = (
    "Hiroshi Yuki , 70,83,41",
    "Hanako Sato , 100,93,69",
    "tomura,46,33,100"
);

foreach my $line (@data) {
    my ( $name, @score ) = split( /,/, $line );
    my $sum = 0;
    foreach my $item (@score) {
        $sum += $item;
    }
    print "$name = $sum \n";
}

問題6-4 16進数の表を作る

  • 表の整形で思いっきり手間取る。
use strict;
use warnings;

my @array = ( 0 .. 255 );
foreach (@array) {
    if ( $_ == 0 ) {
        printf( "%02X ", "$_" );
    }
    elsif ( $_ % 16 == 0 ) {
        printf( "\n%02X ", "$_" );
    }
    else {
        printf( "%02X ", "$_" );
    }
}
  • 一方、結城先生の答え
foreach my $value (0..255){
    printf ("%02X " , $value);
    print "\n" if ($value %16 == 15);
}
  • 美しい!
  • うちの場合、16進数で、16で割りきれたら・・・って考えたけど、それだと最初の0も割り切れたことになったので、例外的にif分の最初に書いて処理する必要があった。
  • 結城先生は16で割ってあまりが15だったら、という式。シンプルでわかりやすい。
  • 出力される結果は同じだけど、短くシンプルで分かりやすくありたいなぁ。

クリスマスツリーを作ろう

  • 全く手が出なかった。悲しくなるー
use strict;
use warnings;

my @twig1 = ( '*', '!', '%', '*', '/', '*' );
my @twig2 = (
    '*', '!', '%', '*', '/', '*', '+', '-',
    '!', '.', '*', '*', '%', '/', '*', '+'
);

my @twig   = @twig1;
my @branch = ();
foreach my $leaf (@twig) {
    print ' ' x ( @twig - @branch ), @branch, $leaf, reverse(@branch), "\n";
    push( @branch, $leaf );
}

my @twig   = @twig2;
my @branch = ();
foreach my $leaf (@twig) {
    print ' ' x ( @twig - @branch ), @branch, $leaf, reverse(@branch), "\n";
    push( @branch, $leaf );
}