I ♥ WordPress

[時間割:Perl]『ミニマルPerl』その14
2009/01/12 23:53 posted by kunkichi

祝日ですががんばります。月曜日は「Perl」。AWKをPerlでやってみようの最後です。演算子とか組み込み関数とか。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 96883
  • AWKもプログラミング言語なので演算子が存在する。
  • 関係演算子(==とか!=とか)でAWKは文字列と数値を区別しないのに対し、Perlは数値と文字列で演算子の記述が異なる(数値だと==なのが、文字列だとeq とか。)
  • 算術演算子はどちらも同じ。
  • AWKもプログラミング言語なので標準で組み込まれている関数が存在する。
  • 似たような関数はあるけど、引数が違うとか、意味が違うとか、記述が違うとか、結構異なる点もあることに注意。
  • 関数を使ってワンライナーを作ってみる。$ perl -wnl -e 'print substr $_, 0, 40; sample.txtこれだけでもAWKとは流儀が異なる点がある。
    • substrの第2引数は開始位置のオフセットをあ表すけど、AWKの場合、最初の1文字目は1になるのに対して、Perlは0になる。
    • Perlだと、関数の引数を囲む()は省略できる。
  • exprをAWKで実装した例が紹介されている。#!/bin/sh
    awk "BEGIN{ print $*; exit }"
    • $*で引数を展開するのはシェルの役割と思ってよいのかな?
    • AWKでは、入力ループは暗黙なので、単一処理はその外側で文を書く。そのためにBEGINを使っている
    • ループに入らずに処理を終えるためにexit。

    などなど、いろいろ面倒(っぽいw)。Perlで書くとらくちん。#!/bin/sh
    perl -wl -e 'print $*;'

    • $*をシェルが展開するのは同じ。
    • -wlだとループしない。
    • 処理が終われば勝手に終了するのでexitする必要はない。
  • メインの話とは関係ないけど、Lingua::EN::Inflectで単語を自動的に複数形にできる。これ、細かいところで便利かも。Damian先生作!#!/usr/bin/perl -w
    # stop.pl
     
    use Lingua::EN::Inflect 'PL_N';
    use strict;
    use warnings;
     
    for( my $i=1; $i<10; $i++ ){
      printf("%d %s\n", $i, PL_N 'apple', $i );
    }
    $ ./stop.pl
    1 apple
    2 apples
    3 apples
    4 apples
    5 apples
    6 apples
    7 apples
    8 apples
    9 apples
  • 範囲演算子を使用する場合、指定された範囲の最後の要素では’E0′を返す。これを使うと、ブロック間にスペースを入れるように出力するとかできる。
    前回例であげたHTMLファイルから<div>〜<div>で囲まれた範囲を表示するワンライナーでやってみる。$ perl -wnl -e '$status=/^<div>$/ ... /^<\/div>$/ and print;if($status =~ /E0$/){ print "";}' sample.html
    <div>
    ここが最初のブロック
    </div>
     
    <div>
    ここが2番目のブロック
    </div>
     

これでAWKのところも終わりました。次はfindコマンドの機能をPerlでやっていきます。

コメント&トラックバック

トラックバックURL





このページの先頭へ