\n 
[ トップページ ] 
[ ___ _CommandPrompt ] 
[ ___ _JScript ] 
[ ___ _MySQL ] 
[ ___ _Cygwin ] 
[ ___ _Java ] 
[ ___ _Emacs ] 
[ ___ _Make ] 
[ ___ _Perl ] 
[ ___ _Python ] 
[ ___ _OpenGL ] 
[ ___ _C# ] 
[ ___ _StyleSheet ] 
[ ___ _C++ ] 
[ ___ _Winsock ] 
[ ___ _Thread ] 
[ ___ _VisualStudio ] 
[ ___ _C ] 
[ ___ _Win32API ] 
[ ___ _Lua ] 
[ ___ _PhotoShop ] 
ヘッダ検索 
■ 下準備 
■ インタープリタを指定する 
    perl スクリプトは perl.exe が解釈して実行する。
    毎度、以下のようにコールするのが手間なので
    一行目にインタープリタを指定する。
    実行する。
 ■ SYNTAX 
■ 関数(function) 
  sub func
  {
      # Argument は $_ という配列にはいっている 
      print( $_[0] );
      print( $_[1] );
      print( $_[2] );
    
      # 変数をまとめてうけとる 
      my ( $a, $b ) = @_;
      # Function 内で shift を使って 順に引数をとる 
      my $a = shift;
      my $b = shift;
      # 返り値 
      my $ret = "aaa" ;
      return $ret;
  } 
  {
      # 呼び出し 
      func("aaa" , "bbb" , "ccc" );
  }
 ■ 制御構文 
■ while 
  SYNTAX 
    while cond { exp ... }
  
    while ( $i <  10 ) {
      print "cnt $i \n" ; 
      $i ++;
    }
    # < FILEHANDLE>  とすると 行がなくなるまで 1 行ずつ処理をする 
    open ( FP, $ARGV[0] )
    while ( < FP> ) {
      print "$_\n" ;
    }
    close( FP );
 WARNING 
    loop を継続するには continue ではなく next を利用する。
    if ( "aaa"  == "aaa"  ) {
      next;
    }
 ■ if 
  SYNTAX 
    if ( EXPRESSION )
    if ( EXPRESSION ) BLOCK else BLOCK
    if ( EXPRESSION ) BLOCK elsif BLOCK else BLOCK
    
■ foreach 
  SYNTAX 
    foreach 制御変数 ( リスト値 ) { 実行 }
    foreach scalar ( array ) { statement }
    foreach $i (3, 2, 1)
    {
        print "count $i \n" ; 
    }
 ■ require 
  SYNTAX 
    require FILE
  DESC 
    perl code を 読み込み評価する( 2 重に load されない )
    include したいときに使う
    sub func()
    {
      print "call func\n" ;
    }
    # 最後に 1 を返すようにすること 
    1;
 ■ コマンド置換 
    バッククォート内の文字列をシェルで実行して結果を返す。
    shell のコマンド置換と同じ
  POINT 
    shell コマンドの機能を利用できる。
    # ディレクトリのエントリをリストする。 
    my @a=`find -type f`;
    print(@a);
    
  ■ Array(配列) 
    変数には @ をつける
    初期化する
    @a = ( 1, 2, 3 )
    # 異なる型が混在してもいい 
    @a = ( 1, "aaa" , 2 )
 SYNTAX 
    foreach 制御変数 ( リスト値 ) { 実行 }
    foreach scalar ( array ) { statement }
    イテレートする  
    foreach $i (3, 2, 1)
    {
        print "count $i \n" ; 
    }
 WARNING 
    配列の () は必須
    my @a = ( 1, 2, 3 )
    foreach $i ($a)
    {
        print "$i \n" ; 
    }
 
    # 追加 
    push( @a, 10 );
    # 末尾削除 
    pop( @a );
    # 先頭追加 
    unshift( @a, 10 );
    # 先頭削除 
    shift( @a );
    # 反転 
    reverse( @a );
    # sort  
    sort( @a );
    # 参照( index 0 から始まる ) 
    $a[ 0 ] );
    # 要素数 
    #     配列のスカラに代入すればとれる 
    my $nr = @a;
    # 展開 
    #     区切り指定 
    $" = '_';
    my $ret = "@a" ;
 ■ Main.関数の引数 
  # Main Argument 
