kumoz の回答履歴

全323件中161~180件表示
  • xmlから組み合わせ情報を得たい

    最近Perlを使い始めたものです。 Perlを用いてxmlデータから、組み合わせの情報を取り出したいと思っています。 どのようにプログラムを書けばできるか教えていただけないでしょうか。 例えば以下のようなxmlがあるとします。 -------------------------- <name>A</name> <keywords> <keyword>a</keyword> <keyword>b</keyword> </keywords> ・ ・ <name>B</name> <keywords> <keyword>c</keyword> <keyword>d</keyword> </keywords> ・ ・ ------------------------------ このとき、AとBを選んだら、以下のようにキーワードの組み合わせを表示するようにしたいです。 a-b a-c a-d b-c b-d c-d

    • ベストアンサー
    • riyoooh
    • Perl
    • 回答数1
  • 以前、ご質問させていただき、ご回答をいただいたのですが、

    以前、ご質問させていただき、ご回答をいただいたのですが、 'server0[123]', 'client0[1-35-7]', 'client0[13-69]', 'client[1-3][0-9]' の文字判定をお聞きし、自分なりにサブルーチン化して対応いたしましたが、 このたび 'server0[1-3]0','server0[1-3]2','client0[a-z1]',client[a-c][12] 等の文字列も判定する必要がでてきました。 sub host{ my @reg_str = @_; my (@work, @result); foreach my $reg_str (@reg_str) { if ($reg_str = ~/\[/ ){ my $head = substr($reg_str, 0, index($reg_str, '[')); my @num = map { s/(\d)-(\d)/join('', $1 .. $2)/eg; [split //] } $reg_str =~ /\[([\d-]+)\]/g; @ref_result = (); @ref_result = comb(@num); print join(',', map { $head . $_ } @result), "\n\n"; }else{ print "$reg_str\n"; } sub comb { my $ref = shift; @result = (); foreach my $i (@$ref) { push @work, $i; unless (@_) { push @result, join('', @work); } else { comb(@_); } pop @work; } return (@result); } } 'server0[123]', 'client0[1-35-7]', 'client0[13-69]' の分解は可能なのですが、 'client[1-3][0-9]' は client10,client11,client12・・・・・・client37,client38,client39 となってほしいのですが、 client31,client32・・・・・,client38,client39となってしまいます。 また括弧の後ろに括弧無しがきた場合は、うまく展開できません。 お忙しいところ、誠にくだらない質問かもしれませんが、お力をお借りできれば幸いです。 よろしくお願いします。

    • ベストアンサー
    • koga8940
    • Perl
    • 回答数2
  • 2回以上繰り返される文字列の削除について

    以下の文字列(置換前)で、-aaa について複数存在しているので、 最初の -aaa を残して残りの -aaa をすべて削除したいと考えています。 1回の正規表現+置換で行いたいのですが、どのようにいすればよいでしょうか? 【置換前】 -bbb -aaa -ccc -aaa -ddd -eee -aaa -fff 【置換後】 -bbb -aaa -ccc -ddd -eee -fff ちなみに、複数回の正規表現+置換を使ってよい場合は、 while (m/( -aaa.*) -aaa/) { s/( -aaa.*) -aaa/$1/; } でできると考えています。(動作確認まではしていないので間違ってるかも)

    • ベストアンサー
    • entree
    • Perl
    • 回答数2
  • perl初心者です。

    perl初心者です。 正規表現で記載された下記のような文字列を以下のように書き換えたいのです。 server0[123] client[1-3][0-9] ↓↓ server01,server02,server03 client10,client11........client38,client39 よろしくお願いします

    • ベストアンサー
    • koga8940
    • Perl
    • 回答数3
  • perl初心者です。

    perl初心者です。 正規表現で記載された下記のような文字列を以下のように書き換えたいのです。 server0[123] client[1-3][0-9] ↓↓ server01,server02,server03 client10,client11........client38,client39 よろしくお願いします

    • ベストアンサー
    • koga8940
    • Perl
    • 回答数3
  • サブルーチンについて

    下記のようなソースコードを書いたところエラーが出てしまいました。 $sum = $sample2($a); の箇所でエラーが起こっているようなのですが、解決の仕方が分かりません。 &sample1(5,'&sample2'); sub sample1 { ($a,$sample2) = @_; $sum = $sample2($a); print $sum; } sub sample2 { ($a) = @_; $b = 10; $sum = $a + $b; return $sum; } このように、サブルーチンの中に更にサブルーチンを書いて、なおかつそのサブルーチン名を一旦変数に格納して使用する場合はどのようにプログラムを書けば良いのでしょうか?? ""で囲ったりといろいろとしてもダメでした。 もちろん、$sum = $sample2($a); ではなく $sum = sample2($a); のように書けば良いとは思うのですが、一度サブルーチン名を変数に入れてから使用する場合はどのようにすれば良いのでしょうか?? ご回答の程よろしくお願い致します。

    • ベストアンサー
    • rrr88
    • CGI
    • 回答数4
  • perlでの正規表現について

    文字列のなかの"<タグ>(アルファベット1文字)"すべてに対して置換処理をさせたいのですがうまく動作しません。 現在はこう記述しております。 $str=~ s/(~<(.*?)>\w)/置換文字列/g; 良い方法があれば教えていただけると助かります。

  • awk 正規表現を使って置換

    あるファイルの中の2列目に含まれる "ab" "ac" "ae" という文字列をそれぞれ "zb" "zc" "ze"に置き換えたいのですが、awkまたはsedで正規表現を使って効率のいい方法はないでしょうか。 awk ' { gsub(/ab/,"zb",$2); gsub(/ac/,"zc",$2); gsub(/ae/,"ze",$2); print }' testfile でやりたいことはできるのですが、「aの後にb,c,eが続く場合にaをzに置換する」というアイディアを使えばもっと効率のよいスクリプトが書けるはず、と思いつつ、awkの勉強を始めたばかりでなかなか思い浮かびません。 testfileの中身は以下の通り: abcde abaab aaaae acbec accee adabd dceba aeecs hhhgf sbacc 以下のような出力を望んでいます: abcde zbazb aaaae zcbec accee adzbd dceba zeecs hhhgf sbzcc awk ' BEGIN { var = "[bce]" } { gsub("a"var,"z"var,$2); print }' だと "zb" "zc" "ze"ではなくすべて"z[bce]"に置き換わってしまうし、 awk ' BEGIN { var = "[bce]" } { gsub("a"var,"z&",$2); print }' だと"zab" "zac" "zae"になってしまうし… まずはawk,sedで勉強したいと思っていますが、それ以外でもいい案がありましたら教えてください。よろしくお願いします。

  • awk 正規表現を使って置換

    あるファイルの中の2列目に含まれる "ab" "ac" "ae" という文字列をそれぞれ "zb" "zc" "ze"に置き換えたいのですが、awkまたはsedで正規表現を使って効率のいい方法はないでしょうか。 awk ' { gsub(/ab/,"zb",$2); gsub(/ac/,"zc",$2); gsub(/ae/,"ze",$2); print }' testfile でやりたいことはできるのですが、「aの後にb,c,eが続く場合にaをzに置換する」というアイディアを使えばもっと効率のよいスクリプトが書けるはず、と思いつつ、awkの勉強を始めたばかりでなかなか思い浮かびません。 testfileの中身は以下の通り: abcde abaab aaaae acbec accee adabd dceba aeecs hhhgf sbacc 以下のような出力を望んでいます: abcde zbazb aaaae zcbec accee adzbd dceba zeecs hhhgf sbzcc awk ' BEGIN { var = "[bce]" } { gsub("a"var,"z"var,$2); print }' だと "zb" "zc" "ze"ではなくすべて"z[bce]"に置き換わってしまうし、 awk ' BEGIN { var = "[bce]" } { gsub("a"var,"z&",$2); print }' だと"zab" "zac" "zae"になってしまうし… まずはawk,sedで勉強したいと思っていますが、それ以外でもいい案がありましたら教えてください。よろしくお願いします。

  • die関数のエラー出力先について

    いつもお世話になっております。 以下のようなスクリプトを書き、 imapサーバの死活監視を行おうと思っております。 ################################# my $imap = Mail::IMAPClient->new( Server => $hostname, User => $username, Password => $password, Timeout => 5, ) or die "Cannot connect to $hostname imap:143. $!"; -------処理は続きますが割愛------- ################################# そこで、1つ壁にぶつかったので質問いたしました。 +++壁の内容+++ imapサーバに何らかの理由で接続できなかったケースを考慮して、 die関数を使おうと思ったのですが、 このdie関数は、「引数に指定した値を標準エラー出力に出力」するとのことなのですが、 引数に指定した値を任意のファイルに出力する方法はないのでしょうか?? +++やりたいことの背景+++ imapサーバを監視するPerlスクリプトは、 実行するたびに指定したファイルに実行結果と実行時間を出力したい。 実行結果と実行時間を出力したファイルを 別の監視プログラムが監視するという二重構造の監視を行いたい。 imapサーバを監視するPerlスクリプトの実行結果を、 どうしても任意のファイルに出力したい。 +++++++++++++++++++++++++++++++++ 以上です。 よろしくお願いします。

    • ベストアンサー
    • taikimuru
    • Perl
    • 回答数8
  • die関数のエラー出力先について

    いつもお世話になっております。 以下のようなスクリプトを書き、 imapサーバの死活監視を行おうと思っております。 ################################# my $imap = Mail::IMAPClient->new( Server => $hostname, User => $username, Password => $password, Timeout => 5, ) or die "Cannot connect to $hostname imap:143. $!"; -------処理は続きますが割愛------- ################################# そこで、1つ壁にぶつかったので質問いたしました。 +++壁の内容+++ imapサーバに何らかの理由で接続できなかったケースを考慮して、 die関数を使おうと思ったのですが、 このdie関数は、「引数に指定した値を標準エラー出力に出力」するとのことなのですが、 引数に指定した値を任意のファイルに出力する方法はないのでしょうか?? +++やりたいことの背景+++ imapサーバを監視するPerlスクリプトは、 実行するたびに指定したファイルに実行結果と実行時間を出力したい。 実行結果と実行時間を出力したファイルを 別の監視プログラムが監視するという二重構造の監視を行いたい。 imapサーバを監視するPerlスクリプトの実行結果を、 どうしても任意のファイルに出力したい。 +++++++++++++++++++++++++++++++++ 以上です。 よろしくお願いします。

    • ベストアンサー
    • taikimuru
    • Perl
    • 回答数8
  • SSIの条件分岐(変数が空欄)の書き方

    ssiでアドレスの引数を参照するのに$QUERY_STRINGを使いますが、 条件分岐で「$QUERY_STRINGが空欄(なし)のとき」という書き方が分かりません。 <!--#if expr="$QUERY_STRING = " --> でいいのでしょうか

  • web文書を取得するプログラムのサイト内での不具合について

    perl初心者です。 自分のwebサイトのコードを取得するプログラムをつくろう と思っているのですが、下のコード -------------------------------------------------------- #!/usr/local/bin/perl use LWP::UserAgent; use HTTP::Request; use HTTP::Response; our $URL = 'http://www.google.co.jp/'; # アクセスする URL my $proxy = new LWP::UserAgent; my $req = HTTP::Request->new('POST' => $URL); # HTTP リクエストを作成 my $res = $proxy->request($req); # $res に HTTP レスポンスが返ってくる print $res->content; # HTML を表示 1; --------------------------------------------------------------- でターゲットのurlが上のgoogleだと取得できるんですが 自サイトのurl'http://○○.××.△△.com/'だと 500 Internal Server Errorとなってしまいます。 因みにレンタルサーバーを利用しています。 サーバーでは技術的な質問は受け付けてないとの事なので、 スクリプトの質問とは少しズレますが分る方がいましたら ご教えていただきたく質問いたしました。

    • 締切済み
    • Guree
    • Perl
    • 回答数4
  • エクセルで編集したCSVファイルを読み込むときに

    よろしくお願い致します。 エクセルで編集したCSVファイルを読み込み、HTMLとして表示するCGIがあります。 エクセルでCSVファイルを編集すると最後の項目の後にカンマ(,)が付かないのですが、 使用しているCGIでは、カンマがないと行が改行されたとみなされません。 行の最後にカンマがなくても行を改行させるには、どのようなコードを追加すればよいのでしょうか? CGIのCSVファイルの読み込みする部分のコードは以下のようになっています。 # ログファイル読み込み my $LOG_FILE = 'log.csv'; my $io = IO::File->new($LOG_FILE, 'r') or die $!; flock($io, 1); while(my $line = $io->getline) { push @ids, (split(/,/, $line))[0]; push @new_checks, (split(/,/, $line))[1]; push @dates, (split(/,/, $line))[2]; push @contents, (split(/,/, $line))[3]; push @contents2, (split(/,/, $line))[4]; push @contents3, (split(/,/, $line))[5]; push @contents4, (split(/,/, $line))[6]; push @contents5, (split(/,/, $line))[7]; push @contents6, (split(/,/, $line))[8]; } 分かりにくい説明で申し訳ありません。 補足説明も致しますので、どうぞよろしくお願い致します。

    • ベストアンサー
    • patsaysnow
    • CGI
    • 回答数3
  • AND検索がうまくできない

    登録したデータを検索するPerlを制作しています。 #$in{word}は入力されたキーワードで、半角スペースまたは全角スペースでキーワードを分割 @word = split(/\s| /,$in{word}); $count = @word; #@dataは検索対象となるデータ foreach $data (@data){  $a = 0;  while ($a < $count){   if($data =~ /$word[$a]/){    push(@query, $data);    last;   }   $a++;  } } こんな感じでAND検索できるようにしてみたのですが、エラーになります。 Perlチェックをかけてみると構文はOKと出ます 複数語、つまりAND検索でなく1つの言葉(@wordが1つだけ)の場合はうまくいきます また、逆にif($data =~ /$word[$a]/){をなしにしてやれば(これをはずすと検索にならず全ヒットになりますが)複数ワードでも正しく表示されます $aや$count、@word、$word[$a]などが正しくできていないのかと思い、それを表示させて確認してみましたが、きちんと代入され、やりとりできているようなのですが、どこに問題があるのでしょうか。 数日間ネットで調べ、色々試し、本も開いて色々検証しましたがどうしてもわかりません。 間違いをご指摘ください PS プログラム部分の右へインデントしているところは半角スペースやタブだとこのページでは無視されるようなので、見やすくするため全角スペースでずらしていますが、実際のプログラム中ではここに全角スペースなんぞ使っておりません

    • ベストアンサー
    • choei
    • Perl
    • 回答数4
  • 範囲演算子と文字列マッチングを組み合わせたときの解除方法

    Windows-XP上でActivePerl/5.8.8を利用しています。 テキストファイルなどで、ある文字列が現れた行から、ある文字列が現れるまで、 ということを判定させるときに、範囲演算子が使えるということを知りました。 while(<>){     chomp;     if(/^START$/ .. /^END$/){ # 範囲指定         ・・・         STARTの行から、ENDの行までこのブロックに入る     } } 1ファイルに対してだけ処理させるときは上手く行くのですが、 連続して複数のファイルを処理させようとすると、 2番目のファイルからは、開始条件(/^START$/)が既に成立したと 判断されてしまうようで、該当行が現れていないのに、ifブロックに 入ってしまいます。 foreach(@ARGV){ # 複数ファイルに対して処理させる     open(FH,$_) || die;     while(<FH>){        chomp;        if(/^START$/ .. /^END$/){ # 範囲指定            ・・・            1つ目のファイルではSTARTの行から、ENDの行まででこのブロックに入るが、            2つ目のファイルではSTARTの行が現れないうちからこのブロックに入ってしまう。        }     } close(FH); } これを2つ目のファイル以降も、範囲指定の開始条件が成立していない 状態から処理させるためには、どのようにすれば良いでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • goku3
    • Perl
    • 回答数9
  • 範囲演算子と文字列マッチングを組み合わせたときの解除方法

    Windows-XP上でActivePerl/5.8.8を利用しています。 テキストファイルなどで、ある文字列が現れた行から、ある文字列が現れるまで、 ということを判定させるときに、範囲演算子が使えるということを知りました。 while(<>){     chomp;     if(/^START$/ .. /^END$/){ # 範囲指定         ・・・         STARTの行から、ENDの行までこのブロックに入る     } } 1ファイルに対してだけ処理させるときは上手く行くのですが、 連続して複数のファイルを処理させようとすると、 2番目のファイルからは、開始条件(/^START$/)が既に成立したと 判断されてしまうようで、該当行が現れていないのに、ifブロックに 入ってしまいます。 foreach(@ARGV){ # 複数ファイルに対して処理させる     open(FH,$_) || die;     while(<FH>){        chomp;        if(/^START$/ .. /^END$/){ # 範囲指定            ・・・            1つ目のファイルではSTARTの行から、ENDの行まででこのブロックに入るが、            2つ目のファイルではSTARTの行が現れないうちからこのブロックに入ってしまう。        }     } close(FH); } これを2つ目のファイル以降も、範囲指定の開始条件が成立していない 状態から処理させるためには、どのようにすれば良いでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • goku3
    • Perl
    • 回答数9
  • 正規表現について

    どうも納得出来ない動作なので質問させてください。 下記のようにコマンドを打ち込んだとします。 ---------- grep -E ^A.*$Z ファイル名 ---------- ■ファイル内容 Ab3dZ abdddZ AZ 234$Z F****Z ---------- すると「Ab3dZ」と「AZ」が引っかかります。 「.」は任意の一文字、「*」は0回以上の繰り返しをあらわすと認識しております。 そうすると、なぜ「Ab3dZ」が引っかかるのかが良く分かりません。 教えて頂けないでしょうか。 宜しくお願いします。

  • 大文字と小文字を区別しない検索にする方法

    勉強する間もなく手探りでフリーCGIの改造をさせて頂いています。 if ゃ foreach などは分かりやすいですが、変数の意味が良く理解できていません。 どうぞお力添えをお願い致します。 現在、フリーのCGIでデータ登録と検索をしていますが、大文字と小文字の 区別を無くしたものにするにはどうすればよいでしょうか? 1) AbcDe も abcde も同じにしたい。 2) 可能なら全角と半角も区別無しにしたい。   ただ、2の方は漢字も使うので難しいでしようか? iオプションを使えとの記述を見ましたが、どこを変えるのか解りません。 ソースを載せますので、ご指導宜しくお願い致します。 # 入力内容を整理 $in{'word'} =~ s/\x81\x40/ /g; @wd = split(/\s+/, $in{'word'}); @find=(); $i=0; # 検索処理 foreach (@line) { $flag = 0; foreach $wd (@wd) { if (index($_,$wd) >= 0) { $flag = 1; if ($in{'cond'} eq 'OR') { last; } } else { $andor="and 検索"; if ($in{'cond'} eq 'AND') { $flag=0; last; } $andor="or 検索"; } } # ヒットした場合 $view = $in{'viewc'}; if ( $view eq '' ) { $view = $views } if ($flag) { $i++; next if ($i < $page + 1); next if ($i > $page + $view); push(@find,$_); } } # 検索終了

    • ベストアンサー
    • asdfg456
    • CGI
    • 回答数4
  • bashでのif文内正規表現についての

    bashでのif文内正規表現についての質問です。 IPアドレスを正規表現にてマッチングさせたいのですが実現できなく困っています。 たとえば192.168.1.の1から128を引っ掛けたいのですがどうすれば実現できますか? 今は下記のように書いていますが、これではだめみたいです。 ARCHKIP=`netstat -rn | awk '{ print $1 }'` for i in `echo $ARCHKIP` do if [[ $i = 192.168.1.[1-128] ]];then echo "OK" fi done わかる方お教えください。