2006年10月20日

パターンマッチング4(その他のマッチ演算子)

マッチ演算子には「/」を使っていますが、今回は「/」を含んだパターン
を指定する場合です。


■マッチ演算子

m#パターン#

パターンに「/」を含んだ指定をする場合のマッチ演算子の使用方法です。
これは「#]でなくてもかまいません。

例)
m#10/18# ・・・「/」を含んでいるため「/」以外を使う
m%10#18% ・・・「#」を含んでいるため「#」以外を使う
m&10%18& ・・・「%」を含んでいるため「%」以外を使う

ようは、前までの/パターン/というのはm/パターン/のmが省略されていたものです。
「/」の場合のみ省略できます。


サンプルソース(samplematch4.pl)
----------------------------------------------------------------
while (<>) {
  if (m#10/18#) {
    print "○ $_";
  } else {
    print "× $_";
  }
}
----------------------------------------------------------------
読み込みファイル(data4.dat)
----------------------------------------------------------------
2006/10/17
2006/10/18
2005/10/17
2005/10/18
2005/10/19
2011/11/18
----------------------------------------------------------------
実行結果
----------------------------------------------------------------
C:¥>jperl samplematch4.pl data4.dat
× 2006/10/17
○ 2006/10/18
× 2005/10/17
○ 2005/10/18
× 2005/10/19
× 2011/11/18
----------------------------------------------------------------

posted by ごん at 00:06| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2006年10月17日

パターンマッチング3(含まないパターン)

前回までは、指定したパターンを「含む」データを探していましたが、
今回は、「含まない」パターンです。

■パターン結合演算子

スカラー変数 !~ /パターン/

上記のように「!~」を使用します。


サンプルソース(samplematch3.pl)
----------------------------------------------------------------
@data = ('WINDOWS2000', 'windows98','WindowsXP',
'ORACLE8i','oracle9i', 'Oracle10g');

foreach $softname (@data) {
  if ($softname !~ /windows/) {
    print "○ $softname\n";
  } else {
    print "× $softname\n";
 }
}
----------------------------------------------------------------

実行結果
----------------------------------------------------------------
C:¥\>jperl samplematch3.pl
× WINDOWS2000
× windows98
× WindowsXP
○ ORACLE8i
○ oracle9i
○ Oracle10g
----------------------------------------------------------------
windowsを含まないパターンにヒットしいます。

posted by ごん at 22:52| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2006年08月17日

パターンマッチング2(パターン結合演算子)

前回では、マッチ演算子で$_に格納されている文字列に対しての
パターンマッチングでしたが、スカラー変数に格納されている
文字列を対象にパターンマッチグする方法です。

■パターン結合演算子

スカラー変数 =~ /パターン/

上記のように「=~」を使用します。
これをパターン結合演算子といいます。

サンプルソース(samplematch2.pl)
----------------------------------------------------------------
@data = ('WINDOWS2000', 'windows98','WindowsXP',
'ORACLE8i','oracle9i', 'Oracle10g');

foreach $softname (@data) {
if ($softname =~ /windows/) {
print "○ $softname\n";
} else {
print "× $softname\n";
}
}
----------------------------------------------------------------

実行結果
----------------------------------------------------------------
C:\>jperl samplematch2.pl
× WINDOWS2000
○ windows98
× WindowsXP
× ORACLE8i
× oracle9i
× Oracle10g
----------------------------------------------------------------
条件が、「/windows/」と全部小文字になっているので「windows98」
のみ○となっています。「WINDOWS2000」や「WindowsXP」は大文字が
入っているのでヒットしていません。

■大文字と小文字を区別しない

/パターン/i

マッチ演算子にiオプションをつけると大文字と小文字を区別しなくなります。

サンプルソース(samplematch3.pl)
----------------------------------------------------------------
@data = ('WINDOWS2000', 'windows98','WindowsXP',
'ORACLE8i','oracle9i', 'Oracle10g');

foreach $softname (@data) {
if ($softname =~ /windows/i) {
print "○ $softname\n";
} else {
print "× $softname\n";
}
}
----------------------------------------------------------------

実行結果
----------------------------------------------------------------
C:\Perlgo>jperl samplematch3.pl
○ WINDOWS2000
○ windows98
○ WindowsXP
× ORACLE8i
× oracle9i
× Oracle10g
----------------------------------------------------------------
大文字と小文字を区別しないので、「WINDOWS2000」「windows98」「WindowsXP」
にヒットしています。

posted by ごん at 23:45| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2006年01月19日

パターンマッチング1(マッチ演算子)

今回からは、パターンマッチングです。
Perlをやってみようと思ったきっかけが、この強力な文字列検索機能です。
テキストデータを加工する場合などのツールを作る場合に、この機能はかなり
活躍することができるはずです。
UNIXなどで、シェルで作るよりも楽に作れるようになると思います。

