起動など

●第一行目
  #!/usr/bin/perl or #!/usr/local/bin/perl  (分からなかったら which で調べるといい)

  -w オプションを指定すると、ワーニングメッセージが表示される。

●コメント → # (行の途中からでもOK)

●変数・配列宣言 
 → いらない、すべてグローバル変数扱いとなる。
 → ローカル変数を指定したいときは、 my ($a, @b) とする。 ブロックの中で有効 sub, foreach など。
 → use strict を使うと、必ず変数宣言が必要となる。

●文の終わり → " ; " セミコロンをおく

●Hello World Program
  #!usr/bin/perl
  print "Hello, World!\n";

●起動引数
  @ARGV に格納される。

●終了(エラーコード発生)
  die "Cannot create logfile....";

スカラー・リストデータ


●スカラー変数
 $abcdef <= 大文字、小文字は区別するので注意 アンダースコア( _ )は使用OK

●文字列:
 シングルクオート( ' ' )か、ダブルクオート ( " " )で囲む。
 ダブルクオートの場合は逆スラッシュエスケープが使える。また変数展開もできる。

●変数と文字列の表記
 print ("answer".(2+3));

●リスト
 @abcdef: リスト全体を表す
 $abcdef[**]  配列要素
 ($abc, $def, $ghi) リストの表し方
 qw { abc, def, ghi }  文字列をクオートなしでリスト化する方法、 [ ], / /, ( ), # # で囲んでもOK

●リストをスカラーでうける。 => リストの要素数が返される。

●リストの最終インデックス。(スカラー値) => @list に対して、 $#list を使う。(インデックスは0から始まる)

●リストを使った変数変換
 ($abc, $def) = ($def, $abc) 

●範囲をリストに突っ込む方法
 @abc = 1..100 : 注 リスト要素は 0から始まる。


●逆スラッシュエスケープ:

\n 改行 (LF)
\r 復帰 (CR)
\t タブ
\b バックスペース
\cC コントロール文字(この場合 control+C)
\\ \

●ハッシュ
  値 -> $variable { "name" } <=中カッコで指定、キーはクオーテーションを忘れずに
  配列全体 -> %variable
  代入(2通り)  %variable = ("x1", "y1", "x2", "y2".....)
            %variable = ("x1" => "y1", "x2" => "y2", ...)

入力・出力1


●<STDIN>: 標準入力 ただし改行文字がついてしまうので chomp 演算子で捨てたほうがいい。
 $line = <STDIN>;
 $line = chomp($text = <STDIN>);

 ☆配列の場合は、Ctrl+D (Winは Ctrl+Z) を押すまで値を吸い込み続ける。

●起動引数をファイルとして読み込む場合
 <> (ダイアモンド演算子)を使う
 たとえば、
  while (<>) { chomp; print "$_"; }  <= ファイルを1行ずつ読み取る(改行コードまで読み取るのでchomp

● print <= 演算子でもある。  $result = print (2+3)*4; は 5を表示し、戻り値は 4になる。

● printf <= 書式つき出力
  printf "abcd %g efgh %s", $value, $string;

 

%c 文字
%d 10進数整数(切り捨て)
%e, %E 小数(指数形式)
%g, %G 小数(指数形式の使用有無を自動切換え)
%s 文字列
%u 符号なし10進数
   
-%3d 左寄せ(-), 3桁の10進数
(%3d) 文字数が足りない場合はスペースで埋める
(%3.5f) 小数点つき10進数展開
(%03d) 文字数が足りない場合はゼロで埋める

 

入力・出力2(ファイルハンドル関係)

● open
 使用例) 入力) open IN, "filename"; open IN, "< filename";
        出力:上書き) open OUT, "> filename"
        出力:追加)  open APPEND, ">> filename";
   注) IN, OUT, APPEND は以後print 文などで reference として用いられる。自由に名前をつけられる。


● close: クローズ

● ファイルテスト

真偽の値を返す。 

例) open IN, "x.dat";
   unless (-e){print "error\n"};

-e ファイル・ディレクトリーが存在する
-s ファイルが存在する(ディレクトリーは常に偽)
-M 最後に変更されてからの日数
-A 最後にアクセスされたからの日数
ディレクトリー・ファイル操作

