perlで置換をするプログラムを作成したい

このQ&Aのポイント
  • ウエブの更新プログラムをperlで作成しています。以下の条件式でうまく置換できないときがあります。通常の文字は置換できたのですが、以下のようなリンクを変えようとすると結果が変わりませんでした。
  • プログラムを確認してみたところif($get_csv =~ /$oldcont/i)で条件式にうまくヒット出来ていない感じです。タグ禁止処理が悪さしているのがわかり、タグ禁止処理は解除いたしました。それでもなお動作しませんでした。
  • 何か不足しているものがありましたらご指摘ください。お手数かけます。ご指導をよろしくお願いいたします。
回答を見る
  • ベストアンサー

perlで置換をするプログラムを作成したい

perlで置換をするプログラムを作成したい ウエブの更新プログラムをperlで作成しています。 以下の条件式でうまく置換できないときがあります。 (ここから) $oldcont ="書き換え前のコメント"; $newcont ="書き換え後のコメント"; $get_csv = get("http://hoge.foo/index.html"); if($get_csv =~ /$oldcont/i) { $get_csv =~ s/$oldcont/$newcont/g; open(DB3,">./index.html") || &error("Can't write ./index.html"); flock(DB3, 2); print DB3 "$get_csv"; close(DB3); } 以下略 (ここまで) 通常の文字は置換できたのですが、以下のようなリンクを変えようとすると結果が変わりませんでした。 oldcont <a href="http:/hoge.foo/one.html"> newcont <a href="http://hoge.foo/two.html"> プログラムを確認してみたところ if($get_csv =~ /$oldcont/i) で条件式にうまくヒット出来ていない感じです。 タグ禁止処理が悪さしているのがわかり、タグ禁止処理は解除いたしました。 それでもなお動作しませんでした。 何か不足しているものがありましたらご指摘ください。 お手数かけます。ご指導をよろしくお願いいたします。

  • Perl
  • 回答数3
  • ありがとう数7

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

