使い方

①.httpdプログラムを作動する。
②.http://localhost/XXX.cgi(または、XXX.pl)をブラウザーにキーインする。
  (ブラウザー表示形式でないプログラムはコマンドのみの実行となる。)

◇ 変数のきまり、コメント化

  perl javascript
コメント # ←1行
=pod ~ =cut ←複数行
=commen ~ =cut ←複数行
//  ← 行末まで
/* ~ */ ← 複数行
変数 $, @, %で始まる文字が変数 予約語 var を使って宣言
var word; var dog;
または、var word, dog;
変数の先頭

英字1文字から始まり、それ以降は数字、英字およびアンダースコア ( _ ) を用いることができます

・英字(a~z, A~Z)
・アンダーバー(_ )
アンダーバー(_ )は良くない?

誤: @12ab 数字から始まることはできない

誤: @ab-cd ハイフンは使用することはできない

英字(a~z, A~Z)、アンダーバー(_ )
制限

数字(0~9)で始まる変数名、予約語

数字(0~9)で始まる変数名、予約語
大小文字 英字の大小文字は区別される。
・ $a123 と $A123 とは区別。
・ %a と %A は別物。
同左
a123 と A123 とは区別

なお、参考までに、HTML、スタイルシートの場合のコメントは以下の通り。

HTML スタイルシート
/* */ /* */

☆ スタイルシートに対応していないブラウザで、<style>タグを利用してする場合 ☆
ソースがそのまま表示されて しまう恐れがあるので、次の対策をする。

スタイルの設定箇所を>囲う
<!-- スタイルの設定記述 -->

◇ スカラー変数、配列変数、連想配列(ハッシュ変数)

Perlで使えるデータ型は以下の3つです。この変数の型の後ろに名前(識別子)を付けて使います。

Perl

変数の型

データ型

内容

$
スカラー変数 数値、文字列など値を1つだけ記憶できる

$samp ='Key'; or $samp ="Key"; $name = "a pen"
$smp0 = "This is $name"
$smp1 = 'This is $name'
を代入して、 $name、$smp0、$smp1を表示すると、
$nameは a pen
$smp0は This is a pen
$smp1は This is $name
が出力される。

@
配列変数 複数の値を順序付けて記憶できる

@list = ('東京','名古屋','大阪');
%
連想配列
(ハッシュ変数)
配列の添え字に文字列(キー)を使う事ができる

%TSUKI = ( 'January' , '一月' , 'February' , '二月' , 'March' , '三月' ) ;
 
\を付ける リファレンス リファレンスとは、変数が格納されているエリアの参照値(アドレス値)。
前に『$,@,%』のいずれかを付ける。 デリファレンス

リファレンスが指すエリアに格納されている値を取得することをいう。

\と同じだけの$で元にもどす。
ただし、最後の記号はもとの変数に合わせる。


ページトップへ▲

☆ 変数の宣言

my $var;  my @var;  my %var;
複数の変数に対しての宣言方法  my ($a, $b, %c);

