電子書籍の厳選無料作品が豊富!

下記のような文字数の多いマッチング演算子について。

if($test =~ /^\s+\S+\s+(\S+)\s+(\S+)\s+\S+\s+(\S+)\s+(\S+)\s+\S+\s+\S+\s+\S+\s+\S+
\s+\S+\s+(\S+)\s+\S+\s+\S+/){

上記は一行に続けて記述しています。
(見た目は2行に見えますが1行記述です。コンパイルすると正常に動作します)

これを

if($test =~ /^\s+\S+\s+(\S+)\s+(\S+)\s+\S+\s+(\S+)
\s+(\S+)\s+\S+\s+\S+\s+\S+\s+\S+
\s+\S+\s+(\S+)\s+\S+\s+\S+/){

のように改行して、コンパイルしてみると
うまく動きません。ドット演算子を使用して下記のように記述し直しても
うまく動作しません。

if($test =~ /^\s+\S+\s+(\S+)\s+(\S+)\s+\S+\s+(\S+)
.\s+(\S+)\s+\S+\s+\S+\s+\S+\s+\S+
.\s+\S+\s+(\S+)\s+\S+\s+\S+/){

改行して記述するにはどうすればよいのでしょうか?

A 回答 (2件)

正規表現で迷ったら、まずは perldocの perlre を読んでみましょう。


http://perldoc.jp/docs/perl/5.14.1/perlre.pod

通常、正規表現を改行で分割して表記することはできません。
改行文字が「改行文字に一致するパターン」としての意味を持ちます。パターン中に\nと書くようなものです。

.演算子は文字列を連結する演算を行うものです。正規表現内は、明示しない限り「演算」はしません。
連結の演算するなら、 パターンでよく使う「.(任意の1文字)」が文字列連結に使われてしまいます

対処法としては
・/x を使う。詳細はマニュアルで

・予め文字列変数に入れて、それをパターンに使う
$pattern = '^\s+\S+\s+(\S+)\s+(\S+)\s+\S+\s+(\S+)';
$pattern .= '\s+(\S+)\s+\S+\s+\S+\s+\S+\s+\S+' ;
$pattern .= '\s+\S+\s+(\S+)\s+\S+\s+\S+' ;
if($test =~ /${pattern}/){ ~

・このパターンに限っては、「1個以上の空白で区切られた文字列」なので、
@test1=split(/\s+/,$test) ;
とsplitして
if(scalar @test1== 14) { # splitされた項目数を数える→過不足あるなら期待しているデータではない
$test1[2], $test1[3],$test1[5] ;# $1,$2..に相当する位置
等必要な箇所を使う、という方法もあります。
    • good
    • 0

//x

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!