くだすれPerl(超初心者用)2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/03/03(月) 05:07:32ID:???もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
0376nobodyさん
2008/07/08(火) 17:03:27ID:???ハッシュテーブルさえ理解してればどの様にでも出来る。
このスレの>>12->>15あたり読め。後は自分で応用しろ。
0377nobodyさん
2008/07/08(火) 17:10:18ID:???@res = keys %{ { map{ $_, 1 } qw( 1 2 9 9 ) } } ;
0378nobodyさん
2008/07/08(火) 17:29:42ID:???まだ完全には理解しきれてませんが、
なんか見えてきた気がします。
0379質問
2008/07/08(火) 23:51:46ID:ELkvWtkp送信ボタンを2回押さないとframe2へ出力されなくて困っています。
送信ボタンを1回押すだけで出力できるような方法を教えてください。
現在の構成ですが、
A.cgi
<form action="B.cgi" target="frame2">
と作成しています。
A.cgiではチェックリストを作って、選択したデータ(装置名)を取得するようにしています。
送信ボタンを押すとB.cgiが実行されてその結果をframe2へhtmlで出力するようにしています。
vi B.cgi
�@取得したデータをCファイルへ書き込み
�A取得したデータをhtmlで出力
�B ` D.pl` を実施
vi D.pl
D.plがすでに起動していれば、改めてD.plを実行しない(多重起動防止)
Cファイルに何も記録がなければD.pl自体を終了させる
while(-s Cファイル){
Cファイルに何か書き込みが有る場合、
Cファイルを読み込んでその装置へデータをsnmpで取得しに行く
sleep 30;
}
状況としては、チェックリストで項目を選択し送信ボタンを押すと、1回目のB.cgiが実行されるわけですが、
B.cgi内でD.plを走らせている為(30秒ループ)、D.plが終了しない限りB.cgiが終了しないので
結果としてframe2への出力がされないようです。
次に送信ボタンを押すと、1回目のD.plがすでに起動しているので2回目のD.plは終了し、2回目のB.cgiは終了し、
frame2へも出力されます。
0380nobodyさん
2008/07/09(水) 02:49:40ID:???> B.cgi内でD.plを走らせている為(30秒ループ)、D.plが終了しない限りB.cgiが終了しないので
結果としてframe2への出力がされないようです。
D.plを呼ぶ前に「close STDOUT」 してもだめかな?
0381nobodyさん
2008/07/09(水) 03:25:24ID:???> frame2への出力
ってのが、B.cgiの2.の段階のこと?(多分違うと思うけど。3.の後の`D.pl`の後かな)
D.plを多重起動禁止とか、Cファイルに書き出しとかせずに、
B.cgiからrequireなりで呼び出して、直接その装置(何のだ?)に値するものを引数なりで渡せばええんでね?
で、戻り値をB.cgiから出力と。
これなら、ファイルのロックだとか破損だとか考えずに、B.cgiをいくらでも(cpuとメモリの限り)実行できると思うが・・。
snmpのことはよう知らんから、これではダメなのかも知れないけど。
0382nobodyさん
2008/07/09(水) 07:17:22ID:bhbbhnXI>> frame2への出力
>ってのが、B.cgiの2.の段階のこと?(多分違うと思うけど。3.の後の`D.pl`の後かな)
そうです。B.cgi内では�@�A�Bの順番で記述していますが、B.cgiが終了しないと
B.cgiの処理結果である�Aが出力されないようです。
>>380 >>381
今日あたり書かれていることを勉強して試してみます。
0383381
2008/07/09(水) 10:16:07ID:???あれ、そうなの?じゃあD.plは一体何をしてるんだ?
自分の解釈としては、
A.cgi→フォーム(装置の種類?)を選択→B.cgiでそれを受け取りCファイルに書き出す
→D.plがCファイルの内容を読み取り、snmpからその装置の値(統計?測定値?)を取りに行く
→結果をB.cgiに返す→B.cgiで結果を出力 かと思ってたんだけど・・。
もし言うとおり、B.cgiの2.の部分が出力されないってことなら、>>380の方法か、
(Web鯖がApacheだと仮定して)
$| = 1;
print "Content-type....."
print " " x 256;
とかを、HTMLの出力前にやってみれば?
(確かApacheがcgiかの出力を256byte分バッファリングしたはず。だから最初に256byte分なにかを出力する)
0384nobodyさん
2008/07/10(木) 13:55:54ID:udSkOiii$FORM_DATA{$name_data}=~s/<FONT>/<FONT>/g;
$FORM_DATA{$name_data}=~s/<\/FONT>/<FONT>/g;
これでやってもうまくいかないです。
0385nobodyさん
2008/07/10(木) 14:08:18ID:???それに、スタイルシートとかJavaScriptで壊滅しちゃうよ?
0386nobodyさん
2008/07/10(木) 14:15:16ID:???0387nobodyさん
2008/07/10(木) 14:37:38ID:???「スタイルシート破壊攻撃」
というものであめぞうを壊滅させたのだ
0388nobodyさん
2008/07/10(木) 17:37:23ID:dih1cMi9ソフトバンクでの$ENV{'HTTP_USER_AGENT'}の中に含まれる
ブラウザのことなんですが、携帯のブラウザって変更できますか?
機種変えないとブラウザは変更できませんか?
0389nobodyさん
2008/07/10(木) 21:21:21ID:???0390nobodyさん
2008/07/10(木) 21:45:49ID:???0391nobodyさん
2008/07/10(木) 21:53:43ID:???0392nobodyさん
2008/07/11(金) 11:46:21ID:blsFm1gdperlで携帯サイトを作ったので個体識別情報を
パスにして重複登録を防ごうとしてるので。
0393nobodyさん
2008/07/11(金) 12:48:17ID:???0394nobodyさん
2008/07/11(金) 17:55:47ID:8w4o/9wt0395nobodyさん
2008/07/11(金) 18:02:09ID:???0396nobodyさん
2008/07/11(金) 18:24:17ID:8w4o/9wt0397nobodyさん
2008/07/11(金) 18:35:49ID:???教えると荒し幇助になるから、後は勝手にやってろ
0398nobodyさん
2008/07/11(金) 19:06:48ID:???0399nobodyさん
2008/07/11(金) 19:11:25ID:8w4o/9wtありがとうございます。
0400nobodyさん
2008/07/14(月) 09:37:28ID:???0401nobodyさん
2008/07/14(月) 12:27:09ID:???0402nobodyさん
2008/07/15(火) 23:35:01ID:xfy/3+9x別ファイルからURLを読み込んで表示させたいのですが、
$url = http://○○○.○○.jp/********/**********/************/********/****.htm 等の場合、
の$url中から http:// という文字だけを削除する記述と、
URLが長すぎる場合、20文字以降は ... で省略して表示させる記述を教えてください。
よろしくお願いします。
0403nobodyさん
2008/07/16(水) 00:07:34ID:???http の h を抜くんだね? .htm の h は抜かないんだね?
$url =~ s/^h// ;
20文字以降、、、は、
$url = +( unpack q{A20}, $url ) . '...' if length $url > 20 ;
0404402
2008/07/16(水) 00:28:18ID:WNn5k82F$url でやろうと思ったのですが、他ファイル(plファイル)から
%url% というので読み込む際の記述を教えていただけると助かります。(^^;
あと、 h だけではなく、 http:// の全てを削除したいと思います。
度々すいませんが、よろしくお願いします。m(_ _)m
0405402
2008/07/16(水) 00:36:08ID:WNn5k82F「 http:// 」 を抜きたいのです。
.htm の 「 h 」 は抜かないです。
0407nobodyさん
2008/07/16(水) 00:41:20ID:???すまんが %url% と言うのは理解出来ん。なんじゃそりゃ?
.htm 以外の h を全部抜くのは
$url =~ s/h(?!tm.?$)//g ;
あたりで何とか。
0408402
2008/07/16(水) 00:52:08ID:WNn5k82Fcgiの中で %url% という記述で呼び出しているんです。
%url% を $url に変換(?)しようと思い、
$url ="%url%";
と書いてみましたが、無反応でした。
記述が間違っているようで・・
あと、 .htm 以外の h を全部抜くのはなく、
「 http:// 」 と 「 https:// 」 を抜きたい場合は、
$url =~ s|http://|| ;
$url =~ s|https://|| ;
でしょうか??
説明下手ですいません。(^^::
0410nobodyさん
2008/07/16(水) 01:04:47ID:WNn5k82F%url% を $url に変換(?)できれば希望通りになりそうなのですが、
この記述は難しいでしょうか??
0412nobodyさん
2008/07/16(水) 01:19:18ID:???0413402
2008/07/16(水) 01:28:15ID:???cgiではなく、読み込む前のplファイル内でイジっていたら、うまくいったようです!
大変助かりました!
ありがとうございました!!
0414nobodyさん
2008/07/16(水) 04:08:39ID:???したのですがうまくいきませんでした。
このcgiはブラウザから引き渡されたデータを処理するのして記録(log)に残す
のですがInternal Server Errorになってしまいます。
perlのパスはあっていましたし、改行もLFでした。
apacheを使っている?のですが他のcgiは動いたのでapacheの設定は間違って
いないはずです。。。
cgi-lib.plを使っているのですがそれのパスが違うのと思いましたが
よくわかりません。
cgi-lib.plがあるフォルダのパスはそのフォルダをTerminalにつっこんで
でたパスをそのまんま書きました。
use lib'#ここにTerminalからのパス';みたいな感じです。
下にファイルのURLを張りましたのでどなたか教えて頂けないでしょうか?
よろしくお願いします<(_ _)>
http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/356.zip
0415nobodyさん
2008/07/16(水) 10:00:31ID:???InternalServerErrorのときは、その理由も別のエラーで出てるはずだが、apacheのログはどうなってる?
0416nobodyさん
2008/07/16(水) 10:05:39ID:???[confirm.cgi]
syntax error at confirm.cgi line 43, near "print"
[reservation.cgi]
Name "main::LOG" used only once: possible typo at reservation.cgi line 19.
0417nobodyさん
2008/07/16(水) 10:07:17ID:???ちょっとやってみたが、confirm.cgi の
>print "<HTML><BODY BGCOLOR=\"YELLOW\">\n"
この行の末尾に ; セミコロンがないからsyntax errorおこしてる。
0418414
2008/07/16(水) 11:49:34ID:???返信ありがとうございます<(_ _)>
たしかにセミコロンが抜けていました;つけるとちゃんと実行はできたの
ですが記録するlogファイルは作成されるのですが中身が空なのです。
>>416さんのreserve.cgiの警告は1回だけしか変数と言う警告みたいで
気にすることはないみたいな感じで書かれていました。
ファイルでに追加書き込みの部分が
open(LOG1,">>reserve.log");
print LOG "\"$yourname\",\"$phone\",\"$email\",\"$answer1\",\"$date\",\"$stay\",\"$answer2\"\n";
close(LOG1);
みたいな感じなのですがどこかおかしいでしょうか?
ファイルが存在しない場合は新規で作成してくれました。
カレントディレクトリに存在しなければ umask 666 で新規作成する。
とありましたがそこが問題なのでしょうか?umask 666;とopen関数の後に
入れても何も書き込まれなかったのですが...。
0419nobodyさん
2008/07/16(水) 12:31:03ID:???0420nobodyさん
2008/07/16(水) 12:41:15ID:???suEXECで動いてるんだろう。
0421414
2008/07/16(水) 12:53:40ID:???回答ありがとうございます。
なんとも単純なミス・・・・
昨日から徹夜でしたので頭が回ってないようです;;
何度も確認してこれからは聞きたいと思います、ありがとうございました!
0423nobodyさん
2008/07/16(水) 22:30:17ID:WNn5k82Fパスワードで入室するだけのcgi部分なのですが、
設定された有効パスワード「$pwd」以外にも、もう一つ有効パスワード「$pass」を追加する場合、
どのようにすればいいでしょうか?
※「$pwd」と「$pass」の、どちらでも入室できるようにしたいのです。
$pass = '9999';
## --- パスワード暗号処理
sub passwd_encode {
$now = time;
($p1, $p2) = unpack("C2", $now);
$wk = $now / (60*60*24*7) + $p1 + $p2 - 8;
@saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
$nsalt = $saltset[$wk % 64] . $saltset[$now % 64];
$encode_pwd = crypt($pwd, $nsalt);
}
## --- パスワード照合処理
sub passwd_decode {
if ($encode_pwd =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応
else { $crptkey = 0; }
$check = "no";
if (crypt($pwd, substr($encode_pwd,$crptkey,2)) eq "$encode_pwd") {
$check = "yes";
}
}
0424423
2008/07/16(水) 22:33:12ID:WNn5k82F# パスワード照合
local($encode_pwd) = $pw;
&passwd_decode;
if ($check eq 'no') {
last;
&error("パスワードが違います","lock");
}
0425nobodyさん
2008/07/17(木) 06:00:10ID:???>>422
ヲーニングを出すように設定すれば出るよ。
use wanings ;
use strict ;
らへん。
0426nobodyさん
2008/07/17(木) 19:14:10ID:???0427nobodyさん
2008/07/18(金) 01:25:13ID:???実装自体は簡単で、有効なパスワードをひとつずつ順次判定して、有効なパスワードに合致した時点でその旨報告すれば良いだけです。
>>426 の言うように、単一のアカウントに複数の有効パスワードを設定する設計は必然性がなく、安全性は確実に下がるのでおすすめしません。
まさかとは思いますが万が一、全アカウントに共通のパスワードを付加しようとしているのであれば、ほとんど論外と言えます。
もしその目的なら別途管理者アカウントを実装されるのが良いでしょう。
蛇足ですが、良い本を一冊でよいので、買って読みましょう。
0429nobodyさん
2008/07/20(日) 12:53:28ID:???名前<>パス<>投稿時間<>メッセージ
などのように<>で区切りますが、<>を使う理由ってありますか?
,とか|で区切っているものも時々みかけますが、自分が見た中では
<>が一番多かったです。
0430nobodyさん
2008/07/20(日) 13:10:14ID:???,とか|だと投稿記事に普通に含まれてるので。
0431nobodyさん
2008/07/20(日) 13:16:23ID:???となると書き出しの時のエスケープに加えて読み出しの時もそのための処理が必要になる
<>だと,データに含まれてたとしても保存する時に&<&>にすればいいだけ
<>だと2バイト食うから、それなら非アスキー文字で\0とかで区切るとデータファイルを
テキストエディタで見ると変になるかもしれない
<のみで区切ると容量的には減るだろうがエディタで見たときデータ同士の区切りがピンとこないかな。。
<>の区切りがいいか悪いかはわからんが、KENTが配布してるCGIで広まったのかな?
0432nobodyさん
2008/07/20(日) 13:21:39ID:???0434nobodyさん
2008/07/20(日) 20:30:28ID:???> そういう理由がちゃんと書いてある
> 本とかWEBはあるのかな。
何かの標準というわけでもなく、特定の実装でたまたまそれ("<>")が選ばれた、というだけなので、根拠を求めるなら当該実装のドキュメントを読むのが筋だろうと思います。
0435nobodyさん
2008/07/20(日) 21:44:54ID:UlzGONXmタブ区切りを好む奴はそもそもデータを触ったことが殆ど無い。まああくまで俺の偏見だが。
0436nobodyさん
2008/07/21(月) 02:02:08ID:???0437nobodyさん
2008/07/21(月) 07:42:22ID:???<>はタブの強調表示が出来ないメモ帳向け。
0438nobodyさん
2008/07/21(月) 09:52:12ID:???aabbddedd<>1232345<>0<>qwer345566
abd<>123<>100<>derfgtg
となっちゃうデータを、見た目だけ
aabbddedd<>1232345<>0 <>qwer345566
abd <>123 <>100<>derfgtg
のように区切り文字あわせで表示してくれるようなエディタってないでしょうか。
0439nobodyさん
2008/07/21(月) 17:42:37ID:???perl -ple "s/<>/\t/g" > outfile.tsv
-> 続きは Excel で。
# 僕はその手のファイルを手編集せにゃならん事態は避けたい。
0440nobodyさん
2008/07/21(月) 18:35:14ID:???RFC4180な素朴なCSVにしておけば、間違いなく誰のExcelでも同じように表示される。
0441nobodyさん
2008/07/21(月) 20:42:22ID:???それに、OOoならフツーによめるぞ。
0442nobodyさん
2008/07/22(火) 01:36:21ID:???とか、マンドクセー ってことでしょ?(しかもExcelが覚えてくれないし)
それに知ってるやつになら問題ないけど、よく知らんやつにも配布する、とかになると
開き方説明したり、「なんでこんな形式なんだー!」とかクレーム来ることうけあい。
0443nobodyさん
2008/07/22(火) 03:23:00ID:???0444nobodyさん
2008/07/22(火) 04:52:47ID:???0446nobodyさん
2008/07/22(火) 13:14:57ID:???0448nobodyさん
2008/07/22(火) 21:48:06ID:???0449nobodyさん
2008/07/23(水) 02:02:08ID:???wqを外すとカンマを処理しなくちゃならないから俺もTSVにしてる
フォームだと通常はTAB含まれないので楽(コピペされると入るけど)
0450nobodyさん
2008/07/23(水) 02:19:31ID:???0451nobodyさん
2008/07/23(水) 11:44:47ID:???0452nobodyさん
2008/07/23(水) 21:54:07ID:???0453449
2008/07/24(木) 03:39:07ID:???どーせ見ねぇくせに・・・
0454nobodyさん
2008/07/24(木) 09:22:59ID:???0456nobodyさん
2008/07/24(木) 19:00:08ID:???だったら出力だけCSVでいいじゃん
0457nobodyさん
2008/07/25(金) 00:26:02ID:???0461nobodyさん
2008/07/27(日) 21:58:36ID:???たとえばグリニッジ標準時をを日本での何年何月何日何時何分何秒に直す方法は
あちこちで見かけます。
逆に何年何月何日何時何分何秒をグリニッジ標準時に
直すにはどんなふうにすればいいんでしょうか?
以前両方の換算をしてくれるサイトがあったと思うのですが、
URLを忘れてしまいました。
0462nobodyさん
2008/07/27(日) 23:58:37ID:???0463nobodyさん
2008/07/29(火) 15:51:40ID:PIvmZbRoどうやったらいいか教えていただけないでしょうか?
正規表現を使うのはわかるのですが、いまいち流れがわかりません
何か参考サイトなどがあると良いのですが・・
0464nobodyさん
2008/07/29(火) 21:15:42ID:???use Text::CSV;
my $csv = Text::CSV->new({ binary => 1 });
my @texlines = ();
while (<>) {
$csv->parse($_) or die $!;
push @texlines, join( ' & ', $csv->fields($_) ) . " \\\\\n";
}
print @texlines;
# よく知らんけどこんな感じでいかがかしら。
0465nobodyさん
2008/07/30(水) 10:48:48ID:???0466nobodyさん
2008/07/30(水) 21:20:36ID:???ってどういう意味
0467nobodyさん
2008/07/30(水) 22:04:23ID:???無効なディレクトリハンドル FILE を readdir() しようとしてコケました。
FILE はまだ開かれていないか、あるいは正しいディレクトリハンドルではないか、もしくは「俺は最初ッから、その FILE って名前が気に入らなかったんだよぉッッ……!」 な可能性があります。
血眼でデバグってください。
0468464
2008/07/30(水) 22:08:18ID:???てふの表て、カラム区切りが "&" で、ライン区切りが "\\" じゃなかったんですか?
実際よく知らないのでこれを機会に教えて星ス。
0469nobodyさん
2008/07/31(木) 03:07:00ID:???掲示板cgiにアクセス解析cgiを組み込みたいと思っています。
そのアクセス解析は本来SSI用で、shtmlから
<!--#include virtual="./accesskaiseki.cgi?id=123456"-->
で呼び出すようになっています。
掲示板cgi内に
require './accesskaiseki.cgi';
と記述すると、とりあえずは動いているのですが、
「id=123456」の部分を送るにはどう記述すればいいんでしょうか?
お恥しい質問ですいません。
0470nobodyさん
2008/07/31(木) 04:27:16ID:???なんでidを送る必要があるの?
0471nobodyさん
2008/07/31(木) 12:30:12ID:uEHg7ipCうまく表示できません。
構文エラーはでませんでした。
どのようにしたいかと言うと入力フォームに何かを書き込むと
投稿者のid(そのサイトに何番目にきたか)と入力したメッセージを順に表示したいのです。
メッセージと番号は他のログファイルに蓄積されていきます。
ログファイルにはメッセージは書き込まれるのですがidは空白になってしまいます;
どなたか教えて頂けないでしょうか?
ファイルはhttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/380.txtです。
初心者なので変なタグを使っているかもしれません;
0472nobodyさん
2008/07/31(木) 12:47:18ID:???この行見ればわかるでしょ
0473nobodyさん
2008/07/31(木) 12:57:37ID:???返信ありがとうございます。
\nが不要でした!直したらできたのですが
ログファイルの中身を表示ができないんですよね;
open(FILE2,"+>>log.dat");
while($line=<FILE2>){
print $line;
}
で表示されないんですよね;
datファイルのパーミッションの問題なのでしょうか?
一応chmod 666 log.datをすると
Operation not permittedとでてしまいます。
0474nobodyさん
2008/07/31(木) 15:19:42ID:???0475nobodyさん
2008/07/31(木) 15:30:28ID:???色々とすみませんでした。
0476nobodyさん
2008/07/31(木) 16:50:00ID:???■ このスレッドは過去ログ倉庫に格納されています