W.Perl PROGAMMING[String]
1.文字列操作
(1) 文字列の繰り返し
文字列を指定した数だけ繰り返すにはx演算子を使用します。
print "xyz"x3;
print "\n";
(2) 文字列の連結
文字列を連結するには連結演算子(.)を使います。
$I=$x="abc"."djf"."kgoer";
print "$I\n";
(3) 文字列の分解(split)
文字列を分解するにはsplit関数を使用します。[split/区切り文字/,文字列] split関数は区切り文字(正規表現)で「文字列」を分解し、そのリストを返します。文字列を省略すると、特殊変数「$_」が分解の対象になります。
$x="sfko-skfjie-fgerniuo-oiekfjd";
@array=split /-/,$x;
print "@array\n";
(4) 文字列分解
split関数に分解数を指定することもできます。
[split /区切り文字/,文字列,分解数]このときには指定した分解数に分解されます。次のスクリプトのsplit関数では分解数を3にしているので、変数$cは3つに分解されます。最後の要素「ghj-jik」となります。
$c="jfei-jkige-jigew-khtrit";
@array=split /-/,$c,3;
print "@array\n";
(5) 文字列の連結(join)
文字列を連結するにはjoin関数を使います。[join 連結文字,リスト] join関数は、[リスト]を「連結文字」を使って連結します。
@x=(bav,dert,kgro,rlpg);
$str=join "+*-/",@x;
print "$str\n";
連結文字に殻の文字列""を指定した場合には、そのまま連結します。
@x=(bav,dert,kgro,rlpg);
$str=join "",@x;
print "$str\n";
(6) 文字列の一部を取り出す[substr]
文字列の一部取り出すには、substr関数を使います。[substr 文字列,位置,長さ] 位置は取り出す開始位置を文字数(バイト数)で指定します。位置は0から始まります。負の値を指定すると、文字列の末尾からの位置になります。[長さ]は取り出す長さを文字数(バイト数)で指定します。長さを省略した場合には、位置から最後の文字まで取り出します。
$str="Do you like an apple! HOPE YOU ARE WELL DOING";
print substr($str,3,8),"\n";
print substr($str,5,10),"\n";
print substr($str,20,20),"\n";
(7) 文字列を検索してその位置を返す(index,rindex)
文字列を検索してその位置を返すにはindex関数を使用します。[index 文字列,検索 文字列,検索開始位置]。index関数は文字列の中の検索文字列を検索開始位置から検索して、最初に見つかった検索文字列の先頭から位置が返ります。
$str="Do you like an apple! HOPE YOU ARE WELL DOING";
print index($str,like),"\n";
print index($str,like,5),"\n";
print index($str,well,10),"\n";
(8) rindex関数
[rindex 文字列,検索 文字列,検索開始位置]rindex関数は最初に見つかった「検索文字列」の位置を返します。
print rindex($str,like),"\n";
print rindex($str,like,5),"\n";
print rindex($str,well,10),"\n";
(9) 大文字と小文字を変換する(lu,uc)
大文字を小文字に変換するにはlc関数を使い、小文字を大文字に変換するにはuc関数を使用します。
$str="Do you like an apple! HOPE YOU ARE WELL DOING";
print lc $str,"\n";
print uc $str,"\n";
(10) 文字列の長さを返す(length)
文字列の長さ(バイト数)を返すにはlength関数を使います。[length 文字列]
print length("ikeda takamitsu");
print "\n";
(11) 文字列の検索(m演算子)
ある文字列の中に特定の文字列が含まれているかどうかを調べるには、m演算子を用います。m演算子の構文は次のとおりです。[m/文字列/]通常、検索の対象となるのは、特殊変数「$_」ですが、パターン結合演算子「=~」を使うと、検索の対象となる変数を指定することができます。
● [変数=~m/文字列/]
$a="ABCDE";
if($a=~m/AB/){
print "ABが含まれています。\n";
}else{
print "ABが含まれていません\n";
}
上のスクリプトは特殊変数[$_」を使って次のように書き直すことができます。
$_="ABCDEJGFEJGNEIOdSnOIGED'UWEGABJIGREIPDSMOL`P";
if(m/AB){
print "ABが含まれています。\n";
}else{
print "ABが含まれていません\n";
}
@ m演算子
m演算子でパターンマッチを行うときに、修飾子でオプションを指定することができます。
● [m/文字列/修飾子]
[演算子 修飾子]
g: | マッチするものをすべて見つける |
i: | 英大文字と英小文字を区別する |
m: | 文字列を複数行として扱う |
o: | パターンのコンパイル(変数展開)を一回だけ行う |
s: | 文字列を単一行として扱う |
x: | 正規表現の空白を無視する。 |
(12) 文字列の置換(s演算子)
文字列の中にある特定の文字を置換えするときには、s演算子を使います。s演算子の構文は次のとおりです。
● [変数=~s/元の文字列/置換え後の文字列/]
$A="ABCDEDFD";
print "置換前 a=$a\n";
$a=~s/BCD/bcd/;
print "置換え後 a=$a\n";
A s演算子
s演算子でパターンマッチを行うときにも、m演算子と同様に修飾子でオプションを指定することができます。s演算子で指定できる修飾子には次のようなものがあります。
[s演算子 修飾子]
e: | 置換え後の文字列を式として扱う |
g: | マッチするものを全て置換えする |
i: | 検索時に英大文字と英小文字を区別しない |
m: | 文字列を複数行として扱う |
o: | パターンコンパイル(変数展開)を一回だけ行う |
s: | 文字列を単一行として扱う |
x: | 正規表現の空白を無視する |
(13) 文字列の置換え[tr関数]
s演算子と同様な置換えを行うtr関数も用意されています。tr関数はs演算子と違い、一文字単位に置換えを行います。つまりtr関数は文字リストの中の各文字を置換え文字リストの対応する文字に置換えします。指定した文字列が特殊変数$_に含まれていれば、置換えを行い含まれていなければ偽を返します。特殊変数$_以外の変数に対して置換えを行う場合には、パターン結合演算子[=~」を使います。
● [変数=~tr/文字リスト/置換文字リスト/]
$a=~tr/abcde/ABCDE/;
$a="this is an apple";
print "置換え前 a=$a\n";
$a=~tr/abcde/ABCDE/;
print "置換え後 a=$a\n";
(14) 正規表現によるパターンマッチ
@ メタ文字
これまで特定の文字列をパターンとするpターンマッチの例をみてきましたが、Aで始まる5文字の例、末尾がzで終わる文字列、アルファベットと数字だけからなる文字列等をパターンとしてパターンマッチを行うときがあります。これを可能にするのが通常の文字列やメタ文字であり特殊な文字を組み合わせて表現します。
.: | 改行文字以外の1文字 |
[]: | 文字クラス |
*: | 0回以上の繰り返し |
+: | 一回以上の繰り返し |
?: | 0回または1回の繰り返し |
{}: | n回の繰り返し |
(): | グループ化 |
|: | 選択 |
^: | 行頭または文字列の先頭 |
$: | 行末または文字列の末尾 |
\: | エスケープ文字 |
任意の1文字にマッチするプログラムです。
$a="NVNNJIOPgABCDERFSEMPGES";
if($a=~m/A..D/){
print "$&とマッチしました";
}else{
print "マッチしませんでした";
}
A 文字クラス []
文字クラスは[]の中に文字を並べたもので、それらの文字列の中の1文字とマッチします。例えばA[xyz]BはAxB,AyB,AzBの3種類の文字列にマッチします。文字クラスの中で「-」を使うと文字の範囲を示すことができます。たとえば「abcdef」は[a-f]と書くことができます。文字クラスの中で[の直後に^をおくと、否定を意味します。[^abcd]はabcd以外の1文字にマッチします。
$a="Myname is mike dabis";
print "置換え前 $a\n";
$a=~tr/[a-z]/[A-Z]/;
print "置換え後 $a\n";
B 省略文字列
頻繁に使用される文字クラスには次の省略文字列が使用されます。
省略文字列 | 文字クラス | 文字クラスの意味 |
\d | [0-9] | 数字 |
\D | [^0-9] | 数字以外 |
\w | [A-Za-z0-9_] | 英数字と_ |
\W | [^A-Za-z0-9_] | 英数字と_以外 |
\s | [\t\r\n\f] | 空白文字 |
\S | [^\t\r\n\f] | 空白文字以外 |
空白文字とはスペース、復帰、タブ、開業、改ページの総称です。
C 繰り返し
文字の繰り返しを意味するメタ文字には以下のものがあります。
●メタ文字列の意味
* | 直前の文字の0回以上の繰り返し |
+ | 直前の文字の1回以上の繰り返し |
? | 直前の文字の0回または1回の繰り返し |
{} | 直前の文字のn回以上の繰り返し |
●繰り返しの回数指定
{m} | 直前の文字のm回の繰り返し |
{m,} | 直前の文字のm回以上の繰り返し |
{m,n} | 直前の文字のm回以上n回以下の繰り返し |
●最小マッチ回数指定
*? | 直前の文字の0回以上の繰り返し |
+? | 直前の文字の1回以上の繰り返し |
?? | 直前の文字の0回または1回の繰り返し |
{m,n}? | 直前の文字のm回〜n回の繰り返し |
$_="ABCDEFGSSSXXXXXYHIJK";
if(m/X+Y/){
print "$&とマッチしました。";
}else{
print "マッチしませんでした。";
}
$_="ABCDEFGSSSXXXXXYHIJK";
if(m/X?Y/){
print "$&とマッチしました。";
}else{
print "マッチしませんでした。";
}
(15) グループ
正規表現をまとめてグループ化するには、()を使用します。たとえば、A(bc)?dという正規表現は、「Ad」または「Abcd」にマッチします。これはbcがグループ化され、それに対して?が適用されるからです。
@ グループ化()
$_="ABCDEFABCDSGHIJK";
if(m/(XY)+/){
print "$&とマッチしました";
}else{
print "マッチしませんでした";
}
A 選択 |
|を使うと正規表現の選択が行えます。たとえばab|Ab|aBは「ab」「Ab」「aB」にマッチします。またA(xy|XY)BはAxyBまたはAXYBにマッチします。
$_="AxyBAXYB";
if(m/Ax|BA/){
print "$&とマッチしました";
}else{
print "マッチしませんでした";
}
B 位置指定
これまでに説明した正規表現はマッチする文字列の位置を指定することはできませんでした。例えばotherを大文字にするために、s/other/OTHER/gのような置換えを行いたいとします。しかしこれではBrotherをBrOTHERに変えてしまうような置換えも行ってしまいます。これを防ぐためにパターンの位置を示すために次のようなメタ文字が用意されています。
[位置指定メタ文字の種類]
^ | 行頭または文字列の先頭 |
$ | 行末または文字列の末尾 |
\A | 文字列の先頭 |
\Z | 文字列の末尾 |
\b | シンボルの境界 |
\B | シンボルの境界以外 |
\G | m/文字列/gの開始位置 |
B エスケープ文字
エスケープ文字\はメタ文字の特殊な意味をなくしメタ文字そのものを表現します。例えば[a\.c]は[a.c]とパターンマッチします。[\^]は[^]を[\\]は[\]を、[\$]は[$]を表現します。