■マッチ演算子

/パターン/

$_にパターンが含まれていれば真、含まれていなければ偽


サンプルソース(samplematch1.pl)
----------------------------------------------------------------
while (<>) {
  #2を含むかどうか
  if (/2/) {
    print "○ $_";
  } else {
    print "× $_";
  }
}
----------------------------------------------------------------
読み込みファイル(data.dat)
----------------------------------------------------------------
A1
AA2
AAA3
B1
BB2
BBB3
C1
CC2
CCC3
----------------------------------------------------------------
実行結果
----------------------------------------------------------------
C:¥>jperl samplematch1.pl data.dat
× A1
○ AA2
× AAA3
× B1
○ BB2
× BBB3
× C1
○ CC2
× CCC3
----------------------------------------------------------------
if文の条件に/2/となっているので、2を含む文字列の場合に真となり
○が付加されて表示されています。

条件を変更して実行してみます。
条件/A/
----------------------------------------------------------------
C:¥>jperl samplematch1.pl data.dat
○ A1
○ AA2
○ AAA3
× B1
× BB2
× BBB3
× C1
× CC2
× CCC3
----------------------------------------------------------------
Aが含まれているも全てにヒットしています。


条件/BB/
----------------------------------------------------------------
C:¥>jperl samplematch1.pl data.dat
× A1
× AA2
× AAA3
× B1
○ BB2
○ BBB3
× C1
× CC2
× CCC3
----------------------------------------------------------------
BBが条件なので、BB2とBBB3が真となります。B1はBだけなので真とはなりません。


条件/CCC/
----------------------------------------------------------------
C:¥>jperl samplematch1.pl data.dat
× A1
× AA2
× AAA3
× B1
× BB2
× BBB3
× C1
× CC2
○ CCC3
----------------------------------------------------------------
CCCが条件なのでCCC3が真となっています。



ランキングへ一票お願いします!!



★就・転職に有利!パソコン会計資格が取れる!


posted by ごん at 01:16| Comment(3) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2006年01月07日

sleep関数

sleep(待機する秒数)
指定した秒数分処理を待機する。
posted by ごん at 04:07| Comment(0) | TrackBack(0) | 関数 | このブログの読者になる | 更新情報をチェックする

2005年12月04日

制御文「ループ」until

■until文
今回は、until文です。

until文は、while文とは逆に「条件が偽の間、ループを繰り返す」処理を行います。
つまり、条件が一致したらループを抜けます。

until(条件){
  処理ブロック
}


サンプルソース
--------------------------------------------------
$count = 0;
print "カウントする秒数を指定してください>";
$sec = <>;
chop($sec);

until ($sec == 0) {
  print $sec--, "¥n";
  $count++;
  sleep(1);
}

print "¥a";
print "$count 秒経ちました。¥n";

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

実行結果
--------------------------------------------------
C:¥>jperl until1sample.pl
カウントする秒数を指定してください>10
10
9
8
7
6
5
4
3
2
1
10 秒経ちました。
--------------------------------------------------
指定した秒数をカウントして減らしていき、条件である($sec == 0)に
なったらuntil文を抜けて処理を終了します。
sleep関数で1秒を指定しているので、1カウント1秒になっています。

■sleep関数
sleep(待機する秒数)
指定した秒数分処理を待機する。



■until修飾子
実行する処理ブロックが1行ですむ場合は、until修飾子が使用できます。

サンプルソース2
--------------------------------------------------
print "階乗を求めます";
print "いくつの階乗を求めますか?>";
$val1 = <>;
print "いくつまで求めますか?>";
$val2 = <>;

chop($val1);
chop($val2);

print "$val1の階乗(1〜$val2)を求めます。¥n";

print $val1 ** (++$jou), "¥n" until ($jou == $val2);

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

実行結果
--------------------------------------------------
C:¥>jperl until2sample.pl
階乗を求めますいくつの階乗を求めますか?>2
いくつまで求めますか?>10
2の階乗(1〜10)を求めます。
2
4
8
16
32
64
128
256
512
1024
--------------------------------------------------


ランキングへ一票お願いします

★就・転職に有利!パソコン会計資格が取れる!
posted by ごん at 14:00| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2005年11月19日

制御文「ループ」while

ひさびさの更新です。

今回はwhile文です。

while文は条件が真の間処理を続行します。
形式は以下のようになります。

while(条件){
  処理ブロック
}


サンプルソース
--------------------------------------------------
while (<>) {
print;
}

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

実行結果

--------------------------------------------------
C:¥>jperl while1.pl dasha.dat
ジーター
カノー
ロドリゲス
シェフィールド
松井
--------------------------------------------------
このソースは実行するときに、コマンドラインに指定した
ファイルの中身を最後まで読み込む処理を行っています。
条件が無名ファイルハンドル(<>)になっているので、
読み込むデータがある間処理を続行します。