● 作業ディレクトリーの変更: chdir "/home";   # シェルのディレクトリーが変更されるわけではない
                                 # (~)をホームディレクトリーとして代用することはできない

● 対象ディレクトリーのファイル名検索
  opendir DH, "/etc";
  foreach $filename (readdir DH) {
   print "$filename \n"; }

  注) readdir DH, ファイル名のみを返す。 ディレクトリーのパスは返さない。

● ファイル削除・移動
  unlink "$filename", "output";
  $z = unlink "$filename"; ← 削除したファイル数を返す。

● グロブ
  glob "*.out" -> *.out 一覧

  例えば、 unlink glob "*.out";  とすることもできる。
演算子・組み込み関数など

 

 

** べき乗
% 剰余 (オペランドは小数点以下切り落とし)
++, -- オートインクリメント(デクリメント)
. (ピリオド) 文字列の足し算
x (small x) 文字列の掛け算 (前のオペランドが後ろのオペランド倍される)
$x =+ 3 3 をオートインクリメント
   
超越関数 cos, sin, exp, abs, log, sqrt (三角関数はラジアン入力)
 例) $z = sqrt (2)
   


論理演算子、比較演算子

比較 数値演算子 文字列演算子 正規表現に対する演算
等しい = = eq =~
より小さい < lt  
より大きい > gt  
等しくない != ne  
より小さいか等しい <= le  
より大きいか等しい >= ge  
アンド &&  
オア ||  

=<,, => の記法は使ってはならない

組み込み関数・演算子(文字列操作)

chomp スカラー: 文字列末の改行文字を切り捨てる
リスト: 要素末の改行文字を切り捨てる
 
pop リスト: 配列末尾の値を返して、配列から消去する $abc = pop @abc; @abcの最後の要素が$abcへ。
pop @abc; :最後の要素がなくなるだけ
push リスト: 配列末尾に値を加える push (@abc, 0)
push (@abc, @def), 不要: @abc = push (@abc, ...)
shift リスト: 配列先頭の値を返して、配列から消去する  
unshift リスト: 配列先頭に値を加える unshift (@abc, 0)
reverse リスト: リスト要素の順番を逆転させる
スカラー: 文字列を逆転させる
list: (abc, def, ghi) -> (ghi, def, abc)
scalar: (abc, def, ghi) -> ihgfedcba
sort リスト: 要素をASCII文字列順で並び替える
スカラー: 文字列としてソートする
@abc = sort (@abc)
(注: sort (@abc) だけではソートされない)
scalar リスト: スカラー扱いを強要(要素数を返す)  
keys ハッシュ: キーの全てのリストを返す  
values ハッシュ: 値の全てのリストを返す  
delete ハッシュ: キーと値を消去する  
exists ハッシュ: 値があれば真を返す。 exists ($abc{"ichiro"})
split 正規表現を参照: 文字列を分解  
join 文字列を任意の文字で結合 $z=join "-", @values;
 例) @vaslues= (1,2,3,4) -> $z="1-2-3-4"
index index ($big, $small);
$big中で$small を含む文字列を探して、$big中での最初の位置(インデックスを返す)
インデックスは0から始まる。 見つからない場合は -1 を返す。
rindex indexに対して、最後のインデックスを返す。

 

制御文

●if (条件) {文}
●if (条件) {文} else {文}
●if (条件) {文} elsif (条件) {文}....
 注) elseif ではない、 elsif

式修飾技法: print "result => $n" if $n < 0;

●unless (条件) {文}; ifの逆、 条件が偽であれば文を実行
●unless - else もあり。

●while (条件) {文} ; 条件が真である限り続ける (条件の評価は文の前)

  $count = 0 ;
  while ($count <= 10) { $count + = 1; print $count;}

●utill (条件) {文}; 条件が偽である限り続ける

●foreach 制御変数 (リスト) { }
   制御変数がリストの要素そのものになっていることに注意。制御変数を変えるとリストの中身も変更される。

  foreach $abc (qw/ ichiro jiro saburo /) {print $abc};
  foreach $abc (@abc) {$abc = pop(@abc)};  #この場合、 @abcのすべての要素は末尾の文字しか残らなくなる。

●for文
  例) for ($i=-150; $i <= 1000; $i += 3) {文}  +=はインクリメント 1増やすときは $i++ でよい。