(')シングルクオート内の変数はただの文字列扱いとなる。
(")ダブルクオート内の変数は展開されて代入される。



表現解説
$hoge[-1]配列変数 @hoge の最後の要素
$#hoge配列変数 @hoge の最後の添字番号(添字は 0 から始まるので要素の数より 1 少ない値になります)。
$page = @hoge;スカラー変数に配列変数を代入すると要素数が代入されます。
$a = scalar keys %HOGE; %HOGE の要素数を求めます。
$#hoge = -1;
@hoge = ();
どちらも @hoge を空にします。
%HOGE = (); %HOGE を空にします。
undef @hoge; @hoge を未定義値にします。
undef %HOGE; %HOGE を未定義値にします。

ページトップへ▲


 

HP 無名配列 や 無名連想配列(無名ハッシュ)

変数からリファレンスをとるには前にバックスラッシュ(Windows は円マーク)を付ければよい。

my $s_ref = \$s;
my $a_ref = \@a;
my $h_ref = \%h;
my $f_ref = \&f;

リファレンスから元のものにアクセスする(デリファレンスする)には、スカラーは ${ }、配列は @{ }、ハッシュは %{ }、サブルーチンは &{ } を使って

${ $s_ref } # $s
@{ $a_ref } # @a
%{ $h_ref } # %h
&{ $f_ref } # &f


ページトップへ▲

作成の方法

通常配列

( )

my @xx = (10, 20, 30);

my($a1,$a2)=(1,2); my @x =("apple", "orange"); my($a3,$a4) = @x;
my @xx = ($a1,$a2,$a3,$a4);

my @xx; $xx[0] ="blue"; $xx[1] ="red"; $xx[2] ="yellow";

my @xx = qw( blue red yellow white black );

無名配列

[ ]

my $xx = [5, 7, 9];

my $c_ref = \@c; ( 配列@Cのリファレンス取得)

my $c_ref = [ @c ]; ( 配列@Cを[ ]で囲む )

ハッシュ

( )

my %hh = ('name' => 'Taro', 'age' => 20, 'height' => 175);

my %address = ("鈴木" , "東京","山田" , "京都","遠藤" , "大阪");

my %sig;   $sig{"R"}="S"; $sig{"Y"} = "H"; $sig{"B"} = "G";

my %flower;
@flower {'R','Y','V','P'}  =  ('camellia','sunflower','wisteria','cherry');

my %fruit;
@fruit{ qw(red yellow violet) } = qw(apple banana grape);

my @key = ("山", "海", "川"); my @values= ("熊", "鯛", "鮒");
my %hash; @hash { @key } = @values;

無名ハッシュ

{ }

my $hh = {'name' => 'Taro', 'age' => 20, 'height' => 175};

my $hh = {'name' , 'Taro', 'age', 20, 'height', 175};

my $hh = { @c }; 「配列」から「無名ハッシュ」を作り出す

my $hh = { %d }; 「ハッシュ」から「無名ハッシュ」を作り出す

リファレンス my $dd = \@xx;

ページトップへ▲


各々の要素にアクセスするとき

通常配列

( )

$xx[0] += 10;

全体表示
print @xx ;
foreach my $xx ( @xx ) { print $xx ; }

無名配列

[ ]

$xx->[0] += 10;  または、 $$xx[0] += 10;

 全体表示
print @$xx ;  配列全体の表示(@を付ける)

foreach my $item ( @$xx ) { print $item; }
@{ $xx } の代わりに @$xxでも良い

for (my $i = 0; $i < 4; ++$i) { print $xx1->[$i] ; }

ハッシュ

( )

$hh{'height'} += 10;

 全体表示
foreach my $tmp ( keys %hh ) { print $tmp $hh{$tmp} ; }
for( keys %hh ) { print  $_   $hh{ $_ } ; }

無名ハッシュ

{ }

$hh->{'height'} += 10; または、 $$hh{'height'} += 10;

 全体表示
while ( my ($key, $val) = each %$hh ) { print  $key $val ; }
for( keys %$hh ) { print  $_   $hh->{$_} ; }

デリファレンス ${$x[2]} # 配列の要素をデリファレンス



 

 

多次元配列

([ ],[ ],[ ] ])

my @xx = ( [ ' a ' , ' b ' ] , [ ' d ' , ' f '] , [ ' h ' , ' i ' ] ) ;

末尾に追加: push( @xx , [ ' j ' , ' k ' ] );

行の末尾に要素を追加: push ( @ { $xx [ 1 ] } , 'abc ' );

多次元無名配列

[ [ ],[ ],[ ] ]

my $xx = [ [ 'a', 'b', 'c' ] , [ 'd', 'e', 'f' ] , [ 'g', 'h', 'i' ] ] ;

my $xx =[]; #無名配列
my $w0 = 'a,b,c'; my $w1 = 'd,e,f'; my $w2 = 'f,g,h';
my @z0 = split(',', $w0); my @z1 = split(',', $w1);my @z2 = split(',', $w2);
push @$xx, \@z0; push @$xx, \@z1;  push @$xx, \@z2;

多次元ハッシュ

( =>{ } , =>{ } , =>{ } )

my %hh = (A => { a => 1, b => 2 } , B => { d => 4 , e => 5 } ) ;

my %hh = (' A ' => { ' a ' , 1 , ' b ' , 2 } , ' B ' => { ' d ' , 4 , ' e ' , 5 } ) ;

多次元無名ハッシュ1

{ =>{ } , =>{ } , =>{ } }

my $hh = {
a => { fl => "a1", clr => "a2" },
b => { fl => "b1", clr => "b2" },
c => { fl => "c1", clr => "c2" }
};

多次元無名ハッシュ2

{ =>[ ] , =>[ ] , =>[ ] }

my $infos = {
'01:1' => [3, 2.1, 4.6],'01:2' => [5, 4.1, 7.4],'01:3' => [6, 3.5, 5.7]
};

ハッシュの配列

[ { => } , { => } , { => } ]

my $persons = [
{name => 'Ken', cntry => 'Japan', age => 19},
{name => 'Taro', cntry => 'USA', age => 45}
];


ページトップへ▲


 

 

多次元配列

my @xx([ ],[ ],[ ])

 要素表示
$xx[0][0]  $xx[2][1] 

 行表示
@{$xx[0]}  @{$xx[1]}

 全体表示
foreach my $tmp (@xx) { print @{$tmp} ; }

for my $x (0 .. 3) {
for my $y (0 .. 3) { print $xx[$x][$y] ; } }

多次元無名配列

my $xx[ [ ],[ ],[ ] ]

 要素表示
$xx ->[2] ->[0]
$xx ->[2][0]
$ { $$xx[2] } [0]

 行表示
@ { $$xx[1] } 
@ { $xx ->[1] }

 全体表示
for my $xx (@$xx) {
for my $yy (@$xx) { print $yy; } }
注:@$xxはデリファレンス

多次元ハッシュ

( =>{ } , =>{ } , =>{ } )

 要素表示
$hh { A } -> { a } または、$hh { A } { a } 
$ { $hh { A } } { a }

 1組のキーと関連する値 表示
while ( my ( $key , $val ) = each % { $hh { A } } ) {
print $key : $val ; }

print % { $hh { ' A ' } } ;

foreach my $j ( sort keys % { $hh { A } } ) {
print $hh { A } { $j } ; }

 全体表示

foreach my $tmp ( keys %hh ) {
while (my ( $key, $val ) = each %{ $ hh { $tmp } } ) {
print $tmp : $key : $val ; } }

foreach my $i (sort keys %hh) {
foreach my $j (sort keys % { $hh { $i } } ) {
print $hh { $i } { $j } ; } }

多次元無名ハッシュ1

{ =>{ } , =>{ } , =>{ } }

 要素表示
$ { $$hh { a } } { fl }  $hh -> { a } { fl } 

 キー リスト 表示
print join " ", keys( %$hh ) ;

 行 表示
for my $y ( % { $hh -> { 'a' } } ) {
print $y ; }

 全体表示
for my $y (sort keys %$hh ) { print $y;
  for my $col ( % { $hh -> { $y } } ) {
    print $col ; } }

多次元無名ハッシュ2

{ =>[ ] , =>[ ] , =>[ ] }

 要素表示
$xx[0][0]  $xx[2][1] 

 行表示
@{$xx[0]}  @{$xx[1]}

 全体表示
for my $y (sort keys %$hh ) { print $y;
  for my $col ( @ { $hh -> { $y } } ) {
    print $col ; } }

ハッシュの配列

[ { => } , { => } , { => } ]

 

 

無名配列 や 無名連想配列(データファイルから、読み込み配列に入れる)

参考プログラム
サンプル用データ

ページトップへ▲


● my $name = "加藤";
print "Hello,$name san";

my $name = "加藤";
print "Hello,${name}san";

上の例は「加藤 san」下の例は「加藤san」となる。


ページトップへ▲

ハッシュ関数

ハッシュを操作するための関数として、次のような関数が用意されている。


keys(すべてのキーを取り出す)
・ ハッシュのキーのリスト
・ ハッシュに含まれる要素の個数

 戻り値を配列ではなく単なる変数に格納した場合は、ハッシュのキーのリストでは無くハッシュに含まれる要素の個数が格納される

my %fruit = ("red", "apple", "yellow", "banana", "violet", "grape");
my @array = keys %fruit; # ハッシュのキーのリスト
my $array_no = keys %fruit; # ハッシュの要素の個数

for (my $i = 0; $i < $array_no; $i++){
print "$array[$i]\n<br>";
}

violet
red
yellow が出力される

values(すべての値を取り出す)
・ ハッシュの値のリスト
・ ハッシュに含まれる値の個数

 戻り値を配列ではなく単なる変数に格納した場合は、ハッシュの値のリストでは無くハッシュに含まれる値の個数が格納される
my %fruit = (red => "apple", yellow => "banana", purple => "grape");
my $val_no = values %fruit;
print "$val_no\n";
3  ←このように表示される。
my %fruit = (red => "apple", yellow => "banana", purple => "grape");
my @file = values %fruit;
print "@file\n";
grape apple banana  ←このように表示される。
each (1組のキーと値を取り出す)
#1組だけが抽出され、どのペアが取り出されるかは不定
my %fruit = (red => "apple", yellow => "banana", purple => "grape");
my($key, $val) = each %fruit;
print "$key : $val\n";

purple : grape ←表示される
#ハッシュの全要素を展開
my %fruit = (red => "apple", yellow => "banana", purple => "grape");
while (my($key, $val) = each %fruit) {
print "$key : $val\n";
}
purple : grape ←表示される
yellow : banana
red : apple
 
delete (特定の要素を取り除く)
変数によるキーを指定することで、そのキーと値のペアをハッシュから削除します
# 要素を削除(yellow - banana の要素)
my %fruit = (red => "apple", yellow => "banana", purple => "grape");
delete $fruit{yellow};
# 残りの要素を全て展開
while ( my ($key, $val) = each %fruit ) {
print "$key : $val\n";
}

purple : grape ←表示される
red : apple
ちなみに、上記のdelete関数は特定の要素を削除する場合ですが、全要素を削除する場合には、空リストを代入すると、全要素が削除されます。
%fruit = ();  または、 undef %fruit;
ただし、上記の場合中身が空ですが、定義値のままです。 もし、未定義値にしたい場合には、undef関数を使用します
undef %fruit;
 

hashのkey delete value使い方


ページトップへ▲

ハッシュスライス

perl

ハッシュスライス
%age = (tom => 21, mike => 19, kent => 25, nancy => 17);
@age{ qw(tom mike kent nancy) } = (21,19,25,17);

qw演算子は一覧の文字列を空白文字(スペースや改行、タブ)を区切りとして分割したリスト作成。

qw/ 対象となる文字列 /

例えば「東京 大阪 名古屋 福岡」のような場合、
qw/ 東京 大阪 名古屋 福岡 /

次の記述と同じ役割。
('東京', '大阪', '名古屋', '福岡')

qw演算子で指定した文字列はシングルクォートで囲まれたものとして扱われる。

また/の代わりにqw(   )、qw{   }、qw[  ]、qw< >でも良い。

# kentとnancyの年齢を取り出す
my @data = @age{ qw(kent nancy) };

 

qw
qw

ページトップへ▲

表現方法

シングル、ダブル組合せ
良否

理由

× 'aaa's bbb' シングルクォートの中にシングルクォート文字が有る
'aaa\'s bbb' シングルクォート文字をエスケープすることで使用可
× "aaa "bbb"ccc" ダブルクォートの中にダブルクォート文字が有る
"aaa\"bbb\"ccc" ダクォートブル文字をエスケープすることで使用可
'aaa"bbb"ccc' シングルクォートの中でダブルクォート文字は使用可
"aaa's bbb" ダブルクォートの中のシングルクォート文字は使用可

【数値の表示】
種類 表現    
整数 123 $v0 = 1234; 1234
小数 123.4 $v1 = 123.4; 123.4
指数 1.23E2 $v2 = 1.23E2; 123
8進数 01234 $v3 = 01234; 668
16進数 0x1234 $v4 = 0x1234; 4660

合計計算は次式となる。 ⇒ print "$v0+$v1+$v2+$v3+$4";  ⇒ 6808.4



ページトップへ▲

◇ ローカル変数とグローバル変数

  グローバル変数: プログラム(スクリプト)全体で参照可能な変数。
  ローカル変数: サブルーチンなどのブロックの中だけで利用可能な変数。

  変数は、初期値としてはグローバル変数となるので、特に何も定義をしない変数はすべてグローバル変数とみなされる。

グローバル変数 :our 
  ブロック外で宣言した変数(そのプログラム内のすべての場所が有効範囲)
our を宣言するとグローバル変数になる。

  ローカル変数を宣言する関数として、local と my の2つがあり、この2つの関数には次のような特性と相違が存在する。

ローカル変数 :my 
宣言したブロック{ }の範囲内、および、その 宣言したブロック{ }の範囲内にある入れ子になっている{ }の場合にも、有効範囲となり、宣言された変数の値は変更、維持される。
しかし、入れ子になっている{ }の中で、再び変数が宣言されれば、外側のブロック{ }影響を受けず、上記と同様に、再び変数が宣言されるまで、その変数の有効範囲となる。
その有効範囲が外れた場所では、その外側のブロック{ }影響下に再度戻り、下位にある宣言したブロック{ }が無いと同じふるまいとなる。

myの使い方1(スコープ)

 サブルーチンでのブロック{ }の場合は、上記と異なり、宣言した変数はそのブロックの内部で有効であり、そのブロック内で呼び出されているサブルーチン内では、無効、また、入れ子のサブルーチンで宣言しても、そのブロック内で有効だけであり、更に下位の、入れ子のブロック内は、一番外側と同じ扱いになる。
つまり、その宣言したブロック以外に影響を与えることが出来ない。

ページトップへ▲

myの使い方2(サブルーチン)

ページトップへ▲

ローカル変数 :local 
  宣言したブロック{ }の範囲内、および、その 宣言したブロック{ }の範囲内にある入れ子になっている{ }の場合にも、有効範囲であり、宣言された変数の有効範囲となる。
  入れ子になっている{ }の中で、再び変数が宣言されれば、外側のブロック{ }影響を受けず、上記と同様に、再び変数が宣言されるまで、その変数の有効範囲となる。
  その有効範囲が外れた場所では、その外側のブロック{ }影響下に再度戻り、下位の宣言したブロック{ }が無い場合と同じふるまいとなる。 myと同じ。

localの使い方1(スコープ)

 サブルーチン内での宣言の場合は、宣言した変数はそのブロックの内部および、そのブロック内で呼び出されているサブルーチンで有効である。

localの宣言の上位にある サブルーチン内では、localの宣言のある、サブルーチンがないかのように、値があつかわれる。つまり、その宣言したサブルーチンより、上位に影響を与えることが出来ない。

localの使い方2(サブルーチン)

ページトップへ▲

localの使い方3(サブルーチン)

my

レキシカルスコープ宣言  静的スコープ(構文スコープ)(myで宣言された変数)
  スコープの中で宣言された変数は、そのスコープ内でしか参照することができない。
  その値はスコープが終わった時点で解放される。
  localのように、サブルーチンから呼び出されたサブルーチンからも参照することはできない

{
my $num = 1;
print "$num\n"; # 参照できる
}
#print $num; # この位置では参照できない(strict構文を入れるとエラー発生)

our

グローバル宣言 レキスカルスコープ
our宣言した変数はグローバル変数としてプログラム全体に対して定義されプログラムのどこからでもアクセスできるが、永続的に変数の値が残る。

スコープの内部で宣言されたパッケージ変数(ourで宣言された変数)は、そのスコープの中では部分名で参照できる。スコープの外から参照するには完全修飾名を使用する必要がある。

package Foo;
{
our $NUM = 1;
print "$NUM \n"; # 部分名で参照できる
}
#print $NUM,"\n"; # 部分名では参照できない
print $Foo::NUM,"\n"; # 完全修飾名で参照できる

local

グローバル宣言  ダイナミックスコープ=動的スコープ
local宣言した変数は,同名のグローバル変数 (サブルーチンやフォーマット宣言された変数)の値をスコープ内にいる間だけ一時的に書き換え、また、宣言されたサブルーチンから呼び出されたサブルーチンからは参照が可能。
この変更された値は、スコープの最後で元に戻ります。

our $NUM0 = 1;
{
local $NUM0 = 2;
print "$NUM0\n"; #2
}
print "$NUM0\n"; # この位置では1に戻る

☆ localは、パッケージ変数の値の一時的な変更にだけ利用して、昔のように変数宣言には使わないようにしましょう。
つまり、$::sail と $main::sail は等価になります。

HP 参考

ページトップへ▲

スコープ

Perlのスコープは「{」で始まり「}」で終わる。
{
# スコープ
}

レキシカルスコープ ダイナミックスコープ

レキシカルスコープの場合コードの実行前、
コード中で変数を宣言した時点の情報からスコープが決まる。
たとえばブロック単位のスコープを採用する言語の場合、
静的なコードの時点でのブロックの入れ子の状態から、
各変数のスコープが決定する。

一方ダイナミックスコープは実行時にスタックをたどり変数を探すので、
コードの呼び出し順に応じてスコープが決まる

 

\nは改行です。但し、これはHTMLソースファイル上での改行です。コマンドプロンプトの場合は、改行する。

WEB画面では、改行にならない。<br>が必要。

表示上で改行する場合は<br>を使います。

パッケージ

名前空間をパッケージと言う。デフォールトのパッケージは main パッケージ。
ファイルのなかにパッケージ宣言(package ...)の行があると、
それ以降に書かれた「グローバル」変数(our 変数)やサブルーチンは、
そこで宣言されたパッケージのものになる。パッケージの及ぶ範囲(スコープ)はつぎに又、別のパッケージ宣言が来るまで続く。
但しパッケージ宣言がブロック {...} のなかで為された場合は、そのブロックが閉じたところでパッケージのスコープが消え、その前のパッケージに戻る。

ourの使い方

ourはレキシカルスコープを持つ。
myとの大きな違いとして,以下の2つがある。
1.スコープを抜けて、もう一度同じスコープに入ってきたときに、
前の値を保持している
2.パッケージ名前空間を利用できる

サンプル
サンプル
HP : オブジェクト指向パール

Perl: モジュール化(クラス化)してオブジェクト指向プログラミング

クラス(モジュール)を作成し、サブクラスをさらに作成するサンプル。
モジュールは拡張子 .pm になる。
サンプルプログラム

ページトップへ▲



◇ for & foreach & while & until & do

perl javascrip
for ()
for (初期値; 条件; 増分) {
last; #// ループ脱出
next; #// 次のループへ
}
for (初期値; 条件; 増分) { last; // ループ脱出 }
for(my $i=0; $i<= $#aaa; $i++) {
print "$i, $aaa[$i]\n";}
xx=new Array(3);
xx[0]="A"; xx[1]="B"; xx[2]="C";
for(i in xx) {document.write(xx[i]);}
for(0..$#aaa) {
print "$_, $aaa[$_]\n";}
 
for(0..(@aaa-1)) {
print "$_, $aaa[$_]\n";}
 
for(@aaa) {
print "$_\n";}
 
for $x (0 .. 3) {
for $y (0 .. 3) {
$data[$x][$y] = $x * $y;
}
}
for $x (0 .. 3) {
for $y (0 .. 3) {
print "$data[$x][$y]\n";
}
}
 
foreach ()
foreach $var (@array) {
$_ #// 配列(@array)要素
last; #// ループ脱出
next; #// 次のループへ
}
$varは 省略可。省略した場合は特殊変数 $_ に代入される。
 
foreach $tmp (@MAIL) {
print "$tmp \n";}
 
foreach (@MAIL) {
print "$_ \n";}
 
foreach $tmp (0..$#MAIL) {
print "$tmp,$MAIL[$tmp] \n";}
$#MAILは、要素数-1
foreach $var (keys %param) {
print "$var $param{$var} \n";}
 
foreach $var (sort(keys %param)) {
print "$var $param{$var} \n";}
キーがソートされる
foreach $j (sort keys %{$a{'C'}}) {
print "\$a{C}{$j}=$a{'C'}{$j} \n";
}
 
foreach $i (sort keys %a) {
foreach $j (sort keys %{$a{$i}}) {
print "\$a{$i}{$j}=$a{$i}{$j} \n";}
print "\n";}
 

$ref_a = [10, 20, 30, 40];

foreach $x (@$ref_a) { print $x, "\t"; } for ($i = 0; $i < 4; ++$i) { # 無名配列の各要素を添え字で指定 # $ref_a->[$i] のかわりに $$ref_a[$i] と書いても同じ print $ref_a->[$i], "\t"; }

# foreach で無名配列の全要素を表示
while ()

while (条件) {
条件が真のときループ
last; #// ループ脱出
next; #// 次のループへ
redo if ...; #// ループの先頭へ
}
(例)
while(($key,$value) = each %fruit ){
print "$key : $value \n";
}

while (条件) {
条件が真のときループ
break; // ループ脱出
continue; // ループの先頭へ
}

my %hash = ( 'A' => { 'a' , 1, 'b' , 2, 'c' , 3 },
'B' => { 'd' , 4, 'e' , 5, 'f' , 6 } );

while ( my ($key, $val) = each %{$hash{A}} ) {
print "$key : $val \n";
}

while(1){
処理
if (a==1) { break ; }
} while ( 条件 );

  後判定(どんな条件でも一度は処理を実行)
do {
処理
if (a==1) { break ; }
} while ( 条件 );
until ()
until (条件) {
条件が偽りのときループ
last; #// ループ脱出
next; #// 次のループへ
}
 
$xx = 1;
until ($xx > 10) {
print "xx = $xx\n";
$xx++; }
 
do ()

do {
条件が偽りのときループ
last; #// ループ脱出
next; #// 次のループへ
} until (条件);

ループが一度は必ず実行される

 


参考プログラム

ページトップへ▲

ループ制御 continue; #//ブロックは必ず実行
next; #//
last; #//
redo; #//
break; //ループ脱出
下記で abc が有るとi=0 j=5で終了
入れ子になったループを一度に抜ける
abc:
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (j > 5) { break abc;}
document.write("i="+i+" j="+j);}
}
continue
ループを
スキップし
先頭へ
  for (i = 0; i < 10; i++) {
if (i == 5) { continue; }
document.write(i); }
5 をスキップし 012346789 と表示

abc:
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
xx = i * 10 + j;
if (xx == 55) {continue abc;}
}}
i=5,j=5~9をスキップしてi=6,j=0から実行
abcが無いとi=5,j=5のみをスキップ
exit 脱出 exit; #// Perl 脱出
return; #// 関数脱出
 
