ミニマルPerl

perlのもっとも重要な起動オプション
オプショ ン
意味
説明
-e  'code'
codeの実行

-w
警告

-n
読み込み(出力なし)
$_にレコードを格納する暗黙の読み込みループを要求
-p
読み込んで出力
$_にレコードを格納してその内容に処理を施してから自動的に出力する 暗黙の読み込みループを要求。
-l
行末処理
print の出力の末尾に出力レコードセパレータを自動的に挿入.-n,-pと組み合わせると自動chompも行う。
--0digits入力レコードセパレータの設定
-00段落モード(空行が入力レコードの末尾)。-0777ファイル モード(ここのファイルが一つのレコード)

データ変数とレコード番号変数
変数
名前
ニック ネーム
使用上の 注意
$_
ドル・アンダースコア
データ変数
nまたはpのオプションを指定すると最後に読み込んだ入力レコード が$_に保持される。
数多くの組込関数(printなど)のデフォルトのデータソースでもある。AWKでは$0。
$.
ドル・ドット
レコード番号変数
nまたはpのオプションを指定すると、あるいは入力演算子を使用する と、現在の入力レコ
ードの番号が$.に保持される。AWKではNR。

シェルとperlにおけるユーザ定義のスカラー変数

シェル
perl
使用上の 注意
代入
name=value
name="value"
$name=value;
$name="value";

$num2=$num1=42;
どちらの言語でも、変数に代入されるvalueをクォートするのはよい ことだが必ずしも必要というわけではない。


perlでは変数から別の変数へと代入を続けることができる。
アクセス
echo $star
print $star;
perlでは$varnameの結果は常にその変数の実際の内容。シェ ルでは変数の中の特殊文字がアクセスの際に何か別なもので置き換えられることがある。例えば変数に*が代入されていればこのシェルコマンドはファイル名を エコーする。
追加の処理なしでアクセス
echo "$star"
print $star;
またはprint "star";
*などの特殊文字が変数に含まれる場合、シェルで追加の処理(ファイル 名の生成など)を抑止するにはダブルクォートが必要. perlではその必要なし。(使っても害はない)
アクセスを使った代入。
name2=$name
name2="$name"
$name2=$name;
$name2="$name";
シェルの場合と同様、別の変数から取り出した値を変数に代入可。


シェルスクリプトとperlスクリプトの比較
シェル
perl
コメント
#! /bin/sh options
#! /usr/bin/perl options

$*, "$@"
引数はn,p,s オプションまたは<>で自動的に処理さ れる。
シェルスクリプトでは、コマンドライン引数は$*または"$@"を使っ てまとめてアクセス。

スィッチ変数の使い方
コマンド ラインでの構文
効果
コメント
-name


-name='stuff'
-nameを真に設定


-nameをstuffに設定
-nameの形は、そのスィッチが存在するか(真)しないか(偽)の検 出だけが必要な「オン・オフ」タイプのスィッチに使用する。
例えば、script -debugはscrip中の$debugを真に設定する。

対応する変数に特定の値を割り当てる必要あるスィッチに使用。例えばscript -email='a@b.ca'は$emailにこのアドレスを使用する
スクリプ トでの構文
効果
コメント
our($colors);

our($shape,$size);
-color switchをoptionに
-shape及び
-size
指定されない場合に perlが警告を出すのを防止

our中に複数のスィッチ変数をリストするにはコンマで区切って括弧で囲む


STDOUTとSTDERRにメッセージを出すためのシェルとperlの方法
シェル
perl
コメント
echo "msg"
echo "msg" >&2



echo "msg" >&2
exit 255


print "msg";
warn "msg\n";

print STDERR "a","b";

beginブロックの外で:
die "msg\n";
BEGINブロックの中で条件付き
実行のための論理演算子を使って:
$success or warn "msg\n"
and exit 255;
STDOUTにmsgを送る
STDERRにmsgを送る。\nはwarnのメッセージの完了をperlに指示するため行番号とファイル名が末尾に自動的に付加されることがなくなる。
print STDERRは$,変数を使って自動的に引数を区切るという点でwarnより便利

STDERRにmsgを送ってプログラムを終了する。エラーコードは親プロセスに送られる。dieはデフォルトで255というコードを送る。
BEGINブロックの中のexit関数では引数で値を指定できる。msgの後の\nはメッセージの末尾に行番号とファイル名を自動的に付加すべきでないことをPerlに指示する。

入出力処理のための特殊変数
変数
名前と ニックネーム
使用上の 注意
$/



$\


$ARGV


ARGV


@ARGV
ドル・スラッシュ、
入力レコードセパレータ