■ argument 
      my $i;
      for ( $i=0; $i< =$#ARGV; $i++ ) { 
        print @ARGV[$i], "\n" ;
      }
      my $i;
      for ( $i=0; $i< =$#ARGV; $i++ ) { 
        print $ARGV[$i], "\n" ;
      }
  ■ file 
  SYNTAX 
    open FILEHDL, [EXPR]
  RET 
    !0     : OK 
    NODEF  : FAIL
# WARNING   
#    [,] を忘れずに 
open src, $listFile;
while( $line = < src> ) {
  
}
    #  書き込み 
    open fp, "> filepath" 
    print fp "test" ;
 ■ shell 
  SYNTAX 
    `cmd`
    # find を実行して 配列に結果をセット 
    @a = `find ~ -iname "*.txt" `
 ■ print 
  SYNTAX 
    print HANDLE LIST
 ■ String(文字列処理) 
■ 文字の削除 
  
  SYNTAX 
    chop  string
    chomp LIST
  RET 
    削除された末尾の1文字
  DESC 
    対象の文字列の末尾の文字を削除する。
  POINT 
    Perl ではファイルから読まれた行は最後の改行は含まれる
    chomp は改行があれば, 削除して、( なければ何もしない )
    my $s = "abc" 
    my $ret = chop( $s );
    # "c"  
    print ( $ret );
    # "ab"  
    print ( $s );
 WARNING 
    引数となる文字列に削除をするため定数は指定できない
    # BAD  
    chop( "abc"  );
    
    # OK  
    my $s = "abc" ;
    chop( $s );
 ■ Substitute 
  SYNTAX 
    s/ptn/regexp/  
  DESC 
    置換演算子
    {
      $word = "foo" ;
      $word =~ s/foo/bar/;
      # bar 
      print $word;
    }
 # 繰り返すには /g. 途中の文字でも Matching する  
    {
        my $var="jinmin no jinmin ni yoru jinmin no tameno Seiji" ;
        $var=~s/jinmin/ore/g;
        # RET : ore no ore ni yoru ore no tameno Seiji 
        print $var;
    }    
    
    {
      my $var = "ore ore ore ore" ;
      # 行頭だけ Match したい場合は "^"  
      $var =~ s/^ore/foo/g;
      # RET : foo ore ore ore 
      print $var;
    }
■ 検索 
  SYNTAX 
    m/pattern/
  DESC 
    pattern を検索する
    # Grep と同じ操作 
    while (< stdin>) {
      if ( m/test/ ) {
         print;
      }
    }
 
   if( "Wikibooks"  =~ /book/){
     print "Match!" ;
   }else{
     print "Not match." ;
   }    
 ■ 結合(strcat) 
■ substr 
  DESC 
    部分文字列をかえす
   
  SYNTAX 
   $ret = length( $str );
 SYNTAX 
   $ret = substr( $str, offset [,length [, replace ] ] );
    # 4 番目から最後まで 
    # efgh  
    substr("abcedefgh" , 4 );
    # - を指定すると 最後から N 番目の位置になる 
    # 後ろから 1 番目から最後まで 
    # c 
    substr( "abc" , -1 );
    # 0 番目から 2 個 
    #  ab 
    substr( "abc" , 0, 2 );
    
    # - を指定すると 後ろから 2 番目の位置の文字まで 
    #  a 
    substr( "abc" , 0, -2 );
    
        
   #  ef 
   substr( "abcedefgh" , 4, -2 ) -> ef  // 前後から指定 
   
   # 4 番目から最後まで 
 ■ index 
  DESC 
    regexp に一致する index をかえす
  RET 
    N >= 0 : match した index
    -1     : match しない
    # -1  
    index("aiueo" , "foobar" );
    # 2 
    index("aiueo" , "ueo" );
 ■ length 
  DESC 
    文字列の byte 数をかえす
  
    #  3 
    length( "abc"  )
    #  6 
    #    ( SJIS ) 
    print length( "あいう"  );
    #  9 
    #   ( utf-8 ) 
    print length( "日本語"  );
 ■ substitute 
  SYNTAX 
    s/regexp/置換文字列/
  
    $s = "This is a pen." ;
    #    this is a book 
    $s =~ s/pen/book/;
    # 空白文字削除.   
    $s =~ s/\s//g;     
  ■ 変数(Variable) 
