こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

perlのfor文について

perlなのですが、以下のfor文の書き方について教えてください。

for($var1,$var2,$var3,$var4){
s/^(?:Company|Organization|Office|Location)\s*:\s*// if( $_ );
s/"(?:[^"]|\")*"//g if( $_ );
1 while s/\([^()]*\)//g if( $_ );
}
これは、どのようなfor文なのでしょうか。
for文の最後に「1 while」とあるのですが、最後の行の1とは
どういう意味で、ここでは何をしているのでしょうか。
また、if文が置換の処理より後ろにかかれていますが、実際は
if文が先に動いているのでしょうか。
それと、「 1 while s/\([^()]*\)//g if( $_ );」が以下のようにエラー
がでます。
「syntax error at x.pl line x, near "s/\([^()]*\)//g if"」
エラーを出さないようにするにはどうしたらよいでしょうか。

投稿日時 - 2017-05-16 11:58:49

QNo.9329908

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

前回の回答には見落としがあり、次のように訂正します。選択肢の順番を入れ替えるのを忘れていました。

> s/"(?:[^"]|\")*"//g if( $_ );
  ↓
s/"(?:[^"]|\\")*"//g if $_; # 前回の回答
  ↓
s/"(?:\\"|[^"])*"//g if $_;

> if文は1行で表現できる場合は、処理の後ろでもよいのですか。

そのとおりです。

投稿日時 - 2017-05-17 09:36:28

お礼

ありがとうございます。
勉強になります。

投稿日時 - 2017-05-17 13:23:13

ANo.1

> for($var1,$var2,$var3,$var4){

Perl には、2つの for 文があります。他の言語でも一般的な for 文と foreach を短くした for 文で、丸カッコ内の書き方で区別されます。上記の for 文は後者で、丸カッコ内の要素の1つ1つが順番に処理されます。

> s/"(?:[^"]|\")*"//g if( $_ );

上記の正規表現では、最初のダブルクォートから最後のダブルクォートまでを削除してしまいます。ダブルクォート内にクォートされたダブルクォートを許すという意味ならば、/(?:[^"]|\\")*"/ としなければなりません。

> 1 while s/\([^()]*\)//g if( $_ );

「1 while」というのは、ループでの処理が不必要な場合の書き方です。上記の文でエラーになるのは、while の条件部に if を含めているからです。次のように書き換えれば、エラーはなくなります。

1 while $_ and s/\([^()]*\)//g;

投稿日時 - 2017-05-16 19:10:28

お礼

ありがとうございます。

>ダブルクォート内にクォートされたダブルクォートを許すという意味ならば、/(?:[^"]|\\")*"/ としなければなりません。
s/(?:[^"]|\\")*"//g;
とすると
TOKYO-"CHIYODA"-KOUJIMACHI -> -KOUJIMACHI
TOKYO-"CHIYODA-KOUJIMACHI"" -> NULL(削除される)
となります。


>「1 while」というのは、ループでの処理が不必要な場合の書き方です。
知りませんでした。勉強になります。


if文は1行で表現できる場合は、処理の後ろでもよいのですか。

投稿日時 - 2017-05-17 08:21:30