ドル・バックスラッシュ、
出力レコードセパレータ

ドル・ARGV(アーグヴィー)
ファイル名変数

アーグヴィー
ファイルハンドル

アット・アーグヴィー
引数配列
デフォルトでは\nとして表されるOS固有の入力レコードセパレータ用 の文字が設定される。これは-0degitオプションを使って任意の文字に変更するか$/に文字列を代入することで任意の文字シーケンスに変更できる。AWKではRS。例:BEGIN { $/='**'; }


$/と同じ文字列を設定する異が推奨される。そうすることで-lオプションが入力に際して除去したのと同じ文字列がprintの出力に自動的に付加。AWKではORS。例:begin { $\=$/='**'; }

n,pオプションあるいは空の入力演算子を使用すると、この変数は現在の入力ソースをファイル名またはSTDINを表す-似よって識別する。AWKではFILENAME

現在の入力ソースを何らかの方法で制御するため、特にクローズのために使われる。(これは変数でなくAWKでは対応するものなし)


n,pオプションも入力演算子も使わない場合この配列変数から自前でプログラムの引数にアクセスする必要がある。AWKではARGV

出力のフォーマット処理のための特殊変数
変数
名前
使用上の 注意
$"

$,
ドル・ダブルクォート

ドル・コンマ
ダブルクォートで囲んだ配列の各要素の間に挿入される文字を保持。デ フォルトではスペース。AWKでは対応するものなし。

print文の引数の2種類の特殊なフォーマット処理に利用される。この変数の内容は、printの引数を区切るコンマの代わりに出力で使用される。またクォートされていない配列やハッシュの各要素の区切りとして使用される。デフォルトでは空文字。AWKではOFS。

perlコマンドとperlスクリプトのための標準オプションクラスタ
一次オプ ションクラスタ
アプリ ケーションタイプ

-wl

-wnl


-wnla


-wnlaF'sep'
出力を生成

入力または入出力を処理


フィールド処理(空白文字セパレータ)


フィールド処理(カスタムセパレータ)
perl -wl -e 'print "TEXT";'

perl -wnl -e 'print;' /etc/passwd
who | perl -wnl -e 'print;'

$F[0]は入力レコードの先頭フィールドにアクセス
perl -wnla -e 'print $F[0]; ' F

$F[2]は入力レコードのコロン区切りの第3フィールドにアクセス:
perl -wnlaF':' -e 'print $F[2];' F
レコード 定義クラスタ
効果

-00


-077

段落モードを有効にする。


ファイルモードを有効にする。
番号付きで段落を出力:
perl -00 -wnl -e 'print "$.: $_";' F

番号付きでファイルを出力:
perl -0777 -wnl -e 'print "$.: $_";' F
スィッチ クラスタ
効果

-s
スィッチ処理を有効にする。
-nスィッチを使い、オプションの番号付きで行を出力:
$ print_lines -n F F2

$ cat print_lines
#! /usr/bin/perl -s -wnl
$n and printf "$.: ";
print;
上書き編 集クラスタ
効果

-i.extension
上書き編集を有効にする
F.bakとしてバックアップを作成してから元のファイルに変更を加え る。:
perl -i.bak wnl  -e 's/A/B/g; print;' F
モジュー ルクラスタ
効果

-M'mod_name'
指定されたモジュールをロード
$_の中のタブをスペースにしてから出力 (expandは Text::Tabsが提供)
perl -M'Text::Tabs' -wnl -e 'print expand $_;' F
スクリプトでは代わりにuse mod_nameを使用。
プログラ ムクラスタ
プログラ ムのタイプ
用途
-e 'code'
perlコマンド
スクリプトでなくcode引数でプログラム


grep


制御文字を表現するための文字列エスケープ
文字列エ スケープ
名前
生成され るもの
\n
\r
\t
\f
\e
\NNN
\xNN
\cX
ニューライン
リターン
タブ
フォームフィード
エスケープ
8進値
16進値
制御文字
OSのレコード終了シーケンス
キャリッジリターン文字
タブ文字
フォームフィード文字
エスケープ文字
例えば\040はスペース
例えば\x20はスペース
例えば\cCはCtrl-C

grepperとperlの基本機能

マッチ演算子
形式
意味
説明
/RE/
m:RE:
string =~ /RE/
string =~ m:RE:
$_に対してマッチ
$_に対してマッチ
stringに対してマッチ
stringに対してマッチ
デフォルトデリミタ/とデフォルトターゲット$_を使用
カスタムデリミタ:とデフォルトターゲット$_を使用
デフォルトデリミタ/とターゲットstringを使用
カスタムデリミタ:とターゲットstringを使用

