トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
Perl
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
perl 全角 半角 変換 半角
___

■ 下準備


___

■ インタープリタを指定する

perl スクリプトは perl.exe が解釈して実行する。 毎度、以下のようにコールするのが手間なので
    perl.exe   test.pl    
一行目にインタープリタを指定する。
    #!/usr/bin/perl
実行する。
    test.pl
___

■ 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 のコマンド置換と同じ
    my $s=`date`;
    print($s);
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";
      }
スクリプトをコールする
    arg.pl  aaa bbb ccc
___

■ 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)

     my $str = "aaa" . "bbb";
___

■ 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:] ]
    # path を指定するなら [/] 以外を使うこと
    #    MetaCharacter を指定すると MetaCharacter としての意味がなくなる
    $ret =~ m|/var/foo/.*|

    # Default "/" を指定するなら m は不要
    #
    $ret =~ m/^foo/
    $ret =~ /^foo/


    # 左辺を省略すると  $_ 扱いになる
    #  
    $_ =~ m/^foo/
    m/^foo/
    /^foo/
# 修飾子 i : Insentive o : Once ( Pattern 中の変数展開を一度しかしない ) g : Global ( 照合を Global にする == 繰り返す ) m : Multi Line 文字列を複数行として扱う s : Single Line 文字列を単一行として扱う x : Xtended ( Comment が利用可能な Regexp ) # i がないと 煩雑になる < (H|h)(R|r)> # これで OK < HR> # Pattern 中の 変数展開 を一度にすることで高速化する # 再評価が必要なら, o をつけないこと # RET # /var/log # /maillog # $str = "/var/log/maillog"; while ( $str =~ m|/.*?log| ) { print "$1\n" } # m が指定されていると \n を含む場合 # 複数行としてみなす # ^$ にマッチする # $str = foo\nbar\ngoo # これと同じ foo bar goo # s # \n があっても のマッチの対象になる #str = "foo\nbar\ngoos\nfoo\nbar\ngoos"; while ( $str =~ m/.+?s/sg ) { print "$& \n"; } # x # indent など comment の記述も可能になる # " " は無視 # " " を指定するなら \ する # []文字クラス内なら " "扱い while ( $str =~ m| ( / # Directory 区切り文字 / .*? # 任意の文字列 log # 文字列 log で終わる ) |xg) { print "\1\n"; }
___

■ 文字変換(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' )"    

Var $var : は置換される. "" : 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;


















NINJAIDX 7