\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 が解釈して実行する。
毎度、以下のようにコールするのが手間なので
一行目にインタープリタを指定する。
実行する。
■ 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' )"
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;