このソースを見ると処理ブロックではprintとしか書かれていません。
実は、このソースでは特殊変数が省略されています。
省略しないで記述すると以下のようになります。

while ($_ = <>) {
print $_;
}


処理するブロックが1行しかない場合は、while修飾子を
使用するとすっきりします。


サンプルソース2
--------------------------------------------------
$count = 10;
print "カウントダウン¥n";

print $count--, "¥n" while ($count >= 0);
--------------------------------------------------

実行結果

--------------------------------------------------
C:¥>jperl while2.pl
カウントダウン
10
9
8
7
6
5
4
3
2
1
0
--------------------------------------------------

条件の($count >= 0)で、$countが0以上の間、処理を続行します。
$count--の「--」デクリメントで、1づつ数を減らしていきます。
最初に$count=10とあるので、10から1づつ減らしていきます。


ランキングへ一票お願いします

posted by ごん at 00:11| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2005年11月03日

制御文「ループ」foreach

今回は、foreach文です。

■基本形

foreach $スカラー変数 (リスト){
  処理ブロック
}


基本的には上記のかたちで使います。
foreach文は、リストをすべて使用するような処理を行う場合に便利です。


サンプルソース1
--------------------------------------------------
foreach $count (0 .. 9) {
print "$count¥n";
}
--------------------------------------------------
実行結果
--------------------------------------------------
0
1
2
3
4
5
6
7
8
9
--------------------------------------------------
リストの左端、ここでは0が変数に代入され、次に右隣、ここでは1が代入される
サイクルを繰り返し、一番右端の9が代入されて終わります。
「..」は範囲演算子で、上記のソースの(0 .. 9)は、0,1,2,3,4,5,6,7,8,9という
リストが並んでいるのと同じことを意味します。

「..」:範囲演算子

■スカラー変数がないかたち

foreach (リスト){
  処理ブロック
}


サンプルソース2
--------------------------------------------------
@taiyoukei = ('水星', '金星', '地球', '火星', '木星', '土星', '天王星', '海王星', '冥王星', );

$count = 0;
print "太陽系の惑星は¥n";

foreach (@taiyoukei) {
print "$_¥n";
$count++;
}

print "の $count 個です。¥n";
--------------------------------------------------
実行結果
--------------------------------------------------
太陽系の惑星は
水星
金星
地球
火星
木星
土星
天王星
海王星
冥王星
の 9 個です。
--------------------------------------------------
今回のソースを見ると、foreach文にスカラー変数がありません。
この部分のスカラー変数は、省略することが出来ます。
この場合は、「$_」という特殊変数に格納されます。

■foreach修飾子

処理 foreach リスト;

サンプルソース3
--------------------------------------------------
@taiyoukei = ('水星', '金星', '地球', '火星', '木星', '土星', '天王星', '海王星', '冥王星', );

print "太陽系の惑星は¥n";

print "$_¥n" foreach @taiyoukei;

print "です。¥n";
--------------------------------------------------
実行結果
--------------------------------------------------
太陽系の惑星は
水星
金星
地球
火星
木星
土星
天王星
海王星
冥王星
です。
--------------------------------------------------
処理するブロックが1行の場合は、foreach修飾子が使用出来ます。


ランキングへ一票お願いします

★就・転職に有利!パソコン会計資格が取れる!
posted by ごん at 22:18| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2005年10月29日

制御文「ループ」for

反復処理「ループ」文には以下のものがあります。
・for
・foreach
・while
・until


今回は、for文です。

for文は主に繰り返す回数を条件にしたループに使用します。

for(カウンタ初期値; 続行条件; カウンタ操作){
  ブロック
}


サンプルソース
--------------------------------------------------
for ($count=0; $count<10; $count++) {
print "$count¥n";
}

--------------------------------------------------
上記のサンプルソースの
「$count=0」はカウンタの初期化を行っています。つまり0に初期化しています。
「$count<10」は続行条件、$countが10より小さい間ループを行います。
「$count++」はカウンタ操作で、++で1づつ増やします。


実行結果
--------------------------------------------------
0
1
2
3
4
5
6
7
8
9
--------------------------------------------------

サンプルソース2
--------------------------------------------------
@member = ("清水","二岡","高橋","小久保","阿部");
print "メンバー全員:", @member, "¥n";
print "メンバー全員:@member¥n";

for ($i=0; $i<5; $i++) {
print $i+1, "番 $member[$i]¥n";
}

--------------------------------------------------
ループ処理は、配列データと相性がよいです。

実行結果
--------------------------------------------------
メンバー全員:清水二岡高橋小久保阿部
メンバー全員:清水 二岡 高橋 小久保 阿部
1番 清水
2番 二岡
3番 高橋
4番 小久保
5番 阿部

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

ランキングへ一票お願いします


posted by ごん at 22:55| Comment(1) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。