switch ()   switch ('c'){
case 0:
month = "1月";break;
case 1:
month = "2月";break;
case 2:
month = "3月"; break;
default:
month = "12月";
}

ページトップへ▲

foreach [$var] (@array) { [statements] }
$var     省略可。省略した場合は特殊変数 $_ に代入される。
@array    必ず指定します。ここで指定された配列が0番から$varに代入される
statements  省略可。 for ($count ; expr ; step) { statements }
$count   カウンターとして使う変数
expr    条件式。これが真の場合のみステートメントが繰り返される。
step    繰り返すことにカウンターに加算する数を指定します。 例題(以下、同じ結果となる)


ダンプ 関数 DUMPER

print Data::Dumper->Dump([$name] , ['$name']);

一つ目の引数は、変数を[ ]でくくってリファレンスにして渡す。
二つ目の引数は、変数名を[] と ''で括って文字列リファレンスとしてわたす。漢字もOK?
変数名の1文字目を*にすると、自動的に*を@等型に合わせて出力してくれる。
配列の内容を見る。使い方のサンプル
プログラム
参考

ページトップへ▲

文字列操作(スカラー 、 スカラー ⇔ 配列 の相互変換)

# 結合

方法 結果
 . を使う my $join1 = 'aaa' . 'bbb';  aaabbb
     