$oldcont に ? などの正規表現で使う文字が入っている場合は、 \Q と \E で挟んで正規表現と解釈されないようにするとよいです。 if($get_csv =~ /\Q$oldcont\E/i) { $get_csv =~ s/\Q$oldcont\E/$newcont/g; ... のような感じですね。

参考URL:
http://www.rfs.jp/sb/perl/02/09.html#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E4%BF%AE%E9%A3%BE%E5%AD%90%E3%81%AE%E4%B8%80%E
hihin2003
質問者

お礼

回答ありがとうございます。 早速やってみました。 >if($get_csv =~ /\Q$oldcont\E/i) { >$get_csv =~ s/\Q$oldcont\E/$newcont/g; バッチリ動作しました!! ありがとうございます!! とっても助かりました。これで作業が進められます。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

>if($get_csv =~ /$oldcont/i) { >$get_csv =~ s/$oldcont/$newcont/g; これ、$oldcontを正規表現として評価しますから /?が 「/ が0または1個」と解釈されてます。 他のが動作したのはたまたまです。 任意の一文字を表す正規表現 . が、文字.と一致しただけです。 ためしに $oldcont = <a href="​....://hoge..../enta.html"> としても置き換わるはずです。

hihin2003
質問者

お礼

kmeeさん 回答ありがとうございます。 >>if($get_csv =~ /$oldcont/i) { >>$get_csv =~ s/$oldcont/$newcont/g; >これ、$oldcontを正規表現として評価しますから >/?が 「/ が0または1個」と解釈されてます。 そうなんですね。勉強になります。 私は、perlを使用してまもないのでこのような情報は本当にありがたいです。 いろいろと壁にぶち当たったときにここで助けていただいてます。 ありがとうございます。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

条件式にうまくヒットしないときの、$get_csv の中身はわかりますか。 前後の不要な部分をカットして提示できないでしょうか。 if($get_csv =~ /$oldcont/i) { で大文字小文字を区別しないで比較していますが、 置き換えるところでは $get_csv =~ s/$oldcont/$newcont/g; のように大文字小文字を区別しています。 それが置き換わらない原因ということはないですよね。

hihin2003
質問者

補足

t-okuraさん 回答ありがとうございます。 >条件式にうまくヒットしないときの、$get_csv の中身はわかりますか。 はい。以下のものになります。 (ここから) <a href="http://hoge.com/entb.html">テストbooksb</a> <a href="http://hoge.com/entc.html">テストbooksc</a> <a href="http:/seibyou.sub.jp/au/?mov=3">テストbooks</a> <a href="http://hoge.com/enta.html">テストbooksa</a> <br> (ここまで) <a href="http:/seibyou.sub.jp/au/?mov=3">を置換出来ないです。 <a href="http://hoge.com/enta.html">は置換出来ました。 perlで使用する引数が悪さしているのでしょうか? すみません。お手数かけます。 よろしくお願いいたします。

関連するQ&A

  • textareaの内容をPerlプログラムに送る

    現在、次のようなプログラム(Perl)を作っています。 「ユーザがホームページ上のtextareaになんらかの短いストーリーを書き込む(英語)。submitボタンを押すとその文章の中から一番多い単語をPerlプログラムが読み取って、その後ホームページ上に  "Your story is about ..." (...にはその読み取った英単語を表示)と表示。ただし、a,the などの特に文章の内容に関係内単語は削除するようにプログラムを組む。 その後、We have the "n" stories talking about "..." If you want to see them, please click here. と表示。(読み取った英単語に関するストーリーを私たちはすでにn個持っています。もしそれを見たかったらここをクリックしてください) nは今までユーザからもらったストーリーの数をプログラムにより表示。 おおまかにこんな感じのプログラムを作っています。 Perlのプログラム(出現回数の多い英単語を探し出す)はできました。、 (1)HTMLのtextareaとそのプログラムを以下にしてつなげるか。 textarea のタグ内に name ="story"として、プログラムに$storyとすればtextarea 内の文字をgetできるのでしょうか? (2)データを保存  データベースに storyを保存する方法がわからず困っています。 post やgetを使えばよいのでしょうか? 長文すみません。 アドバイスしていただけるかたがいらっしゃれば、よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • この置換処理について

    以下の処理がうまくいきません。 perlで実行すると以下の置換を行ってテキストファイルができるはずなのですが、0KBのテキストファイルができてしまいます。 そこで、手動で置き換えようと思ったのですが。 正規表現を使用した、置換処理を行っているということはわかっているのですが中の処理が分かりません。 詳しい処理の内容を教えていただけないでしょうか。 よろしくお願いいたします。 while(<>){ if(m#^(.+) /// (.+)$#){ $flg = 1; $word = $1; $text = $2; $line = $_; if($word =~ / /){ #熟語なら if(length($word) > 15){ $flg = 0; } elsif($word =~ /([A-Za-z]+) ([A-Za-z]+)/){ if(length($1) > 5 && length($2) > 5){ $flg = 0; } } } if($text =~ m#/#){ $text =~ s#/ .+##g; } } if($flg){ print $word.' /// '.$text."\n"; } }

    • ベストアンサー
    • Perl
  • プログラム/perl カウントについて

    プログラム初心者です. 現在,プログラムの書き換えを行っているところです. (言語はperlです 以下のプログラムのnextの前に, 「$bbをカウントし, $bbが2回出てきたらlast」 というプログラムを書きたいと思っています. ------------------------ if($honbun =~ /$boundary/) { $bb++;         if($bb >=2)         {      last; } next; } ---------------- カウントする変数を使うべきだと思うのですが,どのようにすればいいでしょうか; 初心者質問で申し訳ないです.

  • perlプログラムについて

    前回の質問で補足すればよかったのですが,ミスしてしまったので^^; 同じような質問ですがもう一度・・・ (プログラム初心者です) 「もし,aaaという文字列が2個以上存在する時は,最初のaaaを使う」 を, perl で書きたいと思っております.書いてみたものは以下です. ----------- if (aaa >=2) { 最初のaaaを使う } ----------- いろいろと間違えてそうですが... 「最初のaaaを使う」 という表現がわかりません>< 間違い・こうしたほうがいいよ などありましたら御願いします!

    • ベストアンサー
    • Perl
  • CSVファイルをperlプログラムで処理する場合

    すみません、度々perl初心者のものです。 CSVファイルを1行ずつ読み込んで処理をしたい場合、 1項目内のデータの中に改行がある場合、 どのような方法で対処出来るでしょうか? 例えば "aaa,bbb,ccc ddd,eee,fff" 上記のようにcccとdddの間に改行が入ってるため 本当は1レコードのはずなのに2レコードとして 処理を行ってしまう。 perlで何かやり方はあるのでしょうか? csvを加工するのもよいのですが、データが多量に あるため、プログラム上でなんとかしたいと思うのですが。。。 すみません、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Perlのforkについて

    PerlでDBに格納するプログラムを作成しています。 パラレルで行ないたいためにforkを使っているのですが、 いまいちわかっていないのでご教授ください。 やりたいことはパラレルでのDB格納です。 親、子両方のプロセスが完了したら後続処理を行い、 0を戻したいのですが、下記の方法ですと、 子が終了したらprintしてからreturnしているようです。 このように、親子の処理が完了したら後続処理に移るようにするためには どうしたらよいのでしょうか? if ($pid = fork()) { #親プロセス insertDB(); wait; return 0; } else { insertDB(); } print"ここは最後に通したい"\n;

    • ベストアンサー
    • Perl
  • Perlプログラムにおいて、入力されたパスワードをif文で比較させたい

    Perlプログラムにおいて、入力されたパスワードをif文で比較させたい。 今、Perlプログラムを使ってホームページでクイズを作成中です。 そこで、教えて頂きたいのですが、ホームページに入れる人は、事前に通知した人にのみで、パスワード入力をしてもらう方式にしたいと思っています。 パスワードも一人一人に違うものではなく、3種類程度を考えています。 Perlプログラムの中に if ($passwd eq '1234') 程度に考えています。 でも、Perlプログラムソースを見られたら一目瞭然で判ってしまいます。 プロバイダはniftyで、index.cgiのファイル名にします。 基本的な質問で恐縮ですが、もっと良い方法、注意しないといけない点、などを教えて下さい。

    • ベストアンサー
    • Perl
  • 難問?Perlの文字列置換について

    下記のプログラムをベースにして置換を行いたいです。 use File::Basename; use File::Copy; use File::Find; use File::Path; my @filelist = (); $inputfile='C:\Users\test.txt'; $outputfile='C:\Users\test_new.txt'; open (IN, $inputfile) or die "$!"; open (OUT, ">$outputfile") or die "$!"; while(<IN>) { $str = $_; if ($str =~ / ・・・・・ ・・・・・ } print OUT $str; } close (IN); close(OUT); sub wanted{ push(@filelist, $File::Find::dir."/$_") unless ($_ =~ /^\.$/); } Perlプログラムで下記の2つのソースを一括置換しようとしてます。 (1) paramIdとparamNameの文字列が同一の場合 <html:link styleClass="push" action="/numa.do" paramId="Id" paramName="Id" onclick="URL">ソース</html:link> (2) paramIdとparamNameの文字列が同一でない場合 <html:link styleClass="push" action="/numa.do" paramId="Id" paramName="Name" onclick="URL">ソース</html:link> やりたいことは ・ html:linkをs:aに変換 ・ styleClassをcssClassに変換(これはわかるのですが位置の修正がわかりません。。) ・ action="/numa.do"を/numaに変換 ・ paramIdとparamNameを文字列が同一か同一でないかで分岐処理したい。 目標は以下のように置換したいです。 (1) paramIdとparamNameの文字列が同一の場合 <s:a href="/numa?Id="%{ Id }" cssClass="push" onclick="URL">ソース</s:a> (2) paramIdとparamNameの文字列が同一でない場合 <s:a href="numa" paramId="Id" paramName="Name" cssClass="push" onclick="URL">ソース</s:a> どうしてもこの置換ができません、、誰かぜひ教えてください。 お願い致します。

    • ベストアンサー
    • Perl
  • タグにはさまれている文字以外を置換したい

    あるマルチバイト文字列に対して、特定の文字を正規表現で置換したいのです。 そのマルチバイト文字列には、htmlの<a>タグが混じっています。(混じっていない場合もあります。) 置換したいのは、<a>タグで囲まれている文字以外の文字なのですが、正規表現としてどのようなパターンにすれば出来るのか悩んでおります。 ------------------------------------------------- //置換前のマルチバイト文字列 "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" //検索・置換対象となる文字列 "コーヒー" //置換を行う文字列 "紅茶" //置換後のマルチバイト文字列 "朝一番の紅茶は<a href="index.html">3時のコーヒーや</a>食後の紅茶より旨い" ------------------------------------------------- ↓こちらを参考にしてみたのですが、ちょっとやりたいことと違うみたいでうまくいきませんでした。 http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside ================================================= $string = "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" $pattern = '/((?:\G|>)[^<]*?)コーヒー/'; $result = mb_ereg_replace($pattern, '\1紅茶', $string); echo $result; ================================================= 是非、皆様に力を貸して頂きたく、どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • /etc/aliasesを使ってPerlプログラムを起動

    初めまして、wantedと申します。 以下のご回答宜しくお願い致します。 メールサーバにSendMailを使っており、/etc/aliasesを使ってPerlプログラムを起動するようにしています。 このプログラムで、受信したメールに添付してあるcsv形式のファイルの内容を解析したいのですが、添付したファイルの内容を取得するには、どうしたらいいのでしょうか?