正規表現の基本構文
メタキャ ラクタ
名前
意味
^
$
\b
.
[chars]

[^chars]
[char1-char2]
$&
\

\Q...\E
先頭アンカー
末尾アンカー
単語境界
ドット
文字クラス

否定文字クラス
文字クラスの範囲
マッチ変数
バックスラッシュ

クォートメタキャラクタ
Xとのマッチを先頭に限定。例:^X
Xとのマッチを末尾に限定。例:X$
例えば \bX, X\b, \bX\b はそれぞれ単語の先頭で、単語の末尾で、単語全体としてのみXにマッチ
ニューラインを除く任意の文字にマッチ
文字群の任意の1文字にマッチ。\付き英文字または数字でないメタキャラクタ(例えば!や.)は自動的にリテラルとして扱われる。例:[!.]は感嘆符またはピリオドにマッチ。
リストされていない任意の1文字にマッチ。仝。例:[^!.]は感嘆符でもピリオドでもない任意の文字にマッチ。
例えば[A-Z]は任意の大文字にマッチ
最後にマッチした内容を保持。例えば'Demo' =~ /^[A-Z] を実行したら
$&はDを保持。
\Xが特別な意味を持つ場合その意味が使われる(\bは単語境界メタキャラ等)。\Xが特別な意味を持たない場合
Xは正規表現リテラルとして扱われ、\は破棄される。例えば\.はピリオドを意味する。
囲まれている文字群(...)がリテラルとして扱われるようにする.(fgrep style matching)

文字クラスのショートカット
ショート カットメタキャラクタ
名前
同等の文 字クラス
\w
\W
\s
\S
\d
\D
単語構成文字
非単語構成文字
空白文字
非空白文字
数字
数字以外の文字
[a-zA-Z0-9_]
[^a-zA-Z0-9_]
[\040\t\r\n\cJ\cL]
[^\040\t\r\n\cJ\cL]
[0-9]
[^0-9]

マッチ修飾子
修飾子
構文例
意味
説明
i

x

s

m

g

i,g,s,m,x
/RE/i
m:RE:i
/RE/x
m:RE:x
/RE/s
m:RE:s
/RE/m
m:RE:m
/RE/g
m:RE:g
大文字小文字の違いを無視

拡張モード

シングルラインモード

マルチラインモード

グローバル

複数修飾子


REフィールドに空白文字とコメントを許す。

メタキャラクタ.をニューラインにもマッチさせる。

^と$を、ターゲット文字列の絶対的な先頭及び末尾ではなく、ターゲット文字列中の行の先頭と末尾にマッチさせる。

すべてのマッチをスカラーコンテキストかリストコンテキストかによって連続的もしくは集合的にかえす。

すべての組み合わせが順序関係なく可能

マッチ演算子の例

意味
説明
/perl/
m:perl:
perlとのマッチを$_の中で検索
仝、ただし別のデリミタ
$_の中の"perl"にマッチ
$_の中の"perl"にマッチ
$data =~ /perl/i


$data =~ / perl /xi




$data =~ m%perl # PeRl too! %xi
perlとのマッチを$dataの中
で検索、大文字小文字の違い
は無視
仝、ただしxが拡張構文
を要求



仝、ただし#コメントを追加し、
デリミタとして%を採用
$dataの中の"perl","PERL","Perl"などに
マッチ。

$dataの中の"perl","PERL","Perl"などにマッチ。修飾子xにより任意の空白文字と#コメントを正規表現フィールドに含めることができるため、これらの文字は前にバックスラッシュがつかない限り無視される無視される。



$dataの中の"perl","PERL","Perl"などにマッチ。正規表現の中の空白文字と#コメントは前にバックスラッシュがつかない限り無視される。


選択、グループ化、マッチのキャプチャ、マッチの参照のためのgrepperとperlにおけるメタキャラクタ
構文
名前
説明
X|Y|Z
選択
このメタキャラクタは水平バーで区切られたパターンのいずれかにマッチさせる.この例では、X,Y,Zのいずれかのパターンとのマッチを探す。
\(x\)


(X)


(X)



\1,\2,...
キャプチャ括弧(grep)


グループ括弧(egrep,Perl)

キャプチャ及び
グループ括弧(GNUegrep, Perl)

後方参照(grep,GNU egrep, Perl)
キャプチャ括弧はその中のマッチ内容を後で利用できるよう保存する。grepではカッコの前のバックスラッシュが必要.


グループ括弧は、つけられたメタキャラクタの効果がグループに適用されるようにする。a(X|Y)bのように選択で使われたり, (X|Y)+の用に選択の繰り返しに使われたり,(XY)+のように複数文字シーケンスの繰り返しに使われる.