joinを使う my $join2 = join(',', 'aaa', 'bbb', 'ccc'); aaa,bbb,ccc
  joinの第1項 : リストを連結する際の区切り文字(列)  
  joinの第2項 : 連結される文字列からなるリスト値である。
(リスト値は、配列変数を代入しても良い。)
 
     

joinの使用例で、my @a_test = ("aa", "bb", "cc");とした場合の結果は次の通りです。

    結果
コンマで区切る my $join2 = join("," , @a_test); aa,bb,cc
CSVデータの出力 my $join22 = '"' . join('","' , @a_test) . '"' ; "aa","bb","cc"
リスト値を連結 my $join3 = join("" , @a_test); aabbcc


# 分割
my $string1 = "abc,def,ghi"; を以下の様に分割。

戻り値 : 分割された文字列を要素とするリスト

    結果
文字列の分割 my @array2 = split(/,/, $string1); abc def ghi
文字列の分割・複数 @array2 = split(/[,e]/, $string1); abc d f ghi
分割するパターンも含む @array2 = split(/(,)/, $string1); abc , def , ghi
分割数を指定 @array2 = split(/,/, $string1, 2); abc def,ghi


# 長さ
my $length = length 'abcdef';
# 切り出しまたは、置き換え( substr)
切り出す場合
文字列 = substr( 対象の文字列 , 開始点 , 長さ )
・例 my $temp = substr('abcd', 0, 2);   # $temp = ab

置き換える場合
substr( 対象の文字列 , 開始点 , 置き換えられる長さ [ , 置き換える文字列 ] )
・例
$tmp = "abcdefg";
substr($tmp, 0, 2,"123");   # $tmp = 123cdefg

以下は ”長さ” と ”切り出し” の例。
my $tmp ="abc_123";
my $char_len = length($tmp);              # $char_len = 7
my $char_num = substr($tmp,4,$char_len -4);    # $char_num = 123
my $tmp1 ="abc_27";
my $char_len1 = length($tmp1);             # $char_len = 6
my $char_num1 = substr($tmp1,4,$char_len1 -4);   # $char_num = 27

ページトップへ▲

配列の文字操作

関数名解説
追加
unshift 配列の先頭に要素を追加する。
unshift(@hoge,"abc");
push 配列の末尾に要素を追加する。
push(@hoge,"abc");
削除
shift 配列の先頭の要素を取り除く。
$str = shift @hoge;
pop 配列の末尾の要素を取り除く。
$str = pop @hoge;
追加/削除
splice 配列の要素を任意の位置で削除/追加します。
splice(@hoge,-1);
並び替え
sort リストをソートします。
sort @hoge;
sort {$a <=> $b} @hoge; # 数値昇順ソート
sort {$a cmp $b} @hoge; # 文字列の昇順ソート
reverse リスト値を逆順に並び替える。
@page = reverse @hoge;

push, shift , unshift, splice その他
サンプル
push shift説明


ページトップへ▲

◇ サブルーチン

サブルーチンの定義
sub サブルーチン名{
実行する処理;
}

   
サブルーチン名 名前は変数と同じくアルファベット・数字・アンダーバー("_")が使用できます。ただし先頭に数字は使用できませ
プログラム中のどこで定義する場所 プログラム中のどこで定義しても構いません。一般的にはプログラム内の先頭や最後にまとめて定義する。

サブルーチンは呼び出し元と同じファイル内でなくても問題ありません。 別ファイルにあるサブルーチンは、do 、 require 、 use で取り込むことが可能。
サブルーチンの呼び出し & サブルーチン名
  変数をサブルーチンなどのブロック内だけに通用させるようにする必要がでてきます。これを局所化といいます。
グローバル変数 プログラム(スクリプト)全体で参照可能な変数
ローカル変数 サブルーチンなどのブロックの中だけで利用可能な変数
  ローカル変数として定義する場合には、local または my を使用します
引数の渡し方 ・ $x1=12; $x2=35; $x3=68;
&abc($x1,$x2,$x3);

・ @list=(12,35,68);
&abc(@list); (引数 @list を渡す)

・ @listの内容、例えば、@list=(12,35,68);を直接入れる。
&abc(12,35,68);
引数の受取り方 ・  @_ で、引数を受け取る( スカラーに代入 )。
  my ($x, $y, $z) = @_;
  my @abc = @_;

・ shiftで受け取る。
  $x=shift;  $y=shift;  $z=shift;

・ $_[0] 、 $_[1] 、 $_[2]で受け取る。
  $x=$_[0];  $y=$_[1];  $z=$_[2];
戻り値の戻し方 ・ return($total,$mean)

・  my @asdf = ($total,$mean);
  return @asdf

・ returnを省略 ⇒ 最後に評価された結果が戻り値
戻り値の受取り方 ・ @list = &abc;
@listは、$list[0]、 $list[1] として使用。

・ my($total,$mean)=&abc; 直接、値を受ける。

サンプルプログラム

添え字例

呼び出し例

上記解説

HP : オブジェクト指向プログラミング

メイン point.pl モジュール Point.pm モジュール Point3D.pm

ライブラリーの使い方

メインlib_test0.pl
ライブラリー liblary.pl

ページトップへ▲

サブルーチンはいつ実行されるか

Perlのプログラムは処理を記述した順に上から下へ順に実行されていきますが、サブルーチン内に記述された処理はプログラム内からサブルーチンを呼び出さない限り実行されません。

JavaScript 外部ファイル
下記の様に拡張子が .js のファイルを作成し、
♪ // ← コメント ♪ <script>、<!-- 、// -->.js ← ファイル記述しない
(例)
test.js
-------------------------------------
// JavaScript Document
function ohayou() {
window.alert("Hello!");
}


---------------------------------------

HTMLファイルの中で
○呼び出し方法(<head>~</script>内に下記記述)
<script type="text/javascript" src="test.js">
○実行方法(<body>~</body>内に下記記述)
<input type="button" value="OK" onclick="ohayou()">
暗黙的に、引数はリストとして、特殊変数 @_ に代入されています。
@_ から引数を取り出して、変数に格納するには、以下の方法があります。

ページトップへ▲

CSVリストの表示例

読み込んだファイルを表示する方法。 データは my @list = <FH>; で読み込んだ。
データはCSV形式。

