ラベル Perl の投稿を表示しています。 すべての投稿を表示
ラベル Perl の投稿を表示しています。 すべての投稿を表示

2013/07/13

perl 勉強メモ

参考

  1. http://d.hatena.ne.jp/perlcodesample/20091226/1264257759
  2. ミニマル perl

スクリプトを書く時

  • プラグマ
    このサイトが詳しい
    http://perldoc.jp/func/use
  • デバッグ用にも便利
    次の2行を先頭に書くことが強く推奨されているっぽい。
    これらはプラグマと呼ばれるものたち。
    use strict;
    use warnings;
    
  • 1文字でも減らしたい
    print のデフォルト引数は、 $_ なので、print $_; したいだけなら書く必要ない。

用語

レコード

  • 1つのまとまりとして読み書きされる文字の集合
  • 入出力の際、ファイルはレコードの集まりと見ることができる。
    この時、デフォルトでは、1行がレコード。

入力レコードセパレータ

  • 入力レコードの終端区切りを表す文字、または文字シーケンス(文字の並び)。
  • Linuxとかでは、デフォルトではラインフィード。
  • Perl ではOS固有の入力レコードセパレータを \n として、参照できる。

ニューライン

  • \n のこと。
  • OS固有の入力レコードセパレータ。

スイッチ引数

  • -s オプションを利用することで、良い感じの引数を取ることができる。
  • 引数の与え方で2つの方法がある。
    -foo='test' #=> $foo == 'test'
    -foo #=> $foo == true : -debugで、デバッグ用、みたい使う。
    
  • スイッチ引数を任意にしているスクリプトでは、冒頭にour関数を使うのが良い。
    our(foo);
    our(foo, $bar, ...);
    

真偽値

偽になるのは、次の3パターンある。
  1. 数値 : 0 と同等な値
  2. 文字列 :
    • null文字列
    • 0 を保持する文字列 ( '0' みたいな)
  3. 変数 : 値を持たない変数
    • まだ設定されていない変数とか。定義されているかは、 defined を使うとわかる。

特別な文字列

 $/,$\ 

  • 入力,出力レコードセパレータを指定する。

 $.

  • 今読んでいる入力レコードが何番目かを表す。 
  • 通常は行数。
  • コマンドラインオプションや $/ で入力レコードセパレータを指定したときは行数じゃなくなる。

$_

  • 最後に読み込んだ入力レコード。

@ARGV

<>

\n 

  • OS 固有のレコードセパレータ

変数

$var : 変数

  • 宣言と代入
    my $var = 'aaa';
  • '' と ""
    シングルクォートとダブルクォートの違いは、変数が展開されるかどうか。
  • join (.), split, length, substr, index

@array : 配列

  • 宣言と代入
    my @array;
    @array = (1,2,3)
    
  • $array[0] などとして、各値を得る
  • pop, push, shift, unshift も使える
  • 配列の大きさを得るのは、
    $array_size = @array
    

%hash : ハッシュ

  • 宣言と代入
    my %hash; %hash = (a => 1, b => 2);
    
  • $hash{a} などとして、各値を得る
  • keys, values, exists, delete

制御構文

if { ~ }

if { ~ } else { ~ }

if { ~ } elsif { ~ }

while ( 条件 ) { ~ }

for ( my i = 0; i < 5 ; $i++ ) { ~ }

foreach my $field (@fields) { ~ }

  • 配列の各要素に対して何かを行う
  • foreach は for のエイリアスらしい。

比較演算子

文字列比較

  • $s eq $t
  • $s ne $t
  • $s lt $t
  • $s gt $t
  • $s le $t
  • $s ge $t

サブルーチン

関数のようなもの。
他の言語との違いとして、引数を関数宣言に書かない。
そのかわり、 @_ を使って引数にアクセスする。
sub subtract {
  my ($num1, $num2) = @_;
  my $result = $num1 - $num2;

  return $result;
}

perl のコマンドラインオプション

参考ページ

[[http://debugitos.main.jp/index.php?Perl/コマンドライン]]

基本的なオプション

-e

  • ワンライナーを書くために必須。
  • 複数並べられるので、それなりに色々書ける
  • 直後にperlプログラムを書ける。

    perl -e 'print 11/2'

-l[8進数]

  • 行末に指定された8進数に変える。-l のみの場合、改行になる。

    perl -e 'print 22' #=> 22 perl -l -e 'print 22' #=> 22perl -l101 -e 'print 22' #=> 22A

-0[digits]

  • -l の入力セパレータバージョン
  • -00 とすれば、空行を区切り
  • -777 とすればファイルごとの区切りになる。

使い勝手の良いオプション

-n

  • while (<>) { ...} の中にスクリプトを入れたと思って実行

-p

  • -n みたいなもの。ただし、行($_)を出力する。
  • sed に似たやつ。

-a

  • -n, -p と一緒に使用
  • $_ を自動的に改行で分割し、配列 @F に入れる

    perl -ane 'print $F[0], ""' /etc/passwd

-F/pattern/

  • -a の分割のデリミタを指定する
  • パターンは複数文字でも良い。そのときは、' ' または / / で囲む

    perl -F':' -ane 'print $F[0],":",$F[2] ,""' /etc/passwd

-i[拡張子]

  • 拡張子がないとき、<>のファイルを直接編集する
  • 拡張子があるとき、<>の元ファイルは、拡張子をつけたファイルにバックアップされる。

    perl -i".back" -pe `s/foo/bar/g' sample.txt

デバッグに使えるオプション

-c

  • スクリプトのシンタックスチェックのみ行う

-d[:debugger]

  • debugger の下で走らせる

-w

  • より多くの Warning を出す

-W (-X)

  • すべての Warning を出す(出さない)