これらのユーティリティでは、キャプチャとグループ化の両方の機能を括弧が提供する。



これらは第一、第二、などなどのキャプチャ括弧中のパターンにマッチして保存された最新の内容にアクセスする
めに正規表現中で使われる。
perl 拡張


$1,$2,...
番号付き変数
これらは後方参照に似ているが、置換演算子の置換後文字列フィールド中や、マッチ演算子または置換演算子の後に続くコード中など、正規表現の外側で使われる。
 
量指定メタキャラクタ
構文
意味
ユーティ リティ
説明
X*

X+

X?
オプションかつ
繰り返し可
必須かつ
繰り返し可
オプション
grep, egrep, perl

egrep, perl

egrep, perl
xの0回以上の繰り返しにマッチ.

Xの1回以上の繰り返しにマッチ

xの0回または1回以上の繰り返しにマッチ
X\{min,max\}
X\{min,\}
X\{count\}


X{min,max}
X{min,}
X{count}

X{,max}
繰り返し回数




繰り返し回数



繰り返し回数
grep




GNU egrep, perl



perl
第一の範囲指定の形の場合、Xのminからmaxまでの繰り返し.
数字1つとコンマの場合,maxを省略すると繰り返しの上限なく、minを省略するとmaxまで繰り返す.
それ以外ではXのcount回の繰り返しに限定される。
grepでは括弧の前にバックスラッシュが必要。

REP?
ケチなマッチング
perl
上記の量指定子(REPで表す)の直後に?がつく場合、perlは最長(これがデフォルト)のマッチではなく、最短のマッチを探す。典型的な例は、.*?

0回異常または1回以上の最短と最長の文字シークェンスを表すパターン
メタキャ ラクタシークェンス
意味
説明
.*
.+
.*?
.+?
最長の0回以上
最長の1回以上
最短の0回以上
最短の1回以上
無もしかは可能な限り長い文字シーケンスにマッチ
可能な限り長い1文字以上の文字シーケンスにマッチ
無もしくは可能な限り短い文字シーケンスにマッチ
可能な限り短い1文字以上シーケンスにマッチ


行をまたがるマッチングの例
マッチ演 算子
マッチン グタイプ
説明
/\bMinimal\b.+\bPerl\b/s


/\bMinimal\b\s+\bPerl\b/



/\bMinimal\b[\s:,-]+\bPerl\b/
単語の順序付


単語の連接



単語の連接、
間に句読点も可
修飾子 s により、 . はニューラインにもマッチする。結果的にこのパターンは指定された順序で現れる単語にマッチする。
単語と単語の間に何がきても構わない(例えば”Minimal training on Perl”にマッチ)

連接した単語にマッチ、\sが(他の空白文字と同様)ニューラインにもマッチするため、修飾子sがなくても行境界を越えてマッチする.例えば1行め末尾の"Minimal"と続く2行目の先頭の"Perl"にマッチ.


上のパターンの拡張(空白文字,コロン,コンマ,ハイフンの任意の組み合わせが間にきて構わない)。例えば1行目の末尾の"minimal:"とそれに続く2行目の先頭の"Perl"にマッチ。

一般的なgrep処理のためのUnixコマンドとperlコマンド
Unix コマンド
対応する perlコマンド
処理タイ プ

grep 'RE' F
grep -v 'RE' F
grep -i 'RE' F
grep -l 'RE' F

fgrep 'STRING' F
perl -wnl -e '/RE/ and print;' F
perl -wnl -e '/RE/ or   print;' F
perl -wnl -e '/RE/i and print;' F
perl -wnl -e '/RE/ and
print $ARGV and close ARGV;' F
perl -wnl -e '/\QSTRING\E/ and
print;' F
マッチする行の表示
マッチしない行の表示
大文字小文字の違いを無視
ファイル名だけを表示

文字リテラルとのマッチング
3.3.1
3.7
3.9.1
3.8

3.5


sed


    sed 's/RE/replacement/g' file1 file2 ...
    perl -wnl -e 's/RE/replacement/g;' file1 file2 ...

置換演算子の構文
形式
説明
s/RE/new/g

s:RE:new:g

$somevar =~ s/RE/new/g

$somevar =~ s:RE:new:g
デフォルトのデリミタ/を使い、変数$_に見つかった正規表現REとの マッチをすべてnewと言う値で置き換える。

仝、ただしカスタムデリミタ:

デフォルトのデリミタ/を使い、変数$somevarに見つかった正規表現REとのマッチをすべてnewと言う値で置き換える。

仝、ただしカスタムデリミタ:

