• 締切済み

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"」 エラーを出さないようにするにはどうしたらよいでしょうか。

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

前回の回答には見落としがあり、次のように訂正します。選択肢の順番を入れ替えるのを忘れていました。 > s/"(?:[^"]|\")*"//g if( $_ );   ↓ s/"(?:[^"]|\\")*"//g if $_; # 前回の回答   ↓ s/"(?:\\"|[^"])*"//g if $_; > if文は1行で表現できる場合は、処理の後ろでもよいのですか。 そのとおりです。

abc999xyz
質問者

お礼

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

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.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;

abc999xyz
質問者

お礼

ありがとうございます。 >ダブルクォート内にクォートされたダブルクォートを許すという意味ならば、/(?:[^"]|\\")*"/ としなければなりません。 s/(?:[^"]|\\")*"//g; とすると TOKYO-"CHIYODA"-KOUJIMACHI -> -KOUJIMACHI TOKYO-"CHIYODA-KOUJIMACHI"" -> NULL(削除される) となります。 >「1 while」というのは、ループでの処理が不必要な場合の書き方です。 知りませんでした。勉強になります。 if文は1行で表現できる場合は、処理の後ろでもよいのですか。

関連するQ&A

専門家に質問してみよう