● { 文 } ← スコープ中ではローカル変数宣言 my が使える。


● 演算子
  last 演算子 ループを抜け出す。 if と サブルーチンの{ }間は対象にならない。内側のブロックのみに作用。
  next 演算子 現在のループの末尾に飛ぶ
  redo 演算子 現在のループブロックの先頭に飛ぶ

● ラベル  xxx: while (...) {...} : xxxがラベルになる

●ループの終了: last(ループから抜ける) next (現在行なっているループ文を終了)
サブルーチン

●文型
 sub subroutine_name { }
 引数は @_ リスト($_[0], $_[1],.....)に格納される。

●返り値
 最後の行の値を返す。あるいは、return のある行の値を返す。 return $_ ; など

●サブルーチンへの飛び方と引数
 &subroutine_name ($a, $b)
 & は、組み込み関数と一致しておらず、前文に組み込みのサブルーチンなら不要。
子プロセス

● 子プロセスの起動 :  system "ls -al";

● 子プロセスの出力を格納するとき : @results = ` 逆スラッシュで囲む ls -al `;
正規表現


● 表式 → /abcd/ or m// (mはデリミタを変えることもできる)

●メタキャラ・文字クラス・ショートカット

 

.(ピリオド) 1文字のワイルドカード (\n を除く)  
* 直前の文字が0回以上マッチすること。 \t* (タブが0回以上)  
.* ワイルドカード(文字数制限なし)  
+ 直前の文字が1回以上マッチすること。  
? 直前の文字があるかないか a-?b => ab or a-b
{8} 直前の文字が8文字続くこと  
{5,10} 直前の文字が5-10文字続くこと (上限、下限を省略可)  
( ) カッコ *, +, ?, { , }の範囲決め
記憶 /(x)\2/  同じ文字が更に2つ続く (xxx)
(abcd)+ => abcdabcd
| 縦棒 選択(or)  カッコで範囲を決めて使うとよい。 (ab|cd) => ab or cd
     
[ ] [ ]内に含まれる文字を含む。 [abc], [a-zA-Z]など  
\d [0-9]と等価  
\w [A-Za-z0-9_]  
\s [\f\t\n\r ]  
\D, \W, \S \d, \w, \s の否定  
     
^xxx 文字列の先頭に xxx があること  
xxx$ 文字列末尾に xxx があること  
\bxxx ワード先頭に xxx があること (注: -, _ などの記号は無視)  
xxx\b ワード末尾に xxx があること  
     
/s . (ドット)を全ての文字にマッチする。(改行文字含む)  
/i 大文字、小文字区別せずにマッチング  

 

● マッチ変数1
 パターンに含まれるカッコに対応して、 $1, $2, $3.... があてがわれる。
 不要な", "などを省くことができる。
  /(\S+), (\S+), (\S+)/ で " 0.3, 0.4, 0.6"の文字列が、 $1=0.3 $2=0.4 $3=0.6 としてあてがわれる。
  注: マッチに成功しないと、前のマッチ変数が残ってしまう。:なるべく、 if , while 文で使うべき。

● マッチ変数2
 マッチした変数は $&に、その部分より前の文字列を $', 後方を $`に格納する。

● 置換 s/// => 例: s/abc/def/ で abc が defに置き換えられる。(置換は1回しか行なわれない)
   $_ が入力文字列 → $_ で返される。
   s.///は値を返す: 成功で真、失敗で偽
   s///gにすると、置換は可能性のある全ての語句が置換対象となる。

     先頭の空白文字を空文字化する s/^\s+//;
     後方の空白文字を空文字化する s/\s+$//;

● 大文字と小文字の変換 s///中で、\U, \L などを用いる。

● split 演算子 → tab (\t), space (\s), コロン(,) で区切られたデータを分割する
   @fields = split (/:/, "abc:def:g:h");   # @field = ("abc","def","g","h")
    注)先頭の空フィールドは返される。末尾は返されない

   空白文字でスプリット: @fields = split /\s+/, $some_input;
    注)先頭の空白文字もスプリットの対象となり、リストに格納されてしまう。
   デフォルトスプリット: @fields = split; $_ を空白文字でスプリットする。
    注)先頭の空白文字はリストから削除される。