sironekotoroの日記

Perl で楽をしたい

Perl言語プログラミングレッスン[入門編] 第8章 練習問題

正規表現の奥深さよ

  • やればやるほど分からなくなり中
  • やり切ればわかるもんなんかなぁ

問題8-2

  • 結城先生の答えを参照してわかる範囲で作ったもの。
  • whileは何回も無限ループでアプリ・PCを強制終了させたトラウマがあるので、出来ればforを使いたかった
    • が、出来んかった。ので素直にwhileを使う。
  • 当初はsplitで単語を切り出して逐次翻訳してたんだけど、それだと改行やカンマ等がなくなることに気づく
  • 模範解答見て、\w+\W*の使い分けを確認。なるほど。
  • ハッシュのところは使い慣れているハッシュリファレンスで。
use strict;
use warnings;

my @array;
my @japan;
my $dict = {
    twinkle => "きらきら",
    littele => 'ちいさな',
    star    => 'ほし',
    how     => 'いかに',
    i       => 'わたし',
    wonder  => 'おどろく',
    what    => 'なに',
    you     => 'あなた',
    are     => 'である',
    up      => 'うえ',
    above   => 'うえに',
    the     => 'その',
    world   => 'せかい',
    so      => 'とても',
    high    => 'たかい',
    How     => 'いかに',
    like    => 'みたい',
    a       => 'ひとつの',
    diamond => 'ダイアモンド',
    in      => 'なかに',
    sky     => 'そら',

};

while (<DATA>) {
    while (/(\w+)(\W*)/g) {
        if ( exists $dict->{ lc $1 } ) {
            push @array, $dict->{ lc $1 };
            push @array, $2;
        }

    }
}

print @array;

__DATA__
Twinkle, twinkle, littele star,
How I wonder what you are.
Up above the world so high,
Like a diamond in the sky.
Twinkle, twinkle, littele star,
How I wonder what you are.

問題8-3

  • Human Genome Project, Chromosome Number 01 by Human Genome Project - Free Ebook を参照
    • 200MB超えてるので、適当に切り出し。
  • ところで、「GATACA」という映画はとても良いのでおすすめです。
  • やっぱりわからない
    • `((.)\2){5,}`
    • これ、どういう意味だろう?
    • 任意の一文字「.」の2番目にマッチしたもの「\2」 、ってことではないんだろうけど、じゃなんなんだ?
    • 頭いたくなって嫌になってきたので先に進む。
use strict;
use warnings;

use FindBin;

my $filename = 'genome2.txt';

my $five_number ='(.)\1{4,}';
my $two_four = '((.)\2){5,}';
my $reverse = '(.)(.)(.)(.)\4\3\2\1';

open( 'FH', "$FindBin::Bin/$filename" );

for my $line (<FH>) {
    if ( $line =~ /$five_number/m ) {
       print $&,"\n";
    }
    if ($line =~ /$two_four/m){
       print $&,"\n";
   }
    if ($line =~ /$reverse/m){
       print $&,"\n";
   }   
}

close(FH);

8-3

  • 解答の中のmy ($html) = @_;がわからなくて悩む
    • カッコで囲むってことはサブルーチン引数「@_」のコピーってこと?
    • my $html = shift @_;に変えてもエラーでなかった。
    • my $html = @_;にすると、要素数が帰ってくる。
  • 自分の解答と模範解答見て、その差に愕然とする