|
|
Perl正規表現の使い方 置換演算子 |
H.Kamifuji . |
正規表現を使用し、マッチした文字列を置き換える置換演算子についての使い方を確認していきます。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 |
|
正規表現を使用し、マッチした文字列を置き換える置換演算子があります。構文は、下記のように記述します。
では、基本的なプログラムで確認してみます。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = "This is a pen."; print "変換前:$word\n"; $word =~ s/pen/book/; print "変換後:$word\n";上記を「test1-1.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test1-1_u.pl 変換前:This is a pen. 変換後:This is a book. [xxxxxxxx@dddddddddd Substitution]$ 置換演算子は省略形として、左辺を省略することもできます。この場合、左辺は 特殊変数 $_ が充てられます。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # $_= "This is a pen."; print "変換前:$_\n"; s/pen/book/; print "変換後:$_\n";上記を「test1-2.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test1-2_u.pl 変換前:This is a pen. 変換後:This is a book. [xxxxxxxx@dddddddddd Substitution]$ パターンを囲む区切り文字のスラッシュを、任意の区切り文字 (ex. @, #, *, | など)に変更することができます。この場合、パターンマッチ演算子とは異なり、先頭の mオプションを付けることはありません。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $url = 'http://www.kent-web.com/bbs/file/'; print "変換前:$url\n"; $url =~ s|bbs/file|chat/data|; print "変換後:$url\n";上記を「test1-3.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test1-3_u.pl 変換前:http://www.kent-web.com/bbs/file/ 変換後:http://www.kent-web.com/chat/data/ [xxxxxxxx@dddddddddd Substitution]$ 置換演算子には、置換えを行う際のオプションとして、次の修飾子が用意されています。
では、g 修飾子の例を簡単なプログラムで確認してみます。先ずは、修飾子を省略したサンプルを見てみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = 'aaaa'; print "変換前:$word\n"; $word =~ s/a/A/; print "変換後:$word\n";上記を「test1-4.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test1-4_u.pl 変換前:aaaa 変換後:Aaaa [xxxxxxxx@dddddddddd Substitution]$修飾子を省略すると変数展開がi度だけ行われます。o 修飾子と同じです。 次に、g 修飾子の例を確認してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = 'aaaa'; print "変換前:$word\n"; $word =~ s/a/A/g; print "変換後:$word\n";上記を「test1-5.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test1-5_u.pl 変換前:aaaa 変換後:AAAA [xxxxxxxx@dddddddddd Substitution]$繰り返し変数展開が行われています。 次に、e 修飾子の例を確認してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = "This is 100 yen."; print "変換前:$word\n"; $word =~ s/(\d+)/$1 * 2/e; print "変換後:$word\n";上記を「test1-6.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test1-6_u.pl 変換前:This is 100 yen. 変換後:This is 200 yen. [xxxxxxxx@dddddddddd Substitution]$置換文字列が式として実行され、100 が 200 に置換されました。 |
変換演算子は文字列を1文字ずつ順にスキャンして、対象文字列に含まれるすべての文字を変換して、変換した文字数を返す演算子です。変換演算子は正規表現を使わないので、厳密には正規表現の対象にはならない演算子ではあります。
では、文字列を大文字に変換する例を確認してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = "apple"; print "変換前:$word\n"; $word =~ tr/a-z/A-Z/; print "変換後:$word\n";上記を「test2-1.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test2-1_u.pl 変換前:apple 変換後:APPLE [xxxxxxxx@dddddddddd Substitution]$文字列が大文字に変換され、apple が APPLE に変換されました。 次に、変換された文字数をカウントする例を確認します。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = "apple"; print "変換前:$word\n"; my $count = $word =~ tr/a-z/A-Z/; print "変換後:$word\n"; print "変換された文字数は、$count です。\n";上記を「test2-2.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test2-2_u.pl 変換前:apple 変換後:APPLE 変換された文字数は、5 です。 [xxxxxxxx@dddddddddd Substitution]$変換された文字数がカウントされています。 変換演算子にも修飾子が次のとおり用意されています。
では、c 修飾子の例を確認してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = "American Coffee"; print "変換前:$word\n"; $word =~ tr/A-Z/_/c; # 大文字以外を _ に変換 print "変換後:$word\n";上記を「test2-3.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test2-3_u.pl 変換前:American Coffee 変換後:A________C_____ [xxxxxxxx@dddddddddd Substitution]$ 次に、d 修飾子の例を確認してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = "American Coffee"; print "変換前:$word\n"; $word =~ tr/a-z//d; # 小文字を削除 print "変換後:$word\n";上記を「test2-4.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Substitution]$ perl test2-4_u.pl 変換前:American Coffee 変換後:A C [xxxxxxxx@dddddddddd Substitution]$ 次に、s 修飾子の例を確認してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = "apple"; print "変換前:$word\n"; $word =~ tr/a-z/A-Z/s; # 大文字に変換し、連続した同一文字を1文字に変換 print "変換後:$word\n";上記を「test2-5.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Substitution]$ perl test2-5_u.pl 変換前:apple 変換後:APLE [xxxxxxxx@dddddddddd Substitution]$ |
正規表現を利用する関数として、split関数 があります。また、split関数の逆変換を行うものとして、join関数 がありますので、併せて使い方を認識しておきましょう(join関数は正規表現は使用しません)。 では、split 関数の例を確認してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my $word = "apple,banana,orange"; my @word = split(/,/ ,$word); # , を区切り文字として「文字列」を「配列」にする print "配列 \@word : @word\n";上記を「test3-1.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ perl test3-1_u.pl 配列 @word : apple banana orange [xxxxxxxx@dddddddddd Substitution]$ 次に、join 関数の例を確認してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl # my @word = ("apple" ,"banana" ,"orange"); my $word = join("," ,@word); # , を区切り文字として「配列」を「文字列」にする print "文字列 \$word : $word\n";上記を「test3-2.pl」の名前で保存してから次のように実行して下さい。 Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Substitution]$ perl test3-2_u.pl 配列 @word : apple,banana,orange [xxxxxxxx@dddddddddd Substitution]$ |
前項までの構文を応用事例として、CGIでポストデータの解析のサンプルを確認してみます。 サンプルプログラム下記のサンプルを実行してみよう。#!/usr/local/bin/perl my $method = $ENV{REQUEST_METHOD}; my $length = $ENV{CONTENT_LENGTH}; my $query_string; #▼POSTメソッドによってデータが送られてきたかどうかを確認 if( $method eq 'POST') { read( STDIN, $query_string, $length ); } else { # セキュリティからは、GET でのデータには応答しないのが望ましい。 # $query_string = $ENV{QUERY_STRING}; $query_string = "" ; } print "$query_string\n"; #▼引数を連想配列に代入 foreach (split( /&/, $query_string)) { my ($key, $value) = split( '=', $_); # 下記の2行で、送られたデータを decode する。 $value =~ s/\+/ /g; $value =~ s/\%([\da-fA-F][\da-fA-F])/pack("C",hex($1))/eg; #▼コマンドを取得する if( $key eq 'db_name' ) { # コマンドリーク対策として、一部の文字列を漢字に変更しておく $value =~ s/\|/|/g; $value =~ s/\;/:/g; $value =~ s/\</</g; $value =~ s/\>/>/g; $db_name = $value ; } if( $key eq 'server_name' ) { # コマンドリーク対策として、一部の文字列を漢字に変更しておく $value =~ s/\|/|/g; $value =~ s/\;/:/g; $value =~ s/\</</g; $value =~ s/\>/>/g; $server_name = $value ; } # 省略 } # 以下で処理プログラムを記述する。 print "\$db_name : $db_name\n"; print "\$server_name : $server_name\n";上記を「cgi_sample4-1.pl」の名前で保存してから次のように実行して下さい。 このプログラムを実行するため、下記のような sh プログラムを作成します。 #!/usr/bin/sh export REQUEST_METHOD=POST export CONTENT_LENGTH=41 echo "server_name=Free%20MyServer&db_name=My+DB" | perl cgi_sample4-1.pl Linux 環境での実行結果は、下記です。 [xxxxxxxx@dddddddddd Substitution]$ sh sample.sh server_name=Free%20MyServer&db_name=My+DB $db_name : My DB $server_name : Free MyServer [xxxxxxxx@dddddddddd Substitution]$ |
|