出力 出力方法
リスト全部 print "@list\n";
項目区切り for(my $i=0; $i<= $#list; $i++) { print "$i, $list[$i]<br>\n"; }
  for(0..$#list) { print "$_ , $list[$_]<br>\n"; }
  for(0..(@list-1)) { print "$_ , $list[$_]<br>\n"; }
  my $i=0; for(@list) { print "$i, $_<br>\n"; $i++; }

 

CSVファイルから読み込み配列を作る。
stock_utf8.txtを読み込みファイル名:stock_utf8.csvに変更する。
データサンプル3-1 プログラムサンプル3-2

ページトップへ▲

◇ ファイル操作

open( FILEHANDLE, ”EXPR” )
open( FILEHANDLE, ”MODEEXPR” )
open( FILEHANDLE, ”MODE EXPR” )
open( FILEHANDLE, ”MODE:文字コード” , ”EXPR” )
モードはファイル名に含めて記述することも、別に指定することも出来る。MODEEXPRの間にブランクが無くとも良い。また、MODEが省略されている事がある。

パラメータ:
FILEHANDLE ファイルハンドル
(全て大文字で名前を付けることになっているらしい)
EXPR ファイル名
MODE モード
:文字コード 扱うファイルがShift-JIS、utf-8などの種類を指定。

戻り値:
ファイルを開くことに成功したら真(true)、失敗したらundef。

<モード指定>

記号 モード データ書込み ファイル存在 ファイル無し
< 読み込み専用   変更無し エラー
> 書き込み専用 新規書込み 既存データ消去 新規作成
>> 書き込み専用 末尾に書込み 変更無し 新規作成
+< 読み書き両用 上書き 変更無し エラー
+> 読み書き両用 新規書込み 既存データ消去 新規作成
+>> 読み書き両用 末尾に書込み 変更無し 新規作成

ファイルが正常に開かなかった場合(undef)の対策

if ()if や or どの記述方法でも良い。 if ( !open(DATAFILE, "data.txt") ) { die("error :$!"); }
or「or」演算子は左辺の式をまず評価。 左辺が真の場合は右辺は評価せずに次の行へ進む。左辺が偽の場合は右辺実行する open(DATAFILE, "data.txt") or die("error :$!");
   
if () open(DATAFILE, "data.txt") or print "file not exist<br>\n";

ファイルの読み書き操作

読み込む時 $count = <FH>;

複数行の場合は
 while(my $count = <FH>) { print "$count<br>\n"; }
書き込む時 print FH 'ASD', "\n";
$data = '123'; print FH "$data\n";
@key_list = (10,20,30); print FH "@key_list\n";

参考資料

☆ファイルの読み込みだけを行う。
open (FH, "file")  または、open (FH, "< file")
 読み込み専用。 サンプルは、Shift-JISで書かれたファイルを読み込み表示する。プログラムはUTF-8で記述されている。読み込むファイルがUTF-8で記述されている場合は、 プログラム内で記述されている encoding(cp932) が不要である。
サンプルプログラム  データ(Shift-JIS)

☆ファイルへ書き込みを行う。対象ファイルの内容は消去さる。
・ open(FH,"+> data.txt");  +> を使う。
対象ファイルの内容を消去後、書き込んだ内容を表示する事。 ただし、書き込みでポンター位置が最後になるのでポインターを先頭にすること。
サンプルプログラム

・ open(FH,"> data.txt");  >を使う。
この場合は書き込んだ内容、表示不可。
サンプルプログラム

☆ファイルの最後尾に、追加書き込みを行う。ファイルの内容は消去されない。
・ open(FH,"+>> data.txt"); +>>を使う。
 読み込み可能。ただし、ポンター位置を先頭にする必要あり。
サンプルプログラム

・ open(FH,">> data.txt");  >>を使う。
この場合はファイルから読み込み不可。
サンプルプログラム

☆ファイルへ上書きを行う。ファイルの内容は消去されない。
・ open(FH,"+< data.txt");  +< を使う。
ファイルの先頭から書き込む。読み込み可能。
サンプルプログラム

ページトップへ▲


◇ 文字コード変換 (ファイルの読み書きなど)

〇 ファイルからテキストデータを読み込む場合には、ファイルの文字コードをPerlの内部的な文字コードに変換する必要がある。

〇 ファイルへテキストデータを書き出す場合はPerlの内部的な文字コードからファイルで使用する文字コードへ変換する必要がある。

☆ open プラグマ
全ての入力、全ての出力、又は全ての入出力に対してまとめて文字コード指定する方法
use open IN => ":encoding(文字コード)";  入力の文字コードを指定。
use open OUT => ":encoding(文字コード)";  出力の文字コードを指定。
use open IO => ":encoding(文字コード)";  入出力の文字コードを指定。

文字コードの指定方法
UTF-8の場合は「:utf8」
その他の場合は「encoding(euc-jp)」、「encoding(cp932)」(Shift-JIS)など。

サンプルプログラム (Shift-JISファイル読み込み、UTF-8書き込み)
読み込みデータ(shiftJIS.txt)
サンプルプログラム (UTF-8ファイル読み込み、Shift-JIS書き込み)
読み込みデータ(Utf_8.txt)

☆ open関数の引数に指定する
個別に文字コードを設定する。"モード:文字コード"の文字コードに設定する。
open(ファイルハンドル名, "モード:文字コード", "ファイル名");
例として、
open(DATAFILE, ">:encoding(cp932)", "dataout.txt");

シフトJISで書かれたファイルを読み、 UTF-8に変換してファイルを書き込む。更に、 書き込まれたUTF-8ファイルを読み込み、変換してシフトJISのファイルを作る。
サンプルプログラム
読み込みデータ(shiftJIS.txt)

•PerlのスクリプトがUTF-8で書かれていることを示すために、 use utf8;をスクリプトの初めに入れる。こうしておけば、検索の文字として 日本語なども使える。

☆ 読み書きをするファイルが全てUTF-8の場合
「UTF-8」に設定されたファイルから読み書きを行う場合には、プログラムの中に
use open ":utf8";
を入れる。

以下のプログラムはコマンドプロンプトでのみ作動。
サンプルプログラム (UTF-8ファイル読み込み、UTF-8書き込み)
サンプルプログラム (UTF-8ファイル読み込み)
読み込みデータ(Utf_8.txt)

☆ 標準入出力の場合
UTF-8でプログラムを書いた場合、Windows環境では、キーボードから文字を入力したり、画面に出力する時にはシフトJISを使用するために、以下3行が必要となる。
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

参考プログラム
この参考プログラムは、html表示は無く、コマンドプロンプトでのみの作動となる。

標準入出力

STDIN キーボードやパイプ/リダイレクトなどからの入力。
STDOUT 画面やパイプ/リダイレクトなどへの出力。
STDERR エ画面やパイプ/リダイレクトなどへの出力。
STDOUTとの違いは、エラー発生時に使用。

・明示的にSTDOUTを指定しなくても、print関数はデフォルトで、STDOUTに出力を行う。
・標準出力、標準エラー出力の両方がディスプレに出力する。
・結果をファイルにリダイレクトすると、標準エラー出力が、ディスプレイに表示される。
(perl XX.p l> YY.txtとすると、標準出力は、YY.txtに、エラー出力はディスプレイに表示)

ページトップへ▲

Encode - <日本語などのマルチバイト文字列を処理する>
日本語などのマルチバイト文字をPerlで適切に扱うにはEncodeモジュールを
使用する。

1.外部から入力された文字列はEncodeモジュールのdecode関数でデコードする
2.外部へ出力する文字列はEncodeモジュールのencode関数でエンコードする
3.ソースコードはUTF-8で保存しutf8プラグマを有効にする

この解説では
外部から入力された文字列のことを
「バイト文字列」

「バイト文字列」
「UTF-8バイト文字列」
「Shift_JISバイト文字列」
が特定の文字コードで記述されている場合

Perlの内部表現に変換された文字列を
「内部文字列」

と呼ぶことにします

〇デコードとは「バイト文字列」を「内部文字列」に変換する処理

decode関数の
第1引数にはバイト文字列の文字コード
第2引数にはバイト文字列
を指定します。
戻り値は内部文字列になります

use Encode 'decode';

# 外部からの入力(コマンドライン引数)
my $str = shift;

# バイト文字列(外部からの入力)を内部文字列に変換($strがUTF-8の場合)
$str = decode('UTF-8', $str);

# バイト文字列(外部からの入力)を内部文字列に変換($strがShift_JISの場合)
$str = decode('Shift_JIS', $str);

 

 外部へ出力する文字列は
Encodeモジュールのencode関数を使用してエンコードします。
エンコードとは「内部文字列」から「バイト文字列」に変換する処理
のことをいいます。

use Encode 'encode';

# 内部文字列をUTF-8バイト文字列に変換する場合
$str = encode('UTF-8', $str);

# 内部文字列をShift_JISバイト文字列に変換する場合
$str = encode('Shift_JIS', $str);

 

マルチバイト文字を扱う上でもうひとつ気にする必要があるのは
ソースコードの中に記述する文字列です。
もし
日本語などのマルチバイト文字をソースコードの中で記述する必要
があるならソースコードはUTF-8で保存してください。

# ソースコードはUTF-8として保存
# utf8プラグマを有効にする
use utf8;

my $str = "日本語などを書く。";

ソースコードの中に書かれた文字列のことを文字列リテラルと呼びます。
覚えておいて欲しいことは
文字列リテラルの文字コードはソースコードの文字コードと同じになります。
ソースコードをUTF-8で保存すれば文字列リテラルはUTF-8バイト文字列となり、
Shift_JISで保存すれば文字列リテラルはShift_JISバイト文字列となります

utf8プラグマというのは
ソースコードに書かれたUTF-8バイト文字列を内部文字列に変換する効果
があります。
つまり
ソースコードをUTF-8で保存してutf8プラグマを有効にすれば
文字列リテラルは内部文字列に変換されます。
その上でutf8プラグマを有効にします。

HP 参考

全ての入力、全ての出力、又は全ての入出力に対してまとめて文字コード指定する方法
use open IN => ":encoding(文字コード)";  入力の文字コードを指定。
use open OUT => ":encoding(文字コード)";  出力の文字コードを指定。
を使用して、入力ファイルを読み、編集して出力する。
サンプルプログラム(en_decode_p0.txt)
 ShiftJISデータ(shift_data_csv.txt) UTF8データ(utf8_data_csv.txt)

サンプルプログラム(en_decode_p1.txt)
このプログラムのデータは、上記を使う。use Encode; decode  encode を使用した例。
未完成。

#--------------------------------------------------------
# ファイル($file_name)からのデータ(@kabu_lines)の読み込み
#--------------------------------------------------------
sub read_stock_data_file {
@kabu_lines = ();

ページトップへ▲

ファイルを読む場合、ロックする場合


if (-e $file_name) {
open(IN,"$file_name");
flock(IN,2);
@kabu_lines = <IN>;
flock(IN,8);
close(IN);
}
}

◇ seek

seek (ファイルハンドル、オフセット、起点);
ファイルポインタの位置を操作する命令。

パラメータ :
オフセット: この与え方によってはうまくいかない。?
 オフセットは起点からのバイト数(文字数と考えても良い)。
起点 :
 0=ファイルの先頭、1=現在のファイルポインタ位置、2=ファイルの末尾。

◇ truncate  stat
指定したファイルのサイズになる様に、後部から削除してサイズを変更する。

truncate ファイルハンドル , 値1
ファイルハンドル : サイズを変更する対象となるファイルに関連付けられたファイルハンドル
値1 : 指定するファイルサイズ

truncate 式1 , 値1
式1 : 変更対象となるファイル名を返す式
値1 : 指定するファイルサイズ
参考プログラム

◇ tell
ファイルハンドルの現在位置を返す。

戻り値1 = tell
戻り値1 : 最後に読み込んだファイルの読み込み位置

戻り値1 = tell (ファイルハンドル )
戻り値1 : ファイルハンドルの現在位置
ファイルハンドル : 対象となるファイルハンドル

join split length substr index

参考プログラム

◇ split
split( /PATTERN/ , EXPR , LIMIT )
指定したパターンに従って文字列を分割。

パラメータ :
/PATTERN/ :
 分割パターン文字列。 省略した場合は1個以上の空白文字(スペース、タブ、改行)を表す「/¥s+/」を指定した場合と同じ。
EXPR :
 対象の文字列。省略した場合には、「$_」が指定されたものとして扱われる。
LIMIT :
分割の最大数。分割が指定した最大数に達すると、それ以上の分割はしない。
省略された場合は無制限
戻り値 :
 分割された文字列を要素とするリスト

◇ chomp
chomp(VARIABLE)
対象の文字列の末尾が改行文字の場合には、改行文字が削除される。

※末尾の文字を無条件で削除する場合は「chop関数」を使用。

パラメータ : VARIABLE 対象の文字列 (省略された場合は変数「$_」が使用される。)
戻り値 : 削除された文字数

削除される改行文字は特別な変数「$/」に設定されている値によって異なります。
具体的には次のように記述します。
my $src1 = "abc\n";
chomp($src1);
my $src2 = "abc";
chomp($src2);
この場合、変数「$str1」に格納されていた「abc」から末尾の「\n」が削除され変数「$str1」に
「abc」が格納されます。また変数「$str2」に格納されている値には改行文字が含まれませんので、
chomp関数を呼び出しても変数「$str2」に格納されている値に変化はありません。

chomp関数は、スカラー変数ばかりではなく、配列に対しても使用できます。
引数に配列を指定することで、その配列の全ての要素から、末尾の改行を取り除くことができます。

my @color = ("blue\n", "green\n", "red");
print "@color\n"; #改行がおきる
chomp(@color); # 改行文字「\n」が削除される
print "@color\n"; #改行がおきない

;


☆ ファイルの読み書き例 (アクセスカウンター)

ファイルアクセス回数記録をcounter.txtに読み書きする。

☆ 連想配列とファイル(csv形式)を使ったデータベース

下表の数値を用い、回数を のように表示する。
サンプル

flock(OUT, 2); # ロック確認。ロック
chomp($count = ); #行末の改行文字を削除する

seek(OUT, 0, 0); # ファイルポインタを先頭にセット

truncate(OUT, tell(OUT)); # ファイルサイズを書き込んだサイズにする
close(OUT); # closeすれば自動でロック解除
#※truncateは
アクセスカウンター等でサイズが増えても減ることはない場合には、
truncateは必要ないです。

ページトップへ▲

参考 http://codezine.jp/article/detail/904?p=2

whileループの中で、$count{都道府県名}++のように都道府県ごとにカウントアップし、累計値を求めています。 例えば、ファイルからの読み込みが終わった後の%countの内容は、次のようになっています。

ハッシュの中身
$count{'北海道'} => 745
$count{'神奈川県'} => 2587
$count{'沖縄県'} => 487

 

サンプルプログラム カスタマーデータ(CSV)(要:属性をtxt⇒csvに変更)

◇ if

perl javascrip

if (条件式) { 実行文;}
実行文が1行でも{ } で閉じる必要有り

if (条件式) { 実行文;}
実行文が1行の時は{ } で閉じる必要無し
if (条件式) { 処理Aの実行文;
} else { 処理Bの実行文; }
同左
if (条件式A) { 処理Aの実行文;
} elsif (条件式B) {処理Bの実行文;
} else { 処理Cの実行文;}
if (条件式A) { 処理Aの実行文;
} else if (条件式B) {処理Bの実行文;
} else { 処理Cの実行文;}
perlとの違いは、elsif と else if
<代入変数> = <条件式> ? <真> : <偽> ;
$xx=($yy < 5) ? "small" : "big";
 


参考プログラム

ページトップへ▲


正規表現(せいきひょうげん、regular expression)

文字列の集合を一つの文字列で表現する方法の一つの名称であるが、 アプリケーションソフトやプログラミングにおいては、 正規表現を用いた文字列のパターンマッチを行う機能のことを、正規表現という。
(メタ文字:特別な意味を持たせた文字のこと)

パターンマッチ

 パターンマッチとは正規表現で表した文字の集合が対象の文字列に含まれているかを調べる操作のことをいいます。 パターンマッチを行うにはパターンマッチ演算子を使用します。


演算子比較
     
パターンマッチ演算子 m/マッチパターン/ パターンマッチ
置換演算子 s/マッチパターン/置換文字列/ 文字列の置換
変換演算子 tr/対象リスト/変換リスト/  
     

 

結合演算子 ( =~ )の使い方。

 

パターンマッチ演算子

「$str」に格納されている値が、「=~」演算子の右側に記述されているパターンとマッチしているかどうかを評価し、マッチしていればif文の条件式は真(true)となります if ($str =~ /e/){
左辺の値がデフォルト変数「$_」の場合、左辺の変数と結合演算子を省略することが可能です

if ($_ =~ /e/){

if (/e/){

置換演算子 $dataの中のabcをxyzで書き換える

$data =~ s/abc/xyz/

     

パターンマッチ演算子を使用

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

print "入力して下さい\n";

while(<STDIN>){
if (/qwe/){
print "一致しました。終了します\n";
exit(0);
}
print "入力して下さい\n";
}



パターン結合演算子
     
!~ (使用例)
$word = 'apple';
if ($word !~ /b/) { print "含まれていません。<br>\n";}
「文字列」の中に「パターン」が含まれていなければ真

$` = , $& =  , $' =
(使用例)
$word = 'apple';
$word !~ /b/;



置換演算子を使用

#!/usr/local/bin/perl
use strict;
use warnings;

print "Content-type: text/html; charset=utf-8\n\n";
print "\n";
print "<html>\n";
print "<head>\n";
print "<title>CGIのテスト</title>\n";
print "</head>\n";
print "<body>\n";
print "u------------------\n<br>";

my $word = "This is a pen. That is also a pen.";
print "処理前 $word\n<br>";
$word =~ s/pen/book/;
print "処理後 $word\n<br>";

print "d------------------\n<br>";
print "</body>\n";
print "</html>\n";

置換は1度だけ。2つ目の、penは置換されていない。




修飾子(マッチ/置換/変換 演算子のオプション)

 

  マッチ置換変換

c

g と併せて使用し、失敗時の位置リセット禁止
m
  

c

対象リストに含まれないものを変換   
tr

d

変換リストに含まれないものを削除   
tr
e 置換文字列を式とする  
s
 
g マッチするものすべて
m
s
 
i 大文字、小文字の区別なし
m
s
 
s 単一行マッチ。文字列を単一行として扱う。
(ワイルドカードのドット( . )が改行にもマッチするようにする)
m
s
 

s

連続文字を 1 文字に変換   
tr
m 複数行マッチ。文字列を複数行として扱う。
m
s
 
o PATTERNの評価を 1回だけにする(変数展開を1回行う)
m
s
 
x 空白を無視、# をコメント処理。拡張正規表現を使用。
m
s
 

置換演算子には、置換えを行う際のオプションとして、次の修飾子が用意されています。

修飾子 内容
g 繰り返しマッチする (global)
i 大文字と小文字の区別をしない (case-insensitive)
m 文字列を複数行として扱う (multi-line)
o 変数展開を1度だけ行う (only once)
s 文字列を単一行として扱う (single line)
x 拡張正規表現を行う (extended)
e 置換文字列を「式」と見なす (evaluation)

(g修飾子の例)
$word = 'aaaa';
$word =~ s/a/A/;
print "$word\n";

> Aaaa
$word = 'aaaa';
$word =~ s/a/A/g;
print "$word\n";

> AAAA

(e修飾子の例)
$word = "this is 100 yen.";
$word =~ s/(\d+)/$1 * 2/e;
print "$word\n";

> this is 200 yen.


メタ文字

メタ文字

 

例(○マッチする)

例(×マッチしない)

^

文字列の最初にマッチ apple
/^a/,/^ap/,/^app/,/ple/
^[0-9,a-z,A-Z]←最前部は"数値、アルファベット" (1文字)
apple
/^p/, /^pp/, /^ape/, /^ple/

$

文字列の最後にマッチ apple
/ple$/, /e$/
[a-z,A-Z]+$← 最後尾はアルファベット(1つ以上)
apple
/pl$/, /app$/

+

1回以上の
連続する文字
c+ ← cが1個以上
go+gl    ⇒ gogl ,googl ,gooogl
img[0-9]+ ⇒ img2 ,img5678
[0-9a-zA-Z_\.-]+ ← []内のいづれかが1つ以上あれば良い
[0-9a-zA-Z_\.-:]+ ←:が入るとうまく機能しない。理由不明?
[-\w=:]+ ⇒ abcEDFG-1:3000
\w{4}\w{3}-1:3[0-2]{3} ⇒ abcEDFG-1:3000
\w{4}\w{3}-\d+:\w+ ⇒ abcEDFG-1:3000
go+gl  ⇒ ggl ,go0gl

*

0回以上の
連続する文字
c* ← cが0個以上
go*gl ⇒ ggl ,gogl ,googl ,gooogl
img[0-9]* ⇒ img ,img2 ,img5678
go*gl    ⇒ gl ,go0gl

?

0回、または
1回だけの文字
c? ← cが0個または1個
colou?r ⇒ color ,colour
img[0-9]? ⇒ img ,img2
colou?r ⇒ colouur

{n}

直前の文字がn回 さかな{2} → 「さかな
(さかな){2} → 「さかなさかな
ap{3}le → appple
ap{2}le → ale , aple

{n,m}

直前の文字が
n回以上、m回以下
ap{1,2}le → aple,apple
[0-9]{1, 2} → 0 ~ 99
ap{1,2}le → ale, appple

{n,}

直前の文字が
n回以上
ap{1,}le → aple , apple , appple ap{1,}le → ale

[ ]

[ ]内のいずれか
の1文字
[1234]の様に連続した文字列は[1-4]と表記可能。
c[abc]t → cat , cbt , cct
c[1-3]t → c1t , c2t , c3t

 

.

任意の1文字
(除く改行文字)
a.c → azc , aXc , a1c , a c
.* ← 空白含め、0文字以上
a.*c → ac、abc、ab1c
.+ ← 空白含め、1文字以上
a.+c → abc、ab1c 
img.*[0-9]$ → img0 , imgAS01de5
\. ← .文字(ピリオッド1文字)
img.*[0-9]$ → imgAS01de5f
(最後が数字でない)

|

OR (a(bb|b1|X)c) → abbc,ab1c,aXc  

()

文字列をグループ化 カッコ内のパターンにマッチした文字列は記録されます。
\1,\2,\3または$1,$2,$3でグループ化に
マッチした文字列を参照
これを後方参照と言う。
 

(?:...)

文字列をグループ化

拡張構文
後方参照を行わないグループ化。
\1,\2,\3または$1,$2,$3で参照出来ない。

( ... ) と同様にグループ化します。ただし、後方参照用の記録をしません。

 

(?=式)

  前方一致検索
「 $' = 道路」ならば(後続する文字列が式に一致)マッチ。
$` = 東名 , $& = 高速 , $' = 道路本線
$tt = '東名高速道路本線';
$tt =~ /高速(?=道路)/;
(?!式)   前方一致検索の否定形
「$' = 道路」で無いならば(後続する文字列が式に不一致)マッチ。
$` = 東名 , $& = 高速 , $' = 道路本線
$tt = '東名高速道路本線';
$tt =~ /高速(?!道路)/;
(?<=式)   後方一致検索
「$` = 高速」ならば(先行する文字列が式に一致)マッチ。
$` = 東名高速 , $& = 道路 , $' = 本線
$tt = '東名高速道路本線';
$tt =~ /(?<=高速)道路/;
(?<!式)   後方一致検索の否定形
「$` = 高速」で無いならば(先行する文字列が式に不一致)マッチ。
$` = 東名高速 , $& = 道路 , $' = 本線
$tt = '東名高速道路本線';
$tt =~ /(?<!高速)道路/;
(?ismx)     正規表現内にパターンマッチ修飾子を埋めみます。
部分的に「大文字小文字の区別を行う」などの指定に役立ちます。
部分的にパターンマッチ就職子の効果を与えたいとき、
その部分の前に指定します。
たとえば、 /O(?i)ne/ は、One 、ONE など、O に続く
文字 er の大文字小文字を区別しません。
(?i)修飾子の働きをオフにしたい場合は (?i‐...) のように、
‐ "ダッシュ"記号をつけます。
\t     タブ

\

  メタ文字は、そのままではマッチできないため、
\ を付加し、エスケープする。
メタ文字は \ ^ . $ * ? | ( ) [ ] { }
 

\n

    改行文字




ページトップへ▲

正規表現で使う代表的なメタ文字

略記法

文字クラス

意味

\w [a-zA-Z0-9_] アルファベット、数字、下線
\W [^a-zA-Z0-9_] アルファベット、数字、下線以外
\s [\r\t\n\f] 空白文字(スペース、復帰文字、タブ、改行文字、ラインフィード)
\S [^\r\t\n\f] 空白文字以外
\d [0-9] 数字
\D [^0-9] 数字以外
位置指定子 マッチする場所を指定することが出来ます。これを位置指定子と言う。
\b   単語の境界にマッチする。
\B   単語の境界以外にマッチする。
\A   文字列の最初にマッチする。(Perl5のみ)
\z   文字列の最後にマッチする。(Perl5.005以降)



或る文字で囲まれている部分をピックアップする場合。(?最短一致を使う)
$anlydata =~ s/(<a.*?>)//g;  <a から > の間を削除。
$anlydata =~ s/(<a.*>)//g;  <a から行の終わりまで全て削除してしまう。

マッチ変数を使うとプログラム内のすべての正規表現の処理が遅くなる?ので、注意して使ってください。

マッチ変数の一覧
メタ文字 説明
$` 文字列の中でマッチした部分より前にある文字が入る
$& マッチした部分の値が入る
$' 文字列の中でマッチした部分より後の文字が入る
$+ 最後にマッチした文字列を返す

パターン結合演算子 :「左辺の値から右辺の値を検索する」という意味を持つ。

左辺 =~ /パターン/

マッチした場合は式全体として真(true)を返し、マッチしない場合には偽(false)を返します。


非格納グループ キャッシュされず、後方参照不可  
$tt = "Bin2Hex"; を以下の方法で後方参照した結果  
$tt =~ /(\w+)(?:\d+)(\w+)/; $1=Bin  $2=Hex Bin2Hex
$tt =~ /(?:\w+)(\d+)(\w+)/; $1=2  $2=Hex Bin2Hex
$tt =~ /(\w+)(\d+)(?:\w+)/; $1=Bin  $2=2 Bin2Hex
$tt =~ /(\w+)(\d+)(\w+)/; $1=Bin  $2=2  $3=Hex Bin2Hex



応用例
タグ( < と > で囲まれた部分)を削除 ブランクで置き換える。  
$tt = 'ab<123>cd<456>ef';
$tt =~ s/(<.*>)//g;
実行結果⇒ $tt=abef
$` = ab , $& = <123>cd<456> , $' = ef
$1 = <123>cd<456>
最長のタグを削除
$tt = 'ab<123>cd<456>ef';
$tt =~ s/<.*?>//g;
実行結果⇒ $tt=abcdef
$` = ab<123>cd , $& = <456> , $' = ef
$1 = 値なし
最短のタグを複数回削除
$tt = 'ab<123>cd<456>ef';
$tt =~ s/<.*?>//;
実行結果⇒ $tt=abcd<456>ef
$` = ab<123>cd , $& = <456> , $' = ef
$1 = 値なし
オプションgが無い場合
最短のタグを1回削除
文字列(;)を削除 ブランクで置き換える。  
$str = "qwe;123;zxc;asd;45678;"
$str =~ s/;//g;
実行結果 ⇒ qwe123zxcasd45678
$` = qwe;123;zxc;asd;45678  , $& = ; , $' =
$1 = 値なし
 
郵便番号から-(ハイフン)を取り除く ブランクで置き換える。  
$zip_code = "123-4567";
$zip_code =~ s/(\d{3})-?(\d{4})/$1$2/;
実行結果 ⇒ 1234567
$` = , $& = 123-4567 , $' =
$1 = 123 , $2 = 4567
 
「1」を「01」に置き換える    
$tt = "1112";
$tt =~ s/1/01/g;
実行結果 ⇒ 0101012
$` = 11 , $& = 1 , $' = 2
 
$tt = "1112";
$tt =~ s/1/01/;
実行結果 ⇒ 01112
$` = , $& = 1 , $' = 112
 
大文字、小文字の区別無く、文字列の置き換え    
$tt = "apple APPLE aPPle ApplE";
$tt =~ s/apple/orange/ig;
実行結果 ⇒orange orange orange orange
$` = apple APPLE aPPle , $& = ApplE , $' =  
大文字を小文字にする    
$tt = "abcABC";
$tt =~ tr/A-Z/a-z/;
実行結果 ⇒ abcabc
$` =  ,  $& =  ,  $' =  
$tt='qwrr始値+123.5%asd6789';
$tt =~ m/([-+]\d+\.\d+%)/;
$` = qwrr始値 , $& = +123.5% , $' = asd6789
$1 = +123.5% , $2 =
 
後方参照を利用した検索    
$tt='Myold=35:Redoldcar=5';
$tt = =~ /(\w{2})(\w{3})=\d+:\w+\2/;
/(\w{2})(\w{3})=\d+:\w+\2\1/ ←\1追加も可能
$` = , $& = Myold=35:Redold , $' = car=5
$1 = My $2 = old
後方参照
\2が無い場合
$tt='Myold=35:Redoldcar=5';
$tt = =~ /(\w{2})(\w{3})=\d+:\w+/;
$` = , $& = Myold=35:Redoldcar , $' = =5
$1 = My $2 = old
 
メールアドレスをユーザ名だけに置き換える    
$tt = "abcd\@efghij.com";
$tt =~ s/(.+)@.+/\1/;
実行結果 ⇒ abcd
$` = , $& = abcd@efghij.com, $' =
$1 = abcd $2 =
 
最短一致    
$tt = 'ab<123>cd<456>ef';
$tt =~ m/<.*?>/;
$` = ab , $& = <123> , $' = cd<456>ef
最短一致
$tt = 'ab<123>cd<456>ef';
$tt =~ m/<.*>/;
$` = ab , $& = <123>cd<456> , $' = ef
(通常)
     
$tt='qw始値12as45高値78低値23zx';
$tt =~ m/始値(\d+)\D+(\d+)高値(\d+)/
$` =qw
$& =始値12as45高値78
$' =低値23zx
$1=12 , $2=45 , $3=78
 
$tt = 'apple';
$tt =~ /^(...)(.)(.)/;
$` =
$& =apple
$' =
$1=app , $2=l , $3=e
 
http://が含まれる事をチェック    
$url = 'http://www.abc.html/';
if ($url =~ /http:\/\//) { }
$` = , $& = http:// , $' = www.abc.html/
$1=  , $2= , $3=
 
電話番号チェック    
$tt='01234-5678-90123';
$tt =~ /(^[0-9])([0-9,-]+)([0-9]$)/;
$` = , $& = 01234-5678-90123 , $' =
$1=0  , $2=1234-5678-9012 , $3=3
 
メールアドレスチェック    
$tt='a12_45.-ert@c.er_0-xc.asdDE';
$tt =~ /(^\w)([\w,_,\.,-]+)
@(\w)([\w,_,\.,-]+)\.([a-z,A-Z]+$)/;

後方参照無し
$tt =~ /^\w[\w,_,\.,-]+@\w[\w,_,\.,-]+
\.[a-z,A-Z]+$/;
$` = , $& = a12_45.-ert@c.er_0-xc.asdDE ,
$' =
$1=a ,$2=12_45.-ert ,$3=c ,
$4=.er_0-xc, $5=asdDE
 

ページトップへ▲


◇ 演算子

算術演算子

演算子

jscript perl

内容

使用例

+ 加算 print 25 + 20; →45
- 減算 print 25 - 20; →5
* 乗算 print 25 * 20; →500
/ 除算 print 25 / 20; →1.25
% 余り print 25 % 20; →5
** べき乗 25 ** 3; ⇒ 15625
0.0625**0.5; ⇒ 0.25
. X 文字列連結 print "25"."AA"."20"."\n"; 表示結果→ 25AA20

++ インクリメント $a=5; $a++; ⇒ $a=6
-- デクリメント $a=5; $a--; ⇒ $a=4
..   範囲演算子 foreach (1 .. 5) { ] →(1 ..5)は(1, 2, 3, 4, 5)と同じ。
for (1 .. 5) → for ($_ = 1; $_ <= 5; $_++) と同様
+ X 文字列連結 a="あ"+"い" , a="あ" a= a+"い" , a="あ" a +="い"
&&   論理積 If ($a ==1 && $b==2) { →「$aの値が1で、かつ$bの値が2の場合」と言う意味。
||   論理和 If ($a ==1 || $b==2) { →「$aの値が1か、$bの値が2の場合」と言う意味。
!   論理否定 指定された値の論理否定を求める
?   条件 条件が真なら1つ目の文、偽なら2つ目の文を実行する
, X カンマ 2つの式を続けてに実行する

比較演算子

perl

数値比較演算子

文字列比較演算子

内容

==
eq
等しい(equal)
!=
ne
等しくない
<
lt
小さい
>
gt
大きい
<=
le
以下
>=
ge
以上
<=>
cmp
比較結果を -1, 0, 1 のいずれかで返す
 
=~
正規表現。指定文字列があればtrue
 
 !~
正規表現。指定文字列がなければtrue
 
 !
否定。真のとき偽、偽のとき真

javascript

比較演算子

内容

==
等しい(equal)
!=
等しくない
<
小さい
>
大きい
<=
以下
>=
以上
===
xとyは等しい。型の変更を行わない
!==
xとyは等しくない。型の変更を行わない

代入演算子


 

 

説明

=   代入  
+= x+=y 加算して代入 x=x+y
-= x-=y 減算して代入 x=x-y
*= x*=y 乗算して代入 x=x*y
/= x/=y 除算して代入 x=x/y
%= x%=y 余剰して代入 x=x%y
**=   累乗して代入  
.=   文字列として結合(追加)  

結果

$a = 5; $aに5が格納される。
$a = 5 * 3; $aに5*3の計算結果15が格納される。
$a = $b = 5; または、($A, $b) = 5; $aと$bに同時に5が格納される。
$a = 5 + ($b = 3); $bに3を代入し、$aに8が格納される。
$a = 5 + ($b = 3 + ($c = 2 + 1)); $cに3を、$bに6、$aに11を格納する。

◇二項代入演算子

両側に同じ変数名が現れる場合 ⇒ 右側の変数名を省略可 ⇒ 二項代入演算子

元の式

二項代入演算子

$a = $a + 1; $a += 1;
$a = $a - 1; $a -= 1;
$a = $a * 2; $a *= 2;
$a = $a / 2; $a /= 2;
$a = $a % 2; $a %= 2;
$a = $a ** 2; $a **= 2;
$a = $a . "abc"; $a .= "abc";

ビット演算子

演算子   記述例(perl)   記述例(jscript) 意味
& $a & $b b & b ビットAND
| $a | $b a | b ビットOR
^ $a ^ 10 a ^ b ビットXOR
~ ~$a ~a ビットNOT
<< $a << 2 a << 2 左シフト
>> $a >> 2 a >> 2 右シフト

ページトップへ▲


◇ 演算子

◎例(&) 例(|)例(^)
1011 = 11 1011 = 11 1011 = 11
1110 = 14 1110 = 14 1110 = 14
------------------------ ------------
1010 = 10 1111 = 15 0101 = 5
my $var;
$var = 11; $var = 11;$var = 11;
$var = $var & 14; $var = $var | 14; $var = $var | 14;
10 ⇒ $var 15 ⇒ $var 15 ⇒ $var

◎例(~) 例(<<) 例(>>)
1011 = 11 1011 = 11 1011 = 11
------------------------ ------------
0100 = 4 101100 = 44 0101 = 5
$var = 11; $var = 11;$var = 11;
$var = ~$var; $var = $var << 2; $var = $var | 14;
11..110100 ⇒ $var 44 ⇒ $var 5 ⇒ $var
 
反復演算子

"ABC" x 3 ⇒ ABCABCABC
'07'x 5 ⇒ 0707070707

真偽判断では、(""), (0), ("0")は偽として、それ以外は真として扱われる。 trueや false という特殊な変数がある訳ではなく、return(false)は、"false"という文字列を返すだけである。 真偽を返却する関数を評価する際はif (&samp()) {}と評価する。 変数には定義済みの状態と未定義の状態がある。最初は未定義だが、最初に何か値が代入されると定義済みになる。定義済みかどうかを調べるためには defined()を使用する。
perlには省略の美学というものがあり、いろいろな場面で変数名を省略することができる。省略した場合は、$_ を指定したものとみなされる。

while (<IN>)
while ($_ = <IN>)
print;
print $_;
/^From:/
$_ =~ /^From:/
while () {
if (/^From:/) { print; }
}
while ($exp = ) {
if ($exp =~ /^From:/) { print $exp; }

ページトップへ▲