perlのマッチング演算子についての質問

このQ&Aのポイント
  • perlのマッチング演算子についての質問です。マッチング演算子の正規表現パターンが文字数が多くて改行したい場合、コンパイルエラーが発生する問題について相談です。
  • 質問文章で示されたperlのマッチング演算子の正規表現パターンは文字数が多くなっており、改行して可読性を上げたいと考えています。しかし、改行するとコンパイルエラーが発生してしまいます。何か解決策はありますか?
  • perlのマッチング演算子の正規表現パターンについての質問です。文字数が多くなった場合に改行したいのですが、改行するとコンパイルエラーが発生します。どうすれば正しく改行できるでしょうか?
回答を見る
  • ベストアンサー

perlでご助言いただきたく

下記のような文字数の多いマッチング演算子について。 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+/){ 改行して記述するにはどうすればよいのでしょうか?

  • Perl
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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..に相当する位置 等必要な箇所を使う、という方法もあります。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

//x

関連するQ&A

  • perlでご助言お願い致します。

    あるテキストファイルが以下の内容で記述されているとします。 a   file1 a   file1 a   file1 b   file1 b   file1 b   file1 c   file2 c   file2 d   file2 d   file2 e   file2 e   file2 f   file3 f   file3 f   file3 上記のように列が二つあるテキストファイルについて、 2列目のfile名が1列目のどの値とひもづいて いるかを処理するperlプログラムを作ることを考えます。 出来上がったperlによって上記テキストファイルを処理した結果は、 file1は aとb file2は cとdとe file3は f とひもづいていることが分かる ということにしたいです。 これをperlプログラムで書くとき、条件として 一行一行を読みとるとき if ( $_ =~ /(\S+)\s+(\S+)/ ){ を使っています。 そのため$1と$2に現在行の1列目,2列目が与えられた後、 ハッシュと配列を組み合わせて考えた場合どのようにすれば いいのでしょうか。 ご助言ご鞭撻宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 改行できる・できない入力ボックスの違いとは??

    しょしんしゃです。 自サイトの感想フォームの入力ボックスをつくっています。 よくある「一行掲示板」みたいに、 一行のみのゲストブックとして使いたいのですが、 入力ボックス(縦の幅は1行分)の中で改行ができてしまうため、 ちょう長い、改行たっぷりのメッセージがきてしまいます。 1行しか入力できないボックスはどのように記述するのですか? 入力文字数に制限は必要ありませんが、改行させたくありません。 アドバイスください。><

    • ベストアンサー
    • HTML
  • フォトショップのテキスト機能で、文字の行間が広い

    フォトショップエレメンツ2を使っています。 これのテキスト機能を使って、一行だけ書くときは問題ないのですが、以下のように何行か改行して書くと 一行目・・・  (改行) 二行目・・・  (改行) 三行目・・・  (改行) 実際の画面上は以下のように行間がすごく空きます。 一行目・・・ 二行目・・・ 三行目・・・ これはフォトショップエレメンツでは正常な表示なのでしょうか? だとすれば、本来このテキスト機能は一行ずつ書くものなのでしょうか? また、この不自然に広い行間を調整する術はないのでしょうか? また、上級ソフトのフォトショップCS??のテキスト機能ならこの問題は無いのでしょうか? よろしくお願いいたします。

  • Xamppでperlが表示されない

    Linux初心者です。 ubuntu8にXamppインストールして、htdocsにtest.cgiを入れて、http://localhost/test.cgiにアクセスすると、 「Internal Server Error」がでます。 test.cgiの内容は 「 #!/usr/local/bin/perl 」 の一行のみです。 ちなみに、おなじhtdocsディレクトリにPHPのファイルを入れてテストしたところ正常に動作しました。 ご教示願います。

  • perlでアドバイスをお願いします。

    あるテキストファイルが以下の内容で記述されているとします。 a   file1 a   file1 a   file1 b   file1 b   file1 b   file1 c   file2 c   file2 d   file2 d   file2 e   file2 e   file2 f   file3 f   file3 f   file3 上記のように列が二つあるテキストファイルについて、 2列目のfile名が1列目のどの値とひもづいて いるかを処理するperlプログラムを作ることを考えます。 出来上がったperlによって上記テキストファイルを処理した結果は、 file1は aとb file2は cとdとe file3は f とひもづいていることが分かる ということにしたいです。 これをperlプログラムで書くとき、条件として 一行一行を読みとるとき if ( $_ =~ /(\S+)\s+(\S+)/ ){ を使っています。 そのため$1と$2に現在行の1列目,2列目が与えられた後、 ハッシュと配列を組み合わせて考えた場合どのようにすれば いいのでしょうか。 また仮にテキストファイルの続きが存在し、 1列目がg 、2列目がfile1 の行があるとき 2列目で既に出てきた同じfile名はエラーとすることも考えた 場合どう記述するのか合わせてお願い致します。 長くなってしまい申し訳ないのですが、 ご指導ご鞭撻宜しくお願い致します。

  • ビット演算子について

    あるプログラムの中で下記のようなif文の記述を見かけました。 どういう計算をしてif文の判定を行っているのでしょうか。 (1)256を2進数に変換して → 100000000 (2)0x00000004を2進数に変換して → 100 (3)100000000 & 100 のビットAND演算を行う そもそも(3)で100000000 と 100 では桁数が違うけどどうやって両者でビット演算するので しょうか。100を 000000100というように0を補完して計算すればよいのでしょうか。 その場合、100000000 & 000000100 → 000000000(2進数) → 0(10進数) となりif文の中には入らないことになると思います。 if(256 & 0x00000004 != 0)

  • perlで正規表現(正の数)

    perlで正の数の数値を判定したいと思っています。 $testが0か1しか許容したくないので下記のように正規表現を作成しました。しかし、「-1」 を$testに設定すると何故か下記のif文をスルーしてしまいます。どのようにすればよいでしょうか? if($test !~ /[0-1]/) { # エラー }

    • ベストアンサー
    • Perl
  • METAタグの書き方

    文字通り書き方の疑問なんですが。 改行なんかしてないつもりなのに、下記のサイトで チェックしてみると、「一行で記述されてない」って 出るんですよ。 「一行で記述」って、どういう意味なんでしょう? http://ippatsu.net/ROBO/

  • Perlのアルゴリズムについて教えてください!

    データファイルAとデータファイルBからデータを受け取って、データファイルB中の第i番目の文Siの重要度を式1に基づいて計算して、重要度と順位(重要度の高い順に1位、2位、、)を各文Siに付与するアルゴリズムを考える場合、式1のWi,jは文Siに出現するj番目の単語で、niはSiに出現する単語の数となる。Wi,jの出現頻度はファイルAから得られるものとする。 /*データファイルA*/ はじめ:␣12 改行 こる:␣1 改行 いく:␣23 改行 みせ:␣4 改行 ... というように前に文字列(基本形)が入り後ろに数字が記載されているデータ /*データファイルB*/ はじめ␣はじめ␣形容詞 改行 こる␣こる␣形容詞 改行 ... EOS 改行 ... ␣は空文字 1.ファイルAにまだ読み込んでいない行がある限り繰り返す    1-1.ファイルから一行読み込む    1-2.その行の基本形用のカウンタを用意して、そのカウンタにその基本形の出現頻度を代入する。 2.文番号カウンタと文重要度変数を用意して、初期値をそれぞれ1と0にする。 3.データファイルBにまだ読み込んでいない行がある限り繰り返す 3-1.ファイルから1行読み込む 3-2.もしその行がEOSであれば、文番号カウンタと文重要度変数の値を出力する。その後、文重要度変数を0にして、文番号カウンタを1増やす。 3-3.これ以降のアルゴリズムが解けないので教えてください。

  • Perlで行頭にある文字が含まれている行を全部削除して詰めたい

    perl初心者です。以下のようにデータがならんでいる時、 test111 aaaaaaaaabbbbbbbbcccccc test112 aaaaccccabbbbbbbbcccccc test113 aaaaccaaabbbbbbbbcccccc test114 acccaaaaabbbbbbbbcccccc test111 aacaaaaaabbbbbbbbcccccc test112 accaaaaaabbbbbbbbcccccc test113 aaacccaaabbbbbbbbcccccc test114 aaaaaccaabbbbbbbbcccccc test112の行だけ削除して、さらにそこを詰めたい時のスクリプトを作成しています。 途中からわかりません。 行を削除する関数が調べても見つからないのです。 #!/usr/bin/perl ; open(IN, "test.doc") or die ; open(OUT, ">testout.doc"); while(<IN>) { chomp ; if (/(\S+)/) { $name = $1 ; if ($name =~ /^test112(\S+)/) { #ここでマッチさせて、一気に行を削除して、しかも行を詰めたいのですが ; } print OUT " \n" ; } } close (IN) ; close (OUT) ; 大変困っております。宜しくお願いします。

    • ベストアンサー
    • Perl