置換修飾子
修飾子
意味
説明
i
x
s
m
g
大文字小文字の違いを無視
拡張モード
シングルラインモード
マルチラインモード
グローバル
マッチングに際して大文字小文字の違いを無視
REフィールドに空白文字とコメントを許す
メタキャラクタをニューラインにもマッチさせる
^と$を、レコードの先頭と末尾ではなく、レコード中の行の先頭と末尾にマッチさせる。
レコードごとに複数の置換を許し、スカラーコンテキストかリストコンテキストか似よって異なる値を返す
e
評価
newをperlのコードとして評価し、REにマッチしたものをその結 果で置き換える。

置換演算子の使用例

意味
s/perl/Perl/;
s/perl/Perl/g;
$oyster =~ s/perl/Perl/g;
$oyster =~ s/\bperl\b/'$&'/ig;
$_の中でもっとも左側に現れるperlをPerlで置き換える。一般 にはグローバル置換の方が好まれる。
$_の中の個々のperlをグローバルにPerlで置き換える。
$oyster の中の個々のperlをグローバルにPerlで置き換える。
$oysterの中でperlと言う語を(大文字小文字に関係なく)グローバルに検索し、その同じ語を‘’(シングルクォート)で囲んだもので置き換える。(perlを 'perl' 、PERLを 'PERL'に)

大文字小文字変換のための文字列修飾子
修飾子
意味
効果
\U
\u
\L
\l
\E
すべてを大文字に
次を大文字に
すべてを小文字に
次を小文字に
変換を終了
右側の文字列を\Eまたは文字列の末尾まで大文字に変換
右側の文字を大文字に
右側の文字列を\Eまたは文字列の末尾まで小文字に変換
右側の文字小文字に
\Uまたは\Lで開始した変換を終わらせる(オプション)。

一般的な編集処理のためのsedコマンドとperlコマンド
sedコ マンド
対応する perlコマンド
意味

sed 's/RE/new/g' F


sed '3,9s/RE/new/g' F



sed -n '9,$p' F


cp F F.bak
sed 's/RE/new/g' F > F+
mv F+ F
perl -wpl -e 's/RE/new/g;' F


perl -wpl -e '3 <= $.
and $. <=9
and  s/RE/new/g;' F

perl -wnl -e '$. >= 9
 and print;' F

perl -i.bak -wpl
 -e 's/RE/new/g;' F
Fのすべての行に置換を試み、
すべての行を出力

Fの3行目から9行目について
置換を試みすべての行を出力

Fの9行目から最終行までを
出力


Fのバックアップコピーを作成してからFの中で置換を実行
4.3


4.3.1
4.3.2

4.4.1
4.4.2


4.7.1

awk


awkとperlの特殊変数の比較
最新の awk
perl
コメント
$0

$1

NR

FNR


RS

ORS

FS

OFS

NF

ARGV

ARGC

FILENAME

該当なし

該当なし

該当なし

RSTART

RLENGTH
$_

$F[0]

$.

該当なし


$/

$\

該当なし

$,

@F

@ARGV

該当なし

$ARGV

$&

