sironekotoroの日記

Perl で楽をしたい

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

いきなりsplitと正規表現の使い方でおぉ、となる

my @number = split (/\D+/, '31 and 41, 592 and 653');
print join (',' , @number); #31,41,592,653
  • なるほど、正規表現\D+、つまり数字以外を区切り文字にする訳か。なるほど。

    つまり次の一文で'300yen'や'168cm'、それに'58kg'のような文字列を探せる訳です。
    my @found = grep (/\D+[a-z]+/ , @word);

  • 夢広がるなぁ。

Perlの * は何でもマッチではない

  • 直前の1文字が対象になる。
    • コマンドラインの感覚で「なんにでもマッチする」と思ってた。

むむむ

[^5\D] - 5以外の数字にマッチ - [^5]これで5以外ってのは分かる - [\D]これだと、数字以外ってことになる - 組み合わせるとなぜ「5以外の数字」ってなるんだ? - 5以外の数字、という条件をあとの\Dが上書きして数字以外ってならない?ならないのか。

練習問題7-4

use strict;
use warnings;

my @rhymes = (
    "Humpty Dumpty sat on a wall,",
    "Humpty Dumpty had a great fall;",
    "All the king's horses, and all the king's men",
    "Cannot put Humpty Dumpty together again.",
);

my $song = join( ',', @rhymes );

$song =~ s/(\,{1,2}|\;|\.)/ /g;

my @words = split( /\s+/, $song );

my $count;

for my $i (@words) {
    if ( $i =~ /[A-Z]/ ) {
        $i =~ tr/[A-Z]/[a-z]/;
    }
    $count->{$i}++;
}

for my $i ( sort { $a cmp $b } keys $count ) {
    print $i . " " . $count->{$i}, "\n";
}