これ何て呼びますか

おはようございます。いつもお世話になっています。
今回は解析機能の拡張についてお聞きしたいと思います。

解析機能については、かんたん作成.comさんのcgiをお借りしました。
http://www7a.biglobe.ne.jp/~wwwwww/analyzer/

これをベースに、検索ワードの集計機能を追加しようと思っております。
word1、word2に検索ワードの表示・分割がありますが、新たにword3を設けて分割されたものを集計し、表示する処理をしたいです。
集計については、前回までで教えていただいた正規表現を用いて自ら組んでみたのですが、変数が一致していないせいか上手く表示できません。
以下に検索ワードを処理しているプログラムを記載します。

elsif($FORM{'mode'} eq "word1" or $FORM{'mode'} eq "word2" or $FORM{'mode'} eq "word3") { #検索ワード
my ($n, $pair, $word);
if($referer =~ /\?/) {
my ($url, $query) = split(/\?/, $referer);
for($n = 0 ; $n < @search ; $n++) {
if($url =~ /$search[$n][1]/) {
foreach $pair (split(/&/, $query)) {
my ($key, $value) = split(/=/, $pair);
if($key eq $search[$n][2]) {
$word = $value;
last;
}
}
last;
}
}
if($word) {
$word =~ tr/+/ /;
$word =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
if($FORM{'mode'} eq "word1") {
++$freg{$word};
}
elsif($FORM{'mode'} eq "word2") {
my $word2;
$word =~ s/\x81\x40/ /g;
foreach $word2 (split(/\s+/, $word)) {
if($word2) {
++$freg{$word2};
}
}
}
#=====================================================================EDIT
elsif($FORM{'mode'} eq "word3") {
my %word_of = map {$_ => 0} %freg;
foreach my $search_key ( keys %word_of ) {
foreach my $word ( keys %word_of ) {
$word_of{$search_key}++ if $word =~ /$search_key/;
}
}
foreach ( sort ( keys %word_of ) ){
print "<table><tr><td>「$_」 </td><td> $word_of{$_} 件</td></table>\n";
}
}
#=====================================================================END
}
}
}
}

word3の項目が現在私が編集している部分です。
プログラム全体を通して、私自身が望む動作を可能とする部分の追加は行ったと思うのですが、見落としている点があるかもしれません。
また前述したように、変数が一致していないのかもしれません。

おかしな点に気づかれたら、お手数ですがお教え願えますか。
もしかしたら初歩的なミスをしているかもしれませんが、よろしくお願いいたします。

不明な点などございましたら、随時対応します。
ここでは書ききれないため、現在編集中のcgiファイルを添付データとして貼り付けておきます。

A 回答 (4件)

>>%freg = map {$_ => 0} keys %freg;


>最初の%fregは,自分で定める値ですよね?
>だとすると,%fregはすでに存在している変数なので,別の名前にしようとおもいます.

後ろのコードで、%fregに入った値を表示していますので、%fregに値を入れてください。

