基礎プログラミング
2006年度1学期 第12回
メニュー
• 前回の復習
– 文字列の比較
• p1101.plの改造
– もう少し複雑な比較
• 論理演算
• 文字列の置換
• 正規表現
• 理解を確認するための小テスト
2
前回の復習(1)
• split関数
$string=“カレー:おにぎり:ラーメン:ハンバーガー";
@a = split(/:/, $string);
$stringという変数の中身を,
「:」で区切って,
[email protected]
@a
0
1
2
$#a = 3
カレー
おにぎり
ラーメン
ハンバーガー
配列の最後の添え字は,$#a; という特別な変数に代入.
配列の要素が4個なら$#aは3.
3
前回の復習(2)
• 文字列の比較 (詳しくは配布プリント参照)
記号 例
=~
!~
eq
意味 $a=”助動詞”,$a=”動詞”
$a=~/動詞/ $aに「動詞」という true,true
文字列が含まれる
$a!~/動詞/ $aに「動詞」という false, false
文字列が含まれない
$a eq ”動
$aは「動詞」である false, true
詞”
ne
$a ne ”動
詞”
$aは「動詞」でない true, false
4
p1101.plの改造
9 @a = split(/\t/, $line);
11
12
13
if ($a[4 ] =~/名詞/) {
printf ("%s\n", $line);
}
9行目のsplitにより,品詞は$a[4]に代入されるため,
部分文字列一致で,「名詞」を含む行を表示すると,
名詞だけが取り出せる
5
文字列の比較(補足)
• 部分文字列一致を理解する.
if ($a[4]=~/動詞/) { とするとどうなるか?
→ 動詞と助動詞が出力される
• どうして,こんなことになるか?
– 「動詞」という文字(列)さえ$a[4]に含まれていれ
ばとにかく一致するから
確認: $a[4]=~/詞/ とするとどうなるか?
6
もう少し複雑な比較を考える
• もう少し細かい条件を考える
– 「名詞」である.
– 「名詞でも「接尾」は含めたくない.
これらの条件を満たすものだけを選ぶには?
– 「名詞」である $a[4]=~/名詞/
– 「接尾」は含めたくない $a[4]!~/接尾/
この2つの条件を if 文の条件にすればOK
7
もう少し複雑な比較(2)
• 複雑な条件式の作り方
$a[4]=~/名詞/ と $a[4]!~/接尾/ が同時に成り
立つような条件式の作り方
→論理演算の導入
if ($a[4]=~ /名詞/ && $a[4]!~/接尾/ ) {
...
}
とする.
8
もう少し複雑な比較(3)
• 論理演算 ( 論理演算子を使った演算)
&& (かつ, ∧)
条件A && 条件B
Aが成立し,かつBが成立したら成立
|| (または,∨)
条件A || 条件B
Aが成立するか,またはBが成立したら成立
(AとBの両方が成立しても成立)
9
文字列の置換
• ある文字列を別の文字列に置き換える
ことを「文字列の置換」という
$a =~ s/変換前の文字列/変換後の文字列/;
$aの中身にある「変換前の文字列」を「変換
後の文字列」に置き換える
10
文字列の置換(2)
• p1201.pl をダウンロードして実行
y:\perl> perl p1201.pl
カレーライスの「ライス」を「うどん」に置換します →
カレーうどん
となるはず.
$aのカレーライスがカレーうどんになっている.
11
文字列の置換(3)
• p1202.plをダウンロードして実行
y:\perl> perl p1202.pl
カレーライスとラーメンライスとオムライス
の「ライス」を「うどん」に置換します →
カレーうどんとラーメンライスとオムライス
あれ? ラーメンうどんとオムうどんにならない...
実は, $a =~ s/ライス/うどん/ は,
$aの中の最初の「ライス」を「うどん」に置き換える
という意味.
12
文字列の置換(4)
• オプション
s/ / /■の 最後(■の位置)にいろいろなオプショ
ンをつけることができる.
オプション
意味
g
対応するすべての文字列を置換
i
大文字と小文字を区別しない
13
文字列の置換(5)
• gオプションの確認.
p1202.plを以下のように変更
$a =~ s/ライス/うどん/; を
$a =~ s/ライス/うどん/g; に変更して実行.
カレーうどんとラーメンうどんとオムうどん
になっていることを確認.
14
文字列の置換(6)
• iオプションについても確認.
p1203.pl をダウンロードして実行
$a =~ s/abc/ZZZ/gi;
g オプションと i オプションを併用.
15
文字列の置換(7)
• もうひとつの置換 tr
$a =~ tr/元の文字列/置き換える文字列/;
元の文字列の文字を1文字づつ順番に置き
換える.
$a =~ tr/abcd/1234/;
aを1に,bを2に,cを3に,dを4に置き換える
16
文字列の置換(8)
• p1204.plをダウンロードして実行
$a = ”ABCDEDFabcdefgABcdefgaBcdefg”;
がどのように変化するかを確認.
” ABCDEDF1234efgAB34efg1B34efg”;
となるはず.
17
文字列の置換(9)
• 確認
– $a=”ABC...” の中身をいろいろ換えて確認
例: Abc cbAaabbccdda A a B とか.
– tr/.../.../ の中身をいろいろ換えて確認
例: tr/AbC/aBc/ とか.
18
正規表現
• パターンマッチング:
– 特定の文字列がある文字列の中にあるかどうか
• 正規表現
– 特定の文字列を便利に指定する方法
正規表現は, / / で囲む
$a =~ /ライス/ は「ライス」が$aにあるかどうかを
調べる表現
– 直接文字列を書くだけでなく別の指定もできる
19
正規表現(2)
• メタ文字の利用
メタ文字 意味
^
$
\b
\B
例
文字列の先頭 /^Abc/
Abc
Abcdefg
xyz
文字列の末尾 /xyz$/
abcdxyz
/man\b/ man
単語の境界
superman
単語の境界以 /man\B/ manage
外
romanism
20
正規表現(3)
• メタ文字の利用例をチェック
– p1205.pl をダウンロードして実行
– 動きをたしかめよ.
$title[$i] =~ /\Bpar/ の
/\Bpar/ を /par\B/ に換えるとどうなる?
21
正規表現(4)
• マッチングの条件を示すメタ文字
メタ
.
意味
任意の1文字
例
/mo./
?
直前のものがあっても /colou?r/
なくてもよい
*
直前の文字の0回以上 /goo*d/
の繰り返し
+
直前の文字の1回以上 /goo+d/
の繰り返し
マッチ例
monday
mon
colour
color
good
gooooood
goood
gooooood
22
正規表現(5)
• 利用例をチェック
p1206.pl をダウンロードして実行
動きを確かめよ.
いろいろ試してみよ.
23
正規表現(6)
• つづき
メタ
意味
例
直前の文字がm /すも{6}/
回繰り返す
{m,} 直前の文字がm /いも){2},/
回以上繰り返す
{m,n} 直前の文字がm /(いも){3,5}/
回以上n回以下
繰り返す
{m}
マッチ例
すもももももも
いもいも
いもいもいも
いもいもいもいも
()で囲むとそれが繰り返しの単位になる!
24
正規表現(7)
• 利用例をチェック
p1207.pl をダウンロードして実行
動きを確かめる
25
まとめ
• 数値の比較
– if (条件式){
<,<=,>,>=,==,!=
• 文字列の比較
– if (条件式){
=~,!~, eq, ne
26
まとめ(2)
• 論理演算
– 条件A && 条件B
• かつ
– 条件A || 条件B
• または
– 組み合わせはもっと複雑にできる
– (条件A && 条件B) ||条件C
条件Aかつ条件Bであるか,または条件Cなら成立
27
まとめ
• 文字列の置換
$a =~ s/変換前の文字列/変換後の文字列/;
– $aの中身にある「変換前の文字列」を「変換後の文字
列」に置き換える
• オプション
オプション
意味
g
対応するすべての文字列を置
換
大文字と小文字を区別しない
i
28
まとめ(2)
• 正規表現
– 特定の文字列を便利に指定する方法
/ / で囲む
文字だけでなくいろいろなメタ文字が使える
例 $s =~ /ライス/ 「ライス」という文字
^ $s =~ /^ライス/ 文字列の先頭が「ライス」
$ $s =~ /ライス$/ 文字列の末尾が「ライス」
. $s =~ /ライ./
「ライ」に続いて任意の1文字
+ $s =~ /a+/ a の1回以上の繰り返し
* $s =~ /a*/ a の0回以上の繰り返し
29
ダウンロード

PowerPoint資料