![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_06.png?e8efa67)
おはようございます。いつもお世話になっています。
今回は解析機能の拡張についてお聞きしたいと思います。
解析機能については、かんたん作成.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件)
- 最新から表示
- 回答順に表示
No.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/;
No.3
- 回答日時:
前半がデータを集計するコード(%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/;
}
}
}
#-----------------------------------------------------------------
早速のお返事ありがとうございます.
確かに,既存の表示コードに任せてしまった方がシステムとしても素直になりますね.
ですが,最後の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.」というエラーが出てしまいました.
初歩的なエラーかもしれませんが,このエラーはどういったものなのでしょうか?
お忙しいかとは思いますが,よろしくお願いします.
お手数おかけします.
No.2
- 回答日時:
すいません、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";
}
}
#-----------------------------------------------------------------
この回答への補足
回答ありがとうございます.
現在動作環境のもと,お教えいただいたプログラムに変更してみたところ,動作がページに反映されず,空白のページでした.
ご丁寧に教えていただいたのに申し訳ありません.
変数が一致していないのでしょうか?それともほかに原因があるのでしょうか.
度々お手数をお掛けしますが,宜しくお願いします.
お礼から失礼します.
教えてくださったプログラムを確認したところ,こちらの変数のタイプミスで表示がされなかったことが判明しました.
度々申し訳ありません.
一応表示はできたのですが,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文の内容がページに反映されていないと思うのですが,どうでしょうか?
厚かましいかとは思いますが,ご意見をいただけたら嬉しいです.
私なりにもいろいろといじってみたいと思います.
ご都合がついた時でよろしいので,引き続き宜しくお願いします.
No.1
- 回答日時:
実際に動かすことができないので私自身が検証できてませんが、以下のように追加
した場合、所望の動作は得られないでしょうか?
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";
}
}
#-----------------------------------------------------------------
回答ありがとうございます!
諸事情により返答が遅れてしまって本当に申し訳ありませんでした。
本日動作環境の整った場所で教えていただいたプログラムを動かしてみようと思います。
丁寧な対応ありがとうございましたー
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Word(ワード) PCで作ったwordをスマホで編集しようとすると「このファイルは読み取り専用です。」と表示される。 3 2023/05/30 14:51
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Excel(エクセル) Excelから複数のWordファイルを操作する方法について教えて頂きたい。 やりたいことは、複数のW 2 2022/07/26 20:11
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- Word(ワード) 大学の課題でWordをしないとダメでノートパソコンで無料期間を使ってワード使って作成しUSBに保存し 6 2022/05/12 13:14
- ノートパソコン 至急!Wordが消えた PC を修理に出したのですが、今日自分のPCを開いてみるとデスクトップに表示 6 2022/10/24 21:29
- Word(ワード) Office 365のWordでオブジェクト挿入であるWord文書にほかのWord文書やPDFを貼り 2 2022/05/09 15:57
- Word(ワード) MacのOSをアップデートしたら、Wordが使用できなくなりました。 2015年年末に頃にMacとM 2 2022/05/15 12:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XAJAX
-
C言語 exitの使い方
-
VBAでダブルコーテーション入り...
-
テキストボックスの値を変数に...
-
C言語 列挙型(enum型)変数について
-
VBAのWorksheetFunctionの引数...
-
VisualStudio2022でC言語プログ...
-
【エクセル】 関数による電子...
-
数値を浮動小数点32bitHEXコー...
-
Excel-vba 文字列と変数を...
-
「%」を使って、偶数か奇数かを...
-
C#で動的にコントロールを取得...
-
Accessで文字列のバイト数読み込み
-
フォームを開くときに、コンボ...
-
ラジオボタンの値の取得につい...
-
for the first timeとfirst tim...
-
変数宣言と初期値代入の場所に...
-
負の二進数
-
コマンドプロンプト バッチ|結...
-
アンダーバーとバックスラッシュ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語でしりとりのプログラムを...
-
異なる文字列のマッチングを、D...
-
全ての可能な文の生成について2
-
カウント配列
-
検索でヒットさせたくない
-
単語の頻度プログラム
-
<a href=…>がうまくいかない
-
文字列の比較のはずなのに・・・
-
CGI.pmによるプルダウンメニ...
-
表記のゆれを吸収する方法
-
解析機能の拡張について
-
emacsで辞書補完
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
エラーの意味は? Lvalue req...
-
VBAでダブルコーテーション入り...
-
だれがとけるの?
-
jsp~jspにhiddenを使って変数...
-
excelの、ある数式内の{}の意...
-
テキストボックスの値を変数に...
おすすめ情報