>>foreach my $word ( keys %freg ) {
>の,$wordも既に存在している変数なので,$wordsに名前を変えました.

my $wordとレキシカル変数宣言していますので、変える必要はないと思いますが、
もちろん変えてもかまいません。

>>$freg{$search_key}++ if $word =~ /$search_key/;
>にて,「Unmatched [ before HERE mark in regex.」というエラーが出てしまいました.

エラーの意味はちょっと分かりませんが、文字コードがShit-JISならばそれに絡む
エラーかもしれません。

その場合は、以下のようにするとエラーが出なくなると思います。

$freg{$search_key}++ if $word =~ /\Q$search_key\E/;
    • good
    • 0

前半がデータを集計するコード(%fregというハッシュに集計データが入る)で、


後半がその集計したデータを表示するコードだと思います。

No.2の改造では、"word3"モードのとき、表示するコードも書いてしまったので、
表示がダブってしまったのだと思います。

表示は既存のコードにまかすのがスマートだと思いますので、以下の改造ではどうで
しょうか?

#-- 変更 ---------------------------------------------------------
elsif($FORM{'mode'} eq "word1" or $FORM{'mode'} eq "word2" or $FORM{'mode'} eq "word3") { #検索ワード
#-----------------------------------------------------------------
my ($n, $pair, $word);
if($referer =~ /\?/) {
my ($url, $query) = split(/\?/, $referer);
for($n = 0 ; $n < @search ; $n++) {
if($url =~ /$search[$n][1]/) {
foreach $pair (split(/&/, $query)) {
my ($key, $value) = split(/=/, $pair);
if($key eq $search[$n][2]) {
$word = $value;
last;
}
}
last;
}
}
if($word) {
$word =~ tr/+/ /;
$word =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
if($FORM{'mode'} eq "word1") {
++$freg{$word};
}
#-- 変更 ---------------------------------------------------------
elsif($FORM{'mode'} eq "word2" or $FORM{'mode'} eq "word3") {
#-----------------------------------------------------------------
my $word2;
$word =~ s/\x81\x40/ /g;
foreach $word2 (split(/\s+/, $word)) {
if($word2) {
++$freg{$word2};
}
}
}
}
}
}
}
#-- 追加 ---------------------------------------------------------
if($FORM{'mode'} eq "word3") {
%freg = map {$_ => 0} keys %freg;
foreach my $search_key ( keys %freg ) {
foreach my $word ( keys %freg ) {
$freg{$search_key}++ if $word =~ /$search_key/;
}
}
}
#-----------------------------------------------------------------
    • good
    • 0
この回答へのお礼

早速のお返事ありがとうございます.
確かに,既存の表示コードに任せてしまった方がシステムとしても素直になりますね.

ですが,最後のif文でやはりエラーが出てしまいます.
>%freg = map {$_ => 0} keys %freg;
最初の%fregは,自分で定める値ですよね?
だとすると,%fregはすでに存在している変数なので,別の名前にしようとおもいます.それから,
>foreach my $word ( keys %freg ) {
の,$wordも既に存在している変数なので,$wordsに名前を変えました.

このプログラムですと,
>$freg{$search_key}++ if $word =~ /$search_key/;
にて,「Unmatched [ before HERE mark in regex.」というエラーが出てしまいました.
初歩的なエラーかもしれませんが,このエラーはどういったものなのでしょうか?

お忙しいかとは思いますが,よろしくお願いします.
お手数おかけします.

お礼日時:2009/10/13 14:55

すいません、No.1ではなく、こうではないかなと思います。



#-- 変更 ---------------------------------------------------------
elsif($FORM{'mode'} eq "word1" or $FORM{'mode'} eq "word2" or $FORM{'mode'} eq "word3") { #検索ワード
#-----------------------------------------------------------------
my ($n, $pair, $word);
if($referer =~ /\?/) {
my ($url, $query) = split(/\?/, $referer);
for($n = 0 ; $n < @search ; $n++) {
if($url =~ /$search[$n][1]/) {
foreach $pair (split(/&/, $query)) {
my ($key, $value) = split(/=/, $pair);
if($key eq $search[$n][2]) {
$word = $value;
last;
}
}
last;
}
}
if($word) {
$word =~ tr/+/ /;
$word =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
if($FORM{'mode'} eq "word1") {
++$freg{$word};
}
#-- 変更 ---------------------------------------------------------
elsif($FORM{'mode'} eq "word2" or $FORM{'mode'} eq "word3") {
#-----------------------------------------------------------------
my $word2;
$word =~ s/\x81\x40/ /g;
foreach $word2 (split(/\s+/, $word)) {
if($word2) {
++$freg{$word2};
#-- 追加 ----------------
push @search_words, $word2;
#------------------------
}
}
}
}
}
}
}
#-- 追加 ---------------------------------------------------------
if($FORM{'mode'} eq "word3") {
my %word_of = map {$_ => 0} @search_words;
foreach my $search_key ( keys %word_of ) {
foreach my $word ( keys %word_of ) {
$word_of{$search_key}++ if $word =~ /$search_key/;
}
}
foreach ( sort ( keys %word_of ) ){
print "<table><tr><td>「$_」 </td><td> $word_of{$_} 件</td></table>\n";
}
}
#-----------------------------------------------------------------

この回答への補足

回答ありがとうございます.
現在動作環境のもと,お教えいただいたプログラムに変更してみたところ,動作がページに反映されず,空白のページでした.

ご丁寧に教えていただいたのに申し訳ありません.
変数が一致していないのでしょうか?それともほかに原因があるのでしょうか.

度々お手数をお掛けしますが,宜しくお願いします.

補足日時:2009/10/13 10:01
    • good
    • 0
この回答へのお礼

お礼から失礼します.
教えてくださったプログラムを確認したところ,こちらの変数のタイプミスで表示がされなかったことが判明しました.
度々申し訳ありません.

一応表示はできたのですが,word2で設けたページと同じ処理がword3でも反映されてしまいます.
>elsif($FORM{'mode'} eq "word2" or $FORM{'mode'} eq "word3") {
と,word2で行う処理の部分にword3も同時に設けているのが原因でしょうか?

if($FORM{'mode'} eq "word1") {
(省略)
}
elsif($FORM{'mode'} eq "word2") {
(省略)
}
elsif($FORM{'mode'} eq "word3") {
(省略)
}
と,それぞれのページの指定を行っていると私は解釈していました.

なので,最後に追加するif文の内容がページに反映されていないと思うのですが,どうでしょうか?
厚かましいかとは思いますが,ご意見をいただけたら嬉しいです.

私なりにもいろいろといじってみたいと思います.
ご都合がついた時でよろしいので,引き続き宜しくお願いします.

お礼日時:2009/10/13 11:17

実際に動かすことができないので私自身が検証できてませんが、以下のように追加


した場合、所望の動作は得られないでしょうか?

elsif($FORM{'mode'} eq "word1" or $FORM{'mode'} eq "word2") { #検索ワード
my ($n, $pair, $word);
if($referer =~ /\?/) {
my ($url, $query) = split(/\?/, $referer);
for($n = 0 ; $n < @search ; $n++) {
if($url =~ /$search[$n][1]/) {
foreach $pair (split(/&/, $query)) {
my ($key, $value) = split(/=/, $pair);
if($key eq $search[$n][2]) {
$word = $value;
last;
}
}
last;
}
}
if($word) {
$word =~ tr/+/ /;
$word =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
if($FORM{'mode'} eq "word1") {
++$freg{$word};
#-- 追加 ----------------
push @search_words, $word;
#------------------------
}
elsif($FORM{'mode'} eq "word2") {
my $word2;
$word =~ s/\x81\x40/ /g;
foreach $word2 (split(/\s+/, $word)) {
if($word2) {
++$freg{$word2};
#-- 追加 ----------------
push @search_words, $word2;
#------------------------
}
}
}
}
}
}
}
#-- 追加 ---------------------------------------------------------
if($FORM{'mode'} eq "word3") {
my %word_of = map {$_ => 0} @search_words;
foreach my $search_key ( keys %word_of ) {
foreach my $word ( keys %word_of ) {
$word_of{$search_key}++ if $word =~ /$search_key/;
}
}
foreach ( sort ( keys %word_of ) ){
print "<table><tr><td>「$_」 </td><td> $word_of{$_} 件</td></table>\n";
}
}
#-----------------------------------------------------------------
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
諸事情により返答が遅れてしまって本当に申し訳ありませんでした。

本日動作環境の整った場所で教えていただいたプログラムを動かしてみようと思います。
丁寧な対応ありがとうございましたー

お礼日時:2009/10/12 11:22

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