正規表現によって文字列を検索し、該当する文字列が存在する場合には存在する旨のメッセージを出力し、存在しない場合には存在しない旨のメッセージを出力するようなプログラムを作りたいのですが現在うまくいっておりません。ソースは以下になります。

#!/usr/bin/perl

$logfile= './log_euc.log'; # ログファイル

@logs = &read_file($logfile);

foreach $log (@logs) {
if ($log = ~/hogehoge/ ){
$log_stg = " 変数に文字列hogehogeは含まれています。 ";
}else{
$log_stg = " 変数に文字列hogehogeは含まれていません。 ";
}

print " 判定結果\n ";
print " $log_stg\n ";
}

sub read_file {
local($logfile) = $_[0];
open(IN,$logfile);
local(@files) = <IN>;
close(IN);
return @files;
}

検索対象のファイル「log_euc.log」は以下です。

hogehoge
mugemuge
riri
ari
siri
siursoiu
sojowijugo
hfsoiehrohogehoge

sjhoisjofhoge osihojfhoge
hsoghsoehogehogesoijggggg

検索結果は以下です。

判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。
判定結果
変数に文字列hogehogeは含まれています。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

if ($log = ~/hogehoge/ )



のイコールとチルダの間に空白が入っているせいではないでしょうか。

正しくは

if ($log =~ /hogehoge/ )

のようにチルダをスラッシュ側ではなくイコール側に付ければOKだと思います。
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Qforeach (1..4){ 英文字$_→$新しい変数として使いたい

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = "a$_";
print <<"HTML";
$view<BR>

HTML
}

の時、$viewに$a1~$a5の値を表示させるようにしたいのですが、上記の場合ですとa1~a5として表示されます。

foreachで$_で順に数字をaと組み合わせて出来た文字列を変数として使い、元々指定してある値を取得するようにしたいのです。

どのようにすれば解決できますでしょうか。ご掲示頂けましたら幸いです。

Aベストアンサー

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = ${"a$_"};
print <<"HTML";
$view<BR>

HTML
}

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Qperlの環境変数 ENV{'REMOTE_ADDR'}  について

ショッピングカートのCGIにおいて

ENV{'REMOTE_ADDR'}

IPアドレスを取得すると思うのですが・・・。

何が原因なのかわかりませんが、違うIPアドレスのユーザー同士が、同じIPアドレスを取得したことになり、ショッピングカートの中が重複してしまいます

具体的に、お買物途中で注文したものを削除しないで注文をやめたお客様と同じIPアドレスのもつ他のお客様が買い物かごボタンを押すことにより、

後者のお客様が、ボタンを押していない商品もショッピングカートに入ってしまい・・・。

クレームが入ってしまいます

私ですが、perlに関して素人です。ですが、フリーのCGIを少し加工して使っております。

そこで、質問なのですが、ウイルスバスター等のセキュリティーソフトをインストールしていると、アクセス時に偽装のIPアドレスをログに残す可能性などあるのでしょうか?

勝手な解釈なのですが・・・。

それ以外に、IPアドレスが重複してしまう可能性が自分の知識の範囲内では、思いつきません。

素人的な考えかもしれませんが、ご教授お願い致します

ショッピングカートのCGIにおいて

ENV{'REMOTE_ADDR'}

IPアドレスを取得すると思うのですが・・・。

何が原因なのかわかりませんが、違うIPアドレスのユーザー同士が、同じIPアドレスを取得したことになり、ショッピングカートの中が重複してしまいます

具体的に、お買物途中で注文したものを削除しないで注文をやめたお客様と同じIPアドレスのもつ他のお客様が買い物かごボタンを押すことにより、

後者のお客様が、ボタンを押していない商品もショッピングカートに入ってしまい・・・。
...続きを読む

Aベストアンサー

>ショッピングカートにもIPアドレス認識タイプとCookie利用のタイプがあると思うのですが・・。

調べてみたらあるようですが
http://www.hal9800.com/home/cgi.html
IPアドレスによりきちんとした識別が出来ないため
弊害が起こりうることが明記されています。

>ユーザー自身がクッキーをOFFにしている場合、CGIが使えなくなってしまう
・サイトにクッキーを有効にしてくださいと記述する
・toppageでクッキーを発行し、買い物ページで、そのクッキーを保持しているかどうか判断して
保持していない場合「クッキーが有効でない場合買い物できません」と強調表示する
・クッキー以外の方法ではIDを発行して、QUERYなどでIDを保持させる

>私自身がアクセスしたい際にも、実際のIPアドレスではなく、架空のIPアドレスを2種類、、
これは良くわかりませんがENV{'REMOTE_ADDR'} だけでなく
$ENV{'SERVER_ADDR'} や他の環境変数も記録していませんか?
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2048321
の#2に書いた 環境変数一覧CGIを設置してアクセスしてみて確認してみてはいかがでしょうか?

>ショッピングカートにもIPアドレス認識タイプとCookie利用のタイプがあると思うのですが・・。

調べてみたらあるようですが
http://www.hal9800.com/home/cgi.html
IPアドレスによりきちんとした識別が出来ないため
弊害が起こりうることが明記されています。

>ユーザー自身がクッキーをOFFにしている場合、CGIが使えなくなってしまう
・サイトにクッキーを有効にしてくださいと記述する
・toppageでクッキーを発行し、買い物ページで、そのクッキーを保持しているかどうか判断して
保持し...続きを読む

QData::Dumper;でダンプ後表示した文字列\x{30fc}...

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rss = new XML::RSS;
#表示形式の違いで1と2がある。
$Data::Dumper::Indent = 1;
use open IN => ":utf8"; # 入力をUTF8とする
use open OUT => ":shiftjis";
#use open ":std";
#use Encode;
#use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis';
#binmode STDOUT, ":encoding(utf-8)";
#binmode STDOUT, ":encoding(shiftjis)";
#binmode STDOUT, ":encoding(euc-jp)";
#use open ":encoding(shiftjis)";

# rssをセット。
open my $fh, '< ./test.rss';
my $text = join undef, <$fh>;
close $fh;

# rssをパース
$rss->parse($text);

# ひとまず中見を知る為にダンプしてみる
print "Content-type:text/html;charset=Shift_JIS\n\n";
print "<html><head>\n";
print "<title></title></head>\n";
print "<body>\n";
print Data::Dumper->Dump([$rss]);

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rs...続きを読む

Aベストアンサー

#1さんと同じですが
use encoding 'utf-8', STDOUT => 'Shift_JIS';
を始めにつける

$out_text = Data::Dumper->Dump([$rss]);
$out_text =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg;
print $out_text;
だけでいいと思います。


おすすめ情報