■ 基本事項 
  
  DESC 
    変数は宣言なしで利用できる。
    すべての変数は FileScope ( GlobalScope )になる
    
    tmp = "a" ;
    
    # スペルミスをした場合でも tnp という名前の変数が生成される。 
    tnp = "b" ;
 ■ 型(Type) 
   型には 3 種類がある
  Scalar
  Scalar 配列
  スカラー連想配列
 ""  で囲む
   
    # スカラーに数値, 文字列代入 
    $a = 10;           
    $name = "test" ;
    # ""  内でも 変数は展開される( bash 同様 ) 
    print "my name is $name" , "\n" ;
 ■ スカラ(Scalar) 
  SYNTAX 
    $SYMBOL
  DESC 
    数値, 文字列, 参照 など 1 つの値
    
■ Array 
  SYNTAX 
    @symbol
  DESC 
    index 0 から順に並ぶ Scalar のセット(集合)のこと。
■ Hash 
  SYNTAX     
    %symbol
  DESC 
    key, val と関連づいた Scalar 値の集合のこと
  
  {
    # 代入, 参照 ともに Symbol には "$"  をつける 
    $gTest = "ccc" ;
  }
  # ccc 
  print $gTest;
  # bash 同様に ""  内でも展開 
  print "$gTest" ;
  # '' はだめ 
  print '$gTest';
 ■ LocalVariable 
  {
    # Local 
    my $talent = "Takajin" ;
    print $talent, "\n" ;
  }
 
  {
    my $var = "out"  
    {
      # 同名の変数は {} の外の変数が隠蔽される 
      my $var = "in" ;        
    }
    
    # RET : out 
    print $var;
  }
 ■ グローバル変数(GlobalVariable) 
  # use strict では our 宣言がいる 
  our $varGbl = "aaa" ;
  # BAD  
  #    Global symbol "$varGbl"  requires explicit package 
  #our $varGbl = "aaa" ; 
  {
    
  }
 ■ 特殊変数 
  Regexp 関連
  $+  :  () に最後にマッチした
  $&  :  マッチした文字列
  $`  :  マッチした文字列の前の文字列
  $'  :  マッチした文字列の後の文字列
  $1  :  () の文字列
  POINT 
    代入演算子 を利用しないと "$_"  に代入される
    Perl の慣用句
    # 変数 $_ に代入される 
    < INFILE>
  ■ Option 
  Perl -v # RET :  v5.10.0  
  # Compile のみ 
  # - syntax OK  
  echo "print aaa"  | perl -c 
  echo print aaa | perl 
  # Help 
  perl -h
  # 一行 script を入力にとる 
  perl -e "print foo\n" 
  perl -d -e "printaaa" 
  # Debuger を利用して実行 
  perl -d -e "print aaa" 
  
 ■ Debug 
  
  perl -d -e "print aaa" 
  
  perl -d -e "print aaa" 
  Loading DB routines from perl5db.pl version 1.3
  Editor support available.
  Enter h or `h h' for help, or `man perldebug' for more help.
  main::(-e:1):   print aaa
    # Help 
    DB< 1> h
    # Next 
    DB< 1> n
    # Print  
    DB< 1> p $var
    
  Debugged program terminated.  Use q to quit or R to restart,
    use o inhibit_exit to avoid stopping after program termination,
    h q, h R or h o to get additional info.
    DB< 1> q
 
List/search source lines:               Control script execution:
  l [ln|sub]  List source code            T           Stack trace
  - or .      List previous/current line  s [expr]    Single step [in expr]
  v [line]    View around line            n [expr]    Next, steps over subs
  f filename  View source in file         < CR/Enter>  Repeat last n or s
  /pattern/ ?patt?   Search forw/backw    r           Return from subroutine
  M           Show module versions        c [ln|sub]  Continue until position
Debugger controls:                        L           List break/watch/actions
  o [...]     Set debugger options        t [expr]    Toggle trace [trace expr]
  < [< ]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set breakpoint
  ! [N|pat]   Redo a previous command     B ln|*      Delete a/all breakpoints
  H [-num]    Display last num commands   a [ln] cmd  Do cmd before line
  = [a val]   Define/list an alias        A ln|*      Delete a/all actions
  h [db_cmd]  Get help on command         w expr      Add a watch expression
  h h         Complete help page          W expr|*    Delete a/all watch exprs
  |[|]db_cmd  Send output to pager        ![!] syscmd Run cmd in a subprocess
  q or ^D     Quit                        R           Attempt a restart