$`

$'

該当なし

該当なし
awkの$0は現在の入力レコードの内容を保持。perlでは$0はス クリプトの名前を保持しており、現在の入力レコードの内容は$_に保持する。

これらの変数は、現在の入力レコードの第一フィールドを保持する。

この「レコード番号変数」は最新の入力レコードの順序番号を保持する.2行のファイルに続けて3行ファイルを読み込んだらこの変数値は5になる.

「ファイル別レコード番号」変数。最後に読み込んだファイルにおける入力レコード順序番号。.2行のファイルに続けて3行ファイルを読み込んだらこの変数値は3になる.(perlで eof and close ARGV での$.と同じ)

「入力セパレータ」変数(入力レコードの終わり)。awkではラインフィードだがperlではOSのデフォルト

「出力レコードセパレータ」変数(printが各出力の末尾に付加する文字)awkではラインフィードだがperlではOSのデフォルト

awkではFSへの代入などによって、「入力フィールドセパレータ」を定義できる。

「出力フィールドセパレータ」変数は出力時printの引数間でコンマの代わりに使用すべき文字列を指定する。

「フィールド数」変数

「引数ベクタ」変数。スクリプトの引数を保持。

「引数カウンタ」変数。スクリプトの引数の数を保持(perlでは$ARGC=@ARGVで可)

プログラムに最後に入力したファイルの名前

最後のマッチを保持

最後のマッチの開始部の前

最後のマッチの末尾の後ろ

最後のマッチの開始位置.perlなら,pos() - length($&)

最後のマッチのバイト数。perlなら,length($&)

ユーザー定義変数にフィールドデータを読み込む。
構文
効果
コメント
($A,$B)=@F;

($A, undef, $C)=@F;

$numfields=@F;
第1フィールドを$Aに、第2フィールドを$Bに

第1フィールドを$Aに、第3フィールドを$Cに

フィールド数を$numfieldsに
使用する各フィールドに変数を指定

undefは第2フィールドに変数を指定しないことを表す。

スカラー変数

リストへの代入におけるundefの利用
代入文の 形(@Fはa、b、cを保持)
結果とし ての代入
($first, $second,$third)=@F;

(undef, $second, $third)=@F;

($first, undef, $third)=@F;

($first, $second, undef)=@F;

($first, $second          )=@F;
A->$first, B->$second ..etc

A->undef ..etc

B->undef ..etc

C->undef ..etc

C-> ..上と同じ結果

awkとperlにおけるprint文の違い
awk
perl
説明
print name "\t" age

出力:
Suzy--->29

print name, age

出力:
Suzy 29

print "NR is:",NR

出力:
NR is: 13

print name


出力:
Suzy
print $name,"\t",$age;
または
print "$name\t$age";
出力:
Suzy--->29

print "$name $age”;

出力:
Suzy 29

print "\$. is: $."

出力:
$. is: 13

print "$name"
または
print $name
出力:
Suzy
-perlではコンマなしで引数を併置 できないがシェルに似た変数展開機能があるため出力項目は一般的にダブルクォートで囲む。-->はタブ文字を表す。




AWKではprint文中のコンマによりOFS(デフォルトでスペース)が挿入。perlではスペースprintへのをクォート引数中に含めるか、$,に設定。



AWKではダブルクォート中の変数名は文字リテラルとして扱われる.
perlでは""中の$の前に\を入れて変数展開を抑制する必要がある。(シェルと同様)



""中に1つの変数名しかないときダブルクォートは効果がなくなり省略できる。

カスタムフィールドセパレータの定義
オプショ ンと引数
意味
F'///'
F'\t'
F'\t+'
F'\s+'
F'[,;!?]
F'[^\w];'
///が1つのフィールドセパレータ
tab
複数の連続するタブ
複数連続空白文字(これがデフォルト)
[]内文字の1回以上の連続
複数の非単語攻勢文字

awkとperlにおけるパターンとアクション
awkプ ログラムのタイプ
awkで の形とプログラムの例
perl での形とプログラムの例
説明
パターンとアクション







パターンのみ




アクションのみ
Pattern {
 Action
}
例:
 /RE/ {
    print NR
}

Patern
例:
/RE/
NR > 1

{Action}
例:
{print}
Pattern and Action;
例:
 /RE/ and print $.;





Pattern and print;
例:
/RE/ and print;
$. > 1 and print;

Action
例:
print;
/RE/にマッチするレコードの番号を出力。







上は/RE/にマッチするレコードを出力
下は先頭を除く全レコードを出力



全レコードを出力


簡単な処理を行うawkとperlのプログラム
awk
perl
説明
1 <= NR && NR <= 3
NF != 2

$2 =~ /^9/
1 <= $. and $. <=  3 and print;
@F != 2 and print;

$F[1] =~ /^9/ and print;
レコード1から3迄出力
フィールド数が2でないレコードを出力。

第2フィールドが9で始まるレコードを出力。
{ print $NF }

{ print NR ": " $0 }
print $F[-1];

print "$.:$_";
各行の最終フィールドを出力。perlでは負の添字を使用。

レコードの前にレコード番号を付加
END { print NR }
END { print $.; }
読み込んだレコード総数を報告。
BEGIN {
 print "AVERAGE:"
}
{ total=total +$0 }
END  {
 print total /NR
}
BEGIN {
 print "AVERAGE:";
}
$total=$total + $_;
END {
 print $total / $.;
}
単一の数からなる入力行についてそれらの数の平均を報告。

パターン範囲の使い方
演算子
構文

説明
..



...


expr1 ..  expr2
 and something


expr1 ... expr2
 and something
/start/ .. /stop/
 and print;


/start/ ... /stop/
 and print;
"start" を含む最初のレコードから"stop"を含む最初のレコード(これらは同じレコードでも構わない)までのすべてのレコードを出力し、それから” start"を含む次のレコードを探してと言う具合に処理を繰り返す。"stop"が見つかるとこの演算子は"E0"で終わる文字列を返す。 (scan4oops参照)

expr1について真になったレコードを過ぎるまでexpr2の最初の評価が行われないため、両方のパターンが
同一のレコードにマッチすることはない.あとは仝。

awkとperlの関係演算子
awk
perl
数値

文字列
意味
==
!=
>
>=
<
<=
==
!=
>
>=
<
<=
eq
ne
gt
ge
lt
le

該当なし
<=>
cmp
比較

awkとperlの算術演算子
演算子
名前
処理
++
--
プラス・プラス
マイナス・マイナス
インクリメント
デクリメント
*
/
%
スター
スラッシュ
モジュラス
乗算
除算
整数除算の剰余
+
-
プラス
マイナス
加算
減算
+=,-=,*=,/=
複合代入
$A += 1 は $A = ($A +1)


find


perl のファイル属性テストの構文
構文
意味
-X filename
! -X filename
-X
! -X
filenameが属性Xを持つことをテスト
filenameが属性Xを持たないことをテスト
$_に名前指定されたファイルが属性Xを持つことをテスト
$_に名前指定されたファイルが属性Xを持たないことをテスト

findコマンドとperlコマンドがサポートするファイルの属性
ファイル 属性
古典的 find
GNU find
perl
perl 演算子
通常/プレーン
ディレクトリ
シンボリックリンク
名前付きパイプ
キャラクタ
ブロック
ソケット

空でない
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
-f
-d
-l
-p
-c
-b
-S
-z
-s
実UID/GIDで読み取り可
実UID/GIDで書き込み可
実UID/GIDで実行可
実UIDが所有
実効UID/GIDで読み取り可
実効UID/GIDで書き込み可
実UID/GIDで実行可
実UID/GIDが所有
指定のUID/GIDが所有
-
-
-
-
-
-
-
-
E
-
-
-
-
-
-
-
-
E
E
E
E
E
E
E
E
E
E
-R
-W
-X
-O
-r
-w
-x
-0
stat
setuid
setgid
sticky
テキスト
バイナリ
P
P
P
-
-
P
P
P
-
-
E
E
E
E
E
-u
-g
-k
-T
-B
別のファイルより新しい
別のファイルより後にアクセスされた
リンクの数
inode番号
E
-
E
E
E
E
E
E
P
P
P
P
stat
stat
stat
stat

組み込み関数

リスト/スカラーのためのperi ツール
スカラー をリストに
リストを スカラーに
split関数
オプションクラスタの-wnlawnlp

scalar関数
ダブルクォート
join関数

スカラーのための有益なperl関数と、それにもっとも近いUnix親族
perl の組み込み関数
Unix 親族
目的
効果
split




localtime


stat,lstat



chomp


rand

cutコマンド、
AWKのsplit関数、
シェルのIFS変数


dateコマンド


ls -lLコマンド
ls -lコマンド


該当なし


シェルのRANDOM変数、
AWKのrand関数

スカラーをリスト
に変換



原罪の日付と時刻
にアクセス。

ファイル情報に
アクセス





乱数を生成
文字列とセパレータを引き数にとり、分割
後の部分文字列を返す。デフォルトのセパ
レータは任意の空白文字シーケンス。


Unixのdateコマンドからの出力に似た
文字列を返す。

statの引数で指定されているファイルまたは
lstatの引数として指定されているシンボリッ
クリンクについての情報を返す。

文字列から末尾の、入力セパレータ(デフォル
トでニューライン)を取り除く。


split関数
典型的な 呼び出し形式
@fields=split;
@fields=split /RE/;
@fields=split /RE/,string;

説明
@fields=split;
@fields=split /,/;
@fields=split /\s+/, $line;
@fields=split /[^\040\t]+/, line;
空白文字を区切りとして$_を「語」に分解し、そのリストを @fields に代入する(以下も仝)
コンマを区切りとして$_を分割
空白文字シーケンスを区切りとして$lineを分割。
「スペース、タブ、アンダースコア」以外の1文字以上の並びを区切りとして$lineを分割

localtime関数
典型的な 呼び出し形式
$time_string=localtime;
$time_string=localtime timestamp;
@time_component_numbers=localtime;
$time_component_number=(localtime)[index];

説明
$time=localtime;
print $time または
print scalar localtime;

print scalar localtime((stat filename)[9])


($sec, $min, $hour, $dayofmontn,
$month, $year, $dayoofweek,
$dayofyear, $isdst)=localtime;

$dayofyear=(localtime)[7] +1;
print "DAy of year: $dayofyear";
スカラーコンテキストでは、localtimeは現在の日時をdate コマンドと同様の形式で返す



localtimeは、statが返す数値のタイムスタンプをdateの出力と同様の文字列に変換するのにも使える。この例ではfilenameが最後に更新された日時を表示している。

日付関連の値は殆ど0から始まる。例えば$dayofweekは0ー6。
$yearは1900を起点とするため2000年は100と表す。


リストを返す他の関数と同じくlocaltime呼び出しを括弧で囲ん
で配列のように添字をつけることができる。

stat関数
典型的呼 び出し形式
($dev,$ino,$mod,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)=stat filename;
$extracted_element=(stat)[index]

説明
(undef,undef,undef,undef,$uid)=stat '/etc/passwd';
print "passwd is owned by UID: $uid\n";

print "File $f's inode is : ", (stat $f)[1];
ファイルのユーザIDはstatのリストの第5の要素として返されるためここに記したように名前付き変数を初期化した後は
その値を$uidとして使うことができる。

stat呼び出しを括弧で囲んで(配列の様に)添字を付けることができる。この例では第2の要素つまり当該ファイルの
inode番号にアクセスしている。

listfile スクリプト

  1. #! /usr/bin/perl -wl
  2.  
  3. # CPANモヂュールをロード。このモジュールの"format_mode"関数は
  4. # 8進のファイルモードを"-rw-r--r--"の形に変換する。
  5.  
  6. use Stat::lsMode;
  7.  
  8. @ARGV==1 or die "Usaga: $0 filename\n";
  9. $filename=shift;
  10.  
  11. (undef, undef, $mode,$nlink,$uid,$gid,
  12.  undef,$size,undef,$mtime)=stat $filename;
  13.  
  14. $time=localtime $mtime;         # 秒数を日時の文字列に変換
  15. $uid_name=getpwuid $uid;     # UID番号を文字列に変換
  16. $gid_name=getgrgid $gid;       # GID番号を文字列に変換
  17. $rwx=format mode $mode;     # 8進のファイルモードをrwxの形に変換
  18.  
  19. printf "%s %4d %3s %9s %12d %s\n",
  20. $rwx,$nlink,$uid_name,$gid_name,$size,$time,$filname;
例)
listfile rygel
-rwxr-xr-x  1  yumpy    users 415 Sun May 14 19:32:05 2006 rygel
12行目でリストにstatからの出力を代入$mtimeで終わる。6/13
14行目でlocaltime関数の$mtimeがdateに似た文字列に変換。
15,16行でstatが返したUID番号とGID番号をperlの組み込み関数によってユーザ名とグループ名に変換。
17行めでは,インポートしたformat_mode関数を使って$modeの8進値をlsスタイルの文字列に変換。
printfでデータ型とフィールド幅を各引数似ついて指定(%9sは文字列を9文字幅で表示)
 
chomp関数
典型的な呼び出し形式
chomp $var;
chomp @var;
chomp ($var1,$var2,@var,...);

説明
print 'Enter your size: ';
$size=<stdin>;
chomp $size;
#これでニューラインを恐れることなく$sizeが使える。

chomp ($flavor,$freshness,@lines);
このようにして読み込んだ入力行には末尾のニューラインがついており,混乱に陥る。それをchompで回避。



chompは括弧で囲んだ複数の変数を引数にとることができる。

rand関数
典型的な呼び出し形式
$random_tiny_number=rand;
$random_larger_number=rand N;
$random_element=$some_array[ rand  @some_array ];

説明
$num=rand;
$num=int (rand 10) + 1;
$element=$ARGV[ rand @ARGV ];
浮動小数点数Nを$numに代入
整数N(1<=N<=10)
指定された配列から無作為に選択した要素を$elementに代入。左記ではスクリプトの引数リストから無作為に選択した引数を代入。

リストのための有益なperl関数とそれにもっとも近いUnix親族
Perlの組込関数
Unix親族
目的
効果
sort
reverse
join

grep
map
sortコマンド
tac
printfコマンド、
awkのsprintf関数
egrepコマンド
sedコマンド
リストのソース
リストの反転
リストからスカラーへの変換

リストのフィルター処理
リストの変換
リストを受け取り,ソース済みリストを返す
主としてソートとの組で使用
リストのすべての要素を指定の文字列で結合した結果のスカラーを返す。

リスト中の選択された要素を返す.
リスト要素の変換バージョンを返す。

Unixのパイプラインとperlの関数におけるデータの流れ
Unixのパイプライン
Perlの関数
入力ー>コマンド(複数可)ー>出力
出力≪ー関数(複数可)≪ー入力


ls | grep 'X'          > X_files
ls | grep 'X' | sort | > X_files.s
@x_files=           grep{ /X/ } @fnames;
@X_files_s=sort grep{ /X/ } @fnames;

sort関数
典型的な呼び出し形式
sort LIST
reverse sort LIST
sort { CODE-BLOCK } LIST
reverse sort { CODE-BLOCK } LIST

説明