Data Examination:     expr     Execute perl code, also see: s,n,t expr
  x|m expr       Evals expr in list context, dumps the result or lists methods.
  p expr         Print expression (uses script's current package).
  S [[!]pat]     List subroutine names [not] matching pattern
  V [Pk [Vars]]  List Variables in Package.  Vars can be ~pattern or !pattern.
  X [Vars]       Same as "V current_package [Vars]" .  i class inheritance tree.
  y [n [Vars]]   List lexicals in higher scope < n>.  Vars same as V.
  e     Display thread id     E Display all thread ids.
For more help, type h cmd_letter, or run man perldebug for all docs.
 ■ 関数内では必ず.my.を利用すること 
  Global 変数はさける
   同一名の Symbol があると
   関数呼び出しだけで
   値が変更されるかも
■ strict.warning.Modeを使う 
  BUG を早期に発見する
 ■ 演算子(Operator) 
■ 算術(ArithmeticOperator) 
    # increment, decrement 
    $i ++;
    $i --;
 ■ 比較 
    # 数値 
    $a <  $b
    $a == $b
    $a != $b
  
    # 文字列 
    $a lt $b 
    $a eq $b 
    $a ne $b 
  ■ 正規表現(Regexp) 
  REF 
    Perl REGEP 
■ meta.文字 
  \  ^   .   $   *   ?   |   (   )   [   ]   {   }
 ■ Perl.固有の.MetaCharacter 
  \A   : 文字列の先頭 ( 行頭ではなく )
      \n, s の指定に関係なく 常に文字列の先頭にマッチ
  \c   : 制御文字にマッチ
      \cd == c-d
  \G
      Global (g) と併用する
      前回のマッチが終了した位置にマッチ
  \L-\E
      \L-\E の間の文字を小文字に変換
  \l
  \u
      次の文字を小(大)文字に変換
  \Q-\E
      間の文字を 通常文字として扱う
  \z
      改行の有無に関係なく 文字列の末尾にマッチ
  \Z
      文字列の末尾にマッチ
      改行で終わるときは, 改行の直前にマッチ
      
  (#?comment) 
      Comment を記述 ( 無視される )
  (?:REGEXP)
      後方参照が不要な場合の Group 指定
      Text 保存の Overhead を避ける
  (?>REGEXP)
      マッチした部分を Backtrack しない
      
      ( Backtrack をしなくてもマッチできるならこれを利用する )
      繰り返しを指定した場合に
      
      
  (?i) (?m) (?s) (?x)
      PATTERN Modifier を REGEXP に埋め込む
      (?i)regex
■ 量指定子 
   * : >= 0
   + : >= 1
   ? : (0|1) 回以上
 {n} : n 回
 {n,} :>= n 回以上
 {n,m}:n 回以上 m回以下 
■ 特殊 
  \s  : 空白
  \S  : 空白以外
  \d  : Digit ( 数字 ) 
  \w  : Word  ( 文字 ) 
■ 関数 
  SYNTAX 
    pos()
  DESC 
    m//g が前回マッチした Offset をかえす 
  SYNTAX 
    quotemeta()
  DESC 
    MetaCharacter にすべての \ をつける
  SYNTAX 
    split()
  DESC 
    PATTERN にマッチした区切り文字で 文字列を分解
  SYNTAX 
    study()
    
  DESC 
    PATTERN マッチする 文字列の内容を予習する
  SYNTAX 
    grep()
    
  DESC 
    LIST の中からマッチした要素をかえす
 ■ Package 
  SYNTAX 
    use PACKAGE
    package NAME
  DESC 
    一連の処理を Package にまとまる
    namespace におさまる
  # packgae をつくる宣言 
  package test
   sub func{ print "test package\n" ; } 
   # package 終了宣言 
   return 1;    
 
    # 利用する 
    require "test.pkg" 
    &test::func();
  ■ 環境変数(Enviroment) 
  SYNTAX 
    $ENV( string )
  
  DESC 
    ENV という特別な[ 連想配列変数 ]を使い,環境変数の値を R/W する
  WARNING  
    # () ではない 
    $ENV()
    
    # 環境変数が定義されないなら "noname"  
    my $name = $ENV{'USER'} || "noname" ;
 
    if ( defined( $ENV{'PATH''} ) ) { 
      print $ENV('PATH');
    }
{
    # Write はできないかも 
  $ENV{'TEST'} = "foobar" ;
}
  ■ FileSystem 
  SYTNAX
    open HANDLE, [expr]
    open HANDLE, [file]
    open (HANDLE, MODE, [FILE])
  DESC 
    file を開いて Handle へ関連づける
  RET 
    !0    : OK 
    NODEF : FAIL
  SYTNAX
    open HANDLE, > [expr]
    open HANDLE, > [file]
  DESC 
    file へ出力
  SYTNAX
    close file
  DESC 
    file を閉じる
  RET 
    !0    : OK 
    NODEF : FAIL
  MODE
    <         :  Read
    >        :  Write
    >>       :  Append
    |COMMAND : 出力を Pipe する
    COMMAND| : PIPE して入力をとる
  # [,] を忘れずに 
  #    FILE と HANDLE を結びつける 
  open fp, "foo.txt" ;
  # mode は FILE 名と一緒に記述できる 
  # 
  open fp, ">foo.txt" ;
  # FILE HANDLE を < > でくくると 1行の入力操作 
  
  # HANDLE を指定しないと ARGV からの読み込み 
  < >
  
  while ( $line < fp> ) {
    print $line;
    
  }
  close( fp )
 
    # Default FILE HANDLE 
    #    明示的に open, close する必要なし 
    # 
    STDIN
    STDOUT
    STDERR
    ARGV    : CommandLine Option
    
  ■ Pattern 
  POINT 
    Pattern 結合演算子
    
  SYNTAX 
    =~ 
  DESC 
    左辺に指定されたデータに 右辺のパターン処理の結果を代入する
■ 置換(Substitute) 
  SYNTAX 
    s/regexp/置換文字列/
    # this is a book 
     $str = "This is a pen." ;
     # 置換した結果で 左辺に代入される 
     $str =~ s/pen/book/;
  POINT 
    区切り文字は / 以外も OK  ( m と同じ )
 
    # () で "くくる"  こともできる 
    s/text/txt/
    s(text)(txt)
    s(text)/txt/
 
    # e を指定すると Perl の式 として扱われる 
    
    #  print があるため出力される 
    # 
    s/(.+)\..{3}/"print \1\n" /e;
 ■ 照合(Match) 
  SYNTAX 
    m/PATTERN/OPT
  RET   
    true   : マッチ
    false  : マッチせず
  POINT 
    m の直後の区切り文字は任意 
    英数字 + " "  以外
    [^[:alnum:] ]
        
■ 文字変換(Translate)     
  SYNTAX 
    tr/SRC/DST
    $str = "abc" ;
    $str =~ tr/abc/xyz/;
    # 文字クラスの表記もできる 
    $str =~ tr/a-z/A-Z/;
    # Modifier 
    c : Complement
    d : Delete ( 検索リストの文字が変換リストになければ削除 )
    s : 重複した場合 1 つにまとめる
  ■ 基本的な要素 
■ Interpreter 
  DESC 
    先に Script File 全体を評価( Compile )する
    UNIX 生まれで, Windows 環境でも動作する
    Text 操作をメインで開発されたが, 
    現在は System, Network 処理などもできる
    
    #!/usr/bin/perl 
    
    # 行頭に 実行する Perl のパスを記述する 
    #  これを解釈する環境では有効 
    # CommandLine から直接指定する 
    #    File 内の指定を上書きする 
    # 
    /usr/bin/perl  foo.pl
perl -e "print length( 'aaa' )"     
 ""    : quot したものは 正確には文字列ではなく, Symbol ではないことを意味する.
       "xxx"  とするときは, [ そのままね ] と言おう. ^ ^/
      
      -> ので, 
      $str = "aiueo" ;    は "aiueo"  ではなく aiueo が work[ str ] に格納される. 
      
      同様に. 
        "aa\" aa" -> 内の \ は その後の文字を quot してね. ( そのままの意味ね ) と言う. 
        
      $var は置換されるので, $var とある部分は 定数を記述しても問題なし. 
   型という概念がないので、同じ変数に数値, 文字列を代入できる
 ■ Network 
    #!/usr/bin/perl 
    use IO::Socket;
    $sock = new IO::Socket::INET(PeerAddr=>'www.google.co.jp',
        PeerPort=>80,
        Proto=>'tcp');
    die "IO::Socket : $!"  unless $sock;
    print $sock "GET / HTTP/1.0\r\n\r\n" ;
    print < $sock>
    close($sock);
    exit;