1 :
nobodyさん :
03/03/18 18:47 ID:Dujz7IUF
ずざー
7 :
nobodyさん :03/03/19 01:13 ID:0vdjLWGs
さっそくなんですが、i-modeでUser-Agentを利用して機種別に行くページを振り分けようと思って
#!/usr/local/bin/perl
$ua = $ENV{'HTTP_USER_AGENT'}
if( $ua =~ /^DoCoMo/2.0 N2051(c100;TB)){
print "Location: ../matiuke/jpg/176x198/\n\n";
}else( $ua = ~{
print "Location: ../\n\n";
}
exit(0);
という風に打ったのですが
No Outputと出てしまいお手上げ状態です
・・・
はっきり言ってperlを書くのは初めてなのでまったくといっていいほど初心者です。
ttp://www.nttdocomo.co.jp/mc-user/i/spec/useragent.html 携帯別User-Agent表です。
よろしくお願いします。
>>7 }else( $ua = ~{
ってなによ・・・
>>7 if( $ua =~ /^\QDoCoMo/2.0 N2051(c100;TB)\E/){
print "Location: ../matiuke/jpg/176x198/\n\n";
}elsif( $ua = ~/\Qayaya\E/){
print "Location: ../hoge/hoge\n\n";
}else{
print "Location: ../\n\n";
}
文法コウゾウを理解したほうがよいかと
>>7 UAは末尾まで丸々いるわけ?
そんなに細かく分岐させるの?
DoCoMoの6文字だけか1.0とか2.0までとか・・・
どこかで振り分けCGIを落としてきて使ったほうがいいんじゃないの?
11 :
nobodyさん :03/03/19 02:07 ID:DZ7fCmeZ
真似だな。ぽまえ。 >7 細かすぎだろ?
12 :
nobodyさん :03/03/19 02:13 ID:EytPlHC0
>>12 そうやって質問を装ってブラクラを貼る馬鹿がいるので、できるだけ
文章で詳しく書いて欲しい。
>>13 2ch研究さんのアクティブスレッドランキングなのですが
非常に使えるので自分流に改造したいとおもいまして
zenhiteiさんにご相談したところ、ご自由にどうぞとのことだったのです
で、perlをするにしても、あのプログラムの参考になるサイトすら
わからない状態でしたのでここの方々に指示を仰ぎたいなと思い
伺いました。
16 :
nobodyさん :03/03/19 05:33 ID:X4k10DxJ
正規表現でマッチした回数を調べるにはどうすれば良いのでしょうか? $hoge = 'hoge hoge hoge'; $hoge =~ s/hit/hoge/g; ↑の処理で置換した回数を知りたいです。 お願いします。
17 :
nobodyさん :03/03/19 05:36 ID:X4k10DxJ
ウゲ!! $hoge = 'hoge hoge hoge'; $hoge =~ s/hoge/hit/g; です。。。
$moge = $hoge =~ s/hoge/hit/g;
19 :
16 :03/03/19 05:42 ID:X4k10DxJ
できました! こんな時間にこんなに早くレスもらえるとは思わなかったです! どうもありがとうございました。
perlで作成したHTMLファイルを保存させたくて 今はVBSでやってますがあまりうまくないんで、 何かいい方法ないでしょうか?
23 :
nobodyさん :03/03/19 12:08 ID:WfwFmo2+
質問です。 Data::Dumper より速いという Storable を使いたいのですが うまくいきません。お使いの方、教えてください。 Storable.pm は CPAN より入手しております。
25 :
23 :03/03/19 12:27 ID:???
use する以前に autosplit.ix がないと言われて、 で AutoSplit にてモジュールを分解して、 autosplit.ix などが 生成されたのですが、結局エラーになってしまいました。 用途は Data::Dumper のように変数をファイルに保存する事です。
26 :
21 :03/03/19 12:42 ID:???
>>22 20がやりたいことがよく分からんが
mimetypeを application/octet-stream
とかにすればできるんじゃないの?
>>26 やりたいことがわからんのに、できるって言っちゃうのもどーかと
28 :
7 :03/03/19 13:12 ID:0vdjLWGs
>>8-14 ご指摘ありがとうございます。
1から勉強しなおしてきます。
>>25 =23
インストールに失敗してる可能性高し。
環境は?
>>25 ビルドすらしていない可能性高し。
makeした?
31 :
nobodyさん :03/03/19 19:17 ID:TkOxs7rI
print 10.1-1; で結果が0.000000000000096 みたいな感じになるんですがこれってバグですか?
>>31 仕様。実用上あまり問題にならないはずだが
有効数字は自分で意識して書かないといけない。
小数は一桁で良いのなら、表示はこうする。
printf "%.1f", 計算結果;
>>31 一瞬
>>32 みたいなこと思ったけど、よく読むと結果が一兆分の一ぐらいになってるじゃん。
10.1-10で0.0999999999999996になったけど、このことかな?
これは詳しく話すと浮動小数点がどうとかって話になるけど。
35 :
nobodyさん :03/03/20 01:03 ID:jX8BFx3L
馬鹿げた質問で申し訳ないのですが print "あいうえお"; print "かきくけこ"; print "さしすせそ"; これをまとめて書く方法ありませんでしたっけ? ???????????? あいうえお かきくけこ さしすせそ ??????????? こんな感じの関数があった気がするんですが・・・
関数というか、 print "あいうえお\nかきくけこ\nさしすせそ\n"; じゃだめなのん? print join("\n",@array); とかかなぁ...
print <<EOF; あいうえお かきくけこ さしすせそ EOF コレの事?
>>37 おお、これですこれです
ありがとうございました
user,passを元にFTPサーバへアクセスして ある条件の名前のファイルを取り出す・・・ というのをperlでやることは可能でしょうか?
可能です。 ちったー検索しろ。
41 :
20 :03/03/20 15:08 ID:???
>>39 perldoc Net::FTP
入ってなかったら入れてくれ。
>>41 確実なのは、メールで送る。
43 :
nobodyさん :03/03/20 17:33 ID:gyHuovPa
ド素人な質問ですが、
ttp://www2.snowman.ne.jp/~nnet/ にある
テキスト広告用CGIを使うために
掲示板スクリプトの2行目に require "randbbs.cgi";を
付け足したらエラーになるんです。randbbs.cgiはちゃんと
存在するんですが、何がいけないんでしょうか?
44 :
43 :03/03/20 17:35 ID:gyHuovPa
訂正です。テキスト広告用CGIではなく 「広告配信CGIのランダムTEXT広告配信CGI」でした。
じゃあ、require〜 の一文を消したら動くの?
46 :
43 :03/03/20 18:05 ID:gyHuovPa
>>43 そのCGI設置ページの説明(動かんときの対処法)はひととおり試してみた?
あとさあ、ここPerlスレなんだが。なんでCGIの質問するのよ?
49 :
43 :03/03/20 18:18 ID:gyHuovPa
>>47 対処法はひとつだけ書いてあるんですが、だめでした。
パーミションやディレクトリの位置なんかもいろいろ試したんですが。
というかこれってPerlの話じゃないんですか?
違うんだったらやめます。ごめんなさい。
>>43 >掲示板スクリプトの2行目に require "randbbs.cgi";を
~~~~~~
>>49 色々つっこみどころが多いな……
>対処法はひとつだけ書いてあるんですが、だめでした。
その方法を試したのか、試してないのか。
ダメならダメでどのようにダメだったのか。
これらの情報が全く含まれていない。
>パーミションやディレクトリの位置なんかもいろいろ試したんですが。
どう試したのか。
やはりこれも情報がない。
>というかこれってPerlの話じゃないんですか?
このスクリプトはPerlで書かれているが、PerlはCGIのためだけの言語ではない。
なお、CGIには専用のスレッドがある。
最後に一番大きなつっこみを。
なんで2chで聞く? まず作ったところ(作った人間)に聞くのが筋だろうに。
変数を変数名として使う場合(?) $text = "テキスト"; $name = "text"; print "$$name"; でできるのですが、$textがmyで宣言されていると これでは表示されなくなってしまいます。 解決法は無いでしょうか・・?
>>52 $$name はリファレンスに取られかねないからハッシュを使うほうが賢いと思われ
%text = ('test'=>'テキスト');
$name = 'test';
print $text{$name};
みたいな・・・
すみません;; ${$name}と訂正しておきます。 >53の説明していただいた方法も考えたのですが、 頑固ですが、変数名には変数は使うのはむづかしいでしょうか(T_T)?
55 :
54 :03/03/21 03:54 ID:???
書いたばっかりですみません、 ハッシュを使う方向でやってみる事にしました。
56 :
53 :03/03/21 04:00 ID:???
>>54 ${$name} それ、リファレンスの記述そのものですが・・・
$sousa01=(捜査1課の名簿がHTMLのデータで書かれてます); $sousa02=(捜査2課の名簿がHTMLのデータで書かれてます); 〜 $sousa99=(捜査99課の名簿がHTMLのデータで書かれてます); <input type=radio name="kenkei" value="sousa">捜査 <input type=radio name="sousa" value="01">捜査1課<br> <input type=radio name="sousa" value="02">捜査2課<br> 〜 <input type=radio name="sousa" value="99">捜査99課<br> name="kenkei" の value="sousa"と name="sousa" の value="01"をくっ付けて、 変数$sousa01とするにはどうしたらよいのでしょうか?
>>57 データ構造が思いっきり糞。
ハッシュ使え、ハッシュを。
$data{sousa}{1} = 捜査一課の情報;
みたいにすれ。
59 :
53 :03/03/21 08:34 ID:???
>>57 まず配列にする事ですな・・・
$sousa[1]=(捜査1課の名簿がHTMLのデータで書かれてます);
$sousa[2]=(捜査2課の名簿がHTMLのデータで書かれてます);
〜
$sousa[99]=(捜査99課の名簿がHTMLのデータで書かれてます);
で、帰ってきたform文が%FORMに入るとした場合
$sousa[$FORM{'sousa'}]
で解決
>>53 Only package variables (globals, even if localized) are
visible to symbolic references. Lexical variables
(declared with my()) aren't in a symbol table, and thus
are invisible to this mechanism.
eucのファイルをsjisに変換したいんだけど 「読み書きモードでファイル読んでコード変換して 元のファイルにsjisで書き込む」 このやりかた以外にもっと効率的な方法知ってたら教えてください
>>61 ファイルを変換するならそれしかないでしょ
63 :
20 :03/03/21 17:35 ID:???
>>42 おおおお
そいつはいいアイデアかも
それでやってみます
64 :
61 :03/03/21 17:55 ID:???
sjis→euc変換し、テンポラリに書き込むロジックで 改行のCRLFをLFに変換したいのですがうまくいきません。 \xaを書き込んでもCRLFになってしまいます。 どなたか教えてください。 require "jcode.pl"; open(FH,"< a.txt"); @a=<FH>; &jcode::convert(\$_, "euc","sjis") foreach (@a);#sjis→euc close(FH); open(FH,"> tmp.txt"); foreach(@a){ chomp; print FH "$_","\xa";#←ここです } close(FH);
binmode(FH);
66 :
64 :03/03/21 18:22 ID:???
>>65 ありがとうございます。うまくいきました。
自動にLF→CRLF変換してしまうのを
binmode(FH);で防ぐんですね。
open(FH,"> tmp.txt");
binmode(FH);#←ここに追加
foreach(@a){
chomp;
print FH "$_","\xa";
}
close(FH);
67 :
nobodyさん :03/03/21 18:42 ID:x5txFKZl
下の例以外でディレクトリ内のディレクトリ一覧を得るような スマートな書き方は無いでしょうか?お願いします。 foreach ( readdir(DIR) ) { next if (/^\.\.?$/); push @hoge,$_ if ( -d "$_" ); }
@hoge = grep { -d $_ } glob("./*");
69 :
ミツマじゃぱん :03/03/21 18:59 ID:CvSagfqM
貴方は or || どっち派? どうでもいいんですけどね。
>>68 スマートです!どうもありがとうございました。
>>69 ||派に一票。
>>69 おいらはor派。
|| は、ビット演算子の | とまぎらわしい。
orは優先順位が最低になってるのも理由のひとつ。
>>69 俺はorを使ってる。
oとrがビジュアル的に「小さくてささやか」なのが好みに合ってるから
・・・ってのは、ネタのようだけど結構本気な理由。
73 :
57 :03/03/21 19:33 ID:???
>>59 データを配列に書き換えました。
OKです。
ありがとうございました。
>>58 %kenkei = ("sousa1" => "捜査1課" , "sousa2" => "捜査2課");
って言う風に書き換えました。
$kenkei{'sousa1'}なら捜査1課と出るんッスが、
$kenkei{'sousa$sousa'}だとundefッス。
$sousaの値は1です。
後学のために、房な所教えてくだせぇ〜
>>73 $kenkei{"sousa$sousa"}だと出るはず。
''の中では変数展開が行われないんだよ。
75 :
73 :03/03/21 20:47 ID:???
>>74 出来ました。
ありがとうございました。
勉強になりました。
私もor派だなぁ。 深い意味は無く、ヴィジュアルで(笑)
||とor。 優先順位が大幅に違うので要注意。 (orは最下位)
$a = ($b or $c); $a = $b || $c; open FH, "file" or die; open(FH, "file") || die;
優先順位とか良くわからないんだけど 片方固定でしか使わない場合は関係ないの?
>>79 優先順位は他の演算子との関係を考えないと
>>79 1+2*3 の答えを、9と答えるか7と答えるかほどの違いがある。
82 :
nobodyさん :03/03/22 06:32 ID:V7CC4FvX
初心者質問ですみません。 下記の用に、タイムアウト時にバッククォートで囲った処理を killしたいのですが、どうやっていいのか困惑してます。 良い方法がありましたら、ご指導いただければと思っております。 eval { local $SIG{ALRM} = sub { die "timeout" }; alarm 10; $tmp = `処理`; alarm 0; }; alarm 0; if($@) { if($@ =~ /timeout/) {# タイムアウト時 # 行った処理のプロセスを切る処理 } }
1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1:ちょっと大きいCGIなので、負荷を軽くしたい。(CGIです) 2:実行全体にロックをかけて、同時刻に複数人数が処理できないようにしてみたが… 3:それだと、本当に負荷が軽減されてるのか確かめようがなかった。 同時に実行されてない場合は、ちゃんと軽減されてますか?
84 :
nobodyさん :03/03/22 07:29 ID:35k142Il
正規表現にはまってしまいました。 どこのサイトを見ても、 {n, m} n回以上m回未満にマッチ と書いてあるのに、 my test = 'affaaffaaafaaaafaaaaafaaaaaafffaf'; $test =~ s/a{2, 5}/X/g; print $test."\n"; としても、$testは全く変化しません。 なぜでしょうか?
85 :
84 :03/03/22 07:31 ID:35k142Il
>my test = 'affaaffaaafaaaafaaaaafaaaaaafffaf'; もちろん、 my $test = 'affaaffaaafaaaafaaaaafaaaaaafffaf'; の間違いです。
my ($test) = 'affaaffaaafaaaafaaaaafaaaaaafffaf'; じゃねーの?
>>84 my $test = 'affaaffaaafaaaafaaaaafaaaaaafffaf';
$test =~ s/a{2,5}/X/g; ←{ }の中にスペース入れちゃダメ
print $test."\n";
88 :
84 :03/03/22 07:39 ID:35k142Il
>>84 my $test = 'hoge';
は問題ないず。
my $hoge, $foo = split(/\./, 'hoge.foo');
は、
my($hoge, $foo) = split(/\./, 'hoge.foo');
と書く必要があると思いますが。
どうでしょう?
89 :
86 :03/03/22 07:40 ID:???
かぶったね。 ん〜。なんでだろ。分からん。 ちなみに、この記述はperl5未満では使えないよ。
90 :
84 :03/03/22 07:40 ID:35k142Il
>>87 うお、できました。
スペースは無しでしか..
ありがとうございました。
>>88 × my $hoge, $foo = split(/\./, 'hoge.foo');
○ my($hoge, $foo) = split(/\./, 'hoge.foo');
92 :
53 :03/03/22 08:54 ID:???
>>84 >my test = 'affaaffaaafaaaafaaaaafaaaaaafffaf';
$test だろ $抜けとる・・・・
>83 同時実行されていない場合は、ロック処理の分負荷は増えている。 で、この部分は読んでないのかな? >いらっしゃーい、Perlの"コーディング"で困ってる人のスレです。
>92 一部だけ読んで適当に返事するのイクナイ
>>82 パイプつきoopenでPIDを取得しておいて、必要に応じてkill関数で殺す
…と思ってやってみたらうまく行かなかった(お。
<input type="checkbox" name="sakana" value="あじ">あじ <input type="checkbox" name="sakana" value="たい">たい <input type="checkbox" name="sakana" value="ひらめ">ひらめ <input type="checkbox" name="sakana" value="かつお">かつお <input type="checkbox" name="sakana" value="まぐろ">まぐろ で、複数選択しても、最後の値しか来ないのですが、どのようにすればよいのでしょうか? cgi-lib.plを使い、 @arrey = &SplitParam($FORM{'sakana'});でやってみました。 フォームデータの取得は以下の通り sub form { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } } $nameがsakanaで同じだから上書きされているんだと思うのですが、どう回避していいのかわかりません。
>>96 ひとつ。それのどこがPerlの話なんだ?
ふたつ。cgi-lib.plを使っておきながら、自前でデコード処理してんのか? もしそうならとんでもないヴァカだな。
解決策
・CGIのことはCGIのスレに行け。
・cgi-lib.plの最新バージョンとその正しい使い方を学べ。
これで解決。
>>96 >で、複数選択しても、最後の値しか来ないのですが、どのようにすればよいのでしょうか?
ハッシュのキーが値が上書きされるからそうなります。
<input type="checkbox" name="sakana0" value="あじ">あじ
<input type="checkbox" name="sakana1" value="たい">たい
<input type="checkbox" name="sakana2" value="ひらめ">ひらめ
<input type="checkbox" name="sakana3" value="かつお">かつお
<input type="checkbox" name="sakana4" value="まぐろ">まぐろ
等とやって処理を考えないと駄目
>>97 一応perlでしょ・・・ハッシュの扱いの問題だし
>>96 checkboxは、複数選択すると
sakana=あじ&sakana=たい&sakana=まぐろ
みたいに同じnameが複数来るんだよ。
これが分かればあとはなんとかできるでしょ。
101 :
96 :03/03/23 09:50 ID:???
>>97-100 解決しますた。
特に
>>97 さん、&ReadParse;で桶でした(滝汗)
===以下言い訳===
最初はcgi-lib.pl使ってなかったんだが、複数選択が必要になり、ぐぐったらcgi-lib.plの&SplitParamでできるってので使い始めたわけ。
ヴァカでした。
CGIとPerlの区別も含めて
$hogeにHTML文書が入っていると思われ その中にいくつもある<a href="mailto:メアド">名前</a>を 名前=>メアドのハッシュを<title>タイトル</title>の タイトル.txtで残しておきたいんだ。 教えてくれ。 できればタイトル.txtをサーバに保存やブラウザに表示するのではなく、ダウンロードさせたいのだが漏れにはさっぱりだ。 教えてくれ。
>>102 ハッシュにするのはこれでいい?
%hash = reverse $hoge =~ /<a href="mailto:(.+?)">(.+?)<\/a>/ig;
ただ、HTMLのタイトルをファイル名にする場合、ファイル名が日本語になってしまう
可能性がある。OSによっては日本語ファイル名を作れなかったりといろいろ問題が
あるので、回答は省略。
ダウンロード云々はCGIの話になる。スレ違いになるのでこれで勘弁な。
104 :
nobodyさん :03/03/23 18:41 ID:W+/TsMmG
13:5を01:05で表示するための、 もっとも簡潔で一般的なのは何ですか。時間です。 すいませんプログラミング初心者です。 書いてみたのですが、とてもよろしくないと気付いて模索しましたがわからないです。 sprintfでふた桁にしてみるとか、やってみたんですがダメでした。 検索してもSSIしかヒットしないです。すいません、よろしくお願いします。 $hourは0から23までで、$minは0から59までです。 $jikoku=$hour-12; if ($hour > 12 && $min < 10){ print <<EOF; $jikoku:0$min EOF }elsif ($hour > 12){ print <<EOF; $jikoku:$min EOF }elsif ($min < 10){ print <<EOF; $hour:0$min EOF }else{ print <<EOF; $hour:$min EOF } 笑わないでください。生まれてすいません
いろいろ回答はあると思うけど、俺だったら $hour %= 12; $jikoku = sprintf("%02d:%02d", $hour, $min); print "$jikoku\n"; >笑わないでください。生まれてすいません 卑下しすぎ。そんなくだらん質問でもない。
$mod_hour = $hour % 12; printf("%02d%02d",$mod_hour,$min)
107 :
104 :03/03/23 19:33 ID:???
>>105-106 さん
ありがとうございます!
パっと見て理解できる能力が、まだないですが
時間がかかるので先にお礼を言わせてください。
メモってお勉強の材料にさせてください、すいません。
ありがとうございました。
>>101 理解して学習する能力があるなら十分だね。
ヴァカなのはやりかたであって、本人じゃない。
気を悪くしてたら謝るよ。
109 :
nobodyさん :03/03/24 18:08 ID:JKyHEx6G
質問です. CGI で HTML のデータを標準出力するようなものを 実行したときには,その HTML が WWW ブラウザに 表示されるのでしょうか?
>>109 HTTP-Header を無視した話であるならば、Yes。
…などとマジ回答してしまったが、ここ Perl スレじゃんか。
CGIスレに行ってください。
>>109
112 :
109 :03/03/24 18:21 ID:JKyHEx6G
失礼しました CGI スレであらためます
>>108 これからもビシビシと厳しくご指導ご鞭撻のほどよろしくおながいします。
標準入力のSTDINをseekでもう一度読むことはできないんでしょうか。 read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); print "$str<BR>\n"; seek STDIN, $ENV{'CONTENT_LENGTH'} ,1; read(STDIN, $ppp, $ENV{'CONTENT_LENGTH'}); print "$ppp<BR>\n"; この時2回目のreadは無効になってます。 普通のFHはseekできたのですが。 これは仕様でしょうか?
115 :
114 :03/03/25 00:44 ID:???
間違いました seek STDIN, -1*($ENV{'CONTENT_LENGTH'}) ,1;
>114 $ppp = $str; これでダメなわけを教えてくれ。
ストリームはseekできないのでは?
モジュールでもよんでんだろ
119 :
nobodyさん :03/03/25 10:16 ID:ZJloW8nf
時間によって、特定のディレクトリ以下にアクセスできないように したいのですが、Perlでできますか?
>>119 OS は?ファイルシステムは?
誰に対してアクセス制御を行うのか?
自分以外?自分もアクセスできないの?
そもそもローカルの話?もしかして HTTP?それとも FTP?
… Perl でどうこう言う前に、定義すべき条件があるだろが。
121 :
4 :03/03/25 10:59 ID:4EHffvQl
>>119 何がアクセスできないようにしたいのか分からない。
Apacheなら無理だろ。
>>121 いや無理でもないさ。
chmod 仕組んだ Perl スクリプトを cron でまわすとか。
.htaccess 更新するような Perl スクリプトを cron でまわすとか。
下位のディレクトリを全て 0700 にしといて、CGI 経由しないと
参照できないようにするとか。# 要 suExec
もっとも、
>>119 が自分のWebサイトにおけるアクセス制御を
やりたがたっている、とは限らない罠。
123 :
119 :03/03/25 11:32 ID:???
>>120 >>121 >>122 説明不足ですいません。
プロバイダの共用サーバーで、自分のWebサイトの特定のディレクトリ
に対してやりたいです。すいません。
サーバーの情報は、今見たんですが書いてないのですが、@niftyの会員が
普通に無料で使えるやつです。すいません。
.htaccessは使用できないようです。すいません。
ただ、ちょっとPerlからズレますが、shスクリプトでchmodコマンドが使える
って書いてあります。
シェルスクリプトはわからないので、Perlでしたいです。すいません。
suExecていうのを知らないので、調べて見ます。
すいませんありがとうございます
124 :
119 :03/03/25 11:51 ID:???
何度もすいません。 suExecというのは、サーバーにインストールするもののようですが どうやら、無いようです。 たとえば、「0-7時の間は、このディレクトリにはアクセスできない」 というのを自動で実行させるようなことをしたいのです。 nobodyさんに対してです。よろしくお願い致します。
もう、Perl とは関係ないような気がしてるんだけど、
とりあえず、アクセス制御をかけたい「コンテンツ」を全てCGI化すれば
お望みの効果が得られるかと。
ただし、
>>119 のサイトが人気サイトでアクセス数大ならお薦めできない。
「すいません」をたくさん書けばいいってもんじゃない。
特定の日付の1日前を求めるにはどうすればいいでしょうか?
$date = 25; $date = $date - 1;
130 :
nobodyさん :03/03/25 13:28 ID:beWiS6Gq
>>127 特定の日にちって何?
$dayに特定の日にちが入っていれば
>>128 でOK
timestampだったら24*3600を引けばいい。
>>133 年月日でしょ。
Time::Local でググりゃ答え一発。
>>133 $year = 2002
$month = 1
$day = 1
これの前日とか。
timelocalでUNIXtimestampにして24*3600秒引いてlocaltimeで戻す。
137 :
4 :03/03/25 14:30 ID:4EHffvQl
>>122 >chmod 仕組んだ Perl スクリプトを cron でまわすとか
たしかにそうだ。
cronが使えるかが問題だが。
>>119 perldoc -f chomd
>>123 これはどう?朝7時に起動すれば、0時から7時までアクセスできなくなる?
while (1) {
sleep 60*60*17;
chmod 0700, 'foo';
sleep 60*60*7;
chmod 0755, 'foo';
}
>>138 Nifty って shell 使わせてくれるの?
じゃなければ、suExec 未導入だし無理でない?
foo の owner を nobody にしたら意味無いし。
140 :
nobodyさん :03/03/25 19:15 ID:dPveVoYX
1:チャットで「ポ」、「ー」等を特殊表示してみたい 2:$com =~ s/ポー/<font color="yellow">テスト<\/font>/g ; 3:それだと、インターナルサーバーエラーが出て動かなかった。 です。 本来出来ないことは分かってるんですが,どうにかならないでしょうか? 御願いします。
>>141 2:$com =~ s/\Qポー\E/<font color="yellow">テスト<\/font>/g ;
「ポ」と「ー」を分けるのなら、142,143のではダメね。 でもここまでヒント出してあればできるでしょ。
>>141 もっと根源的な解決方法としては、EUCコードで書くと言う手がある。
それなら、スクリプトを変更する必要はなくなる。
146 :
102 :03/03/25 20:11 ID:???
>>103 遅レススマソ
メアドの件OKでした。
タイトル.txtで保存の件、メアドの件の応用で試しにやってみたらOKでした。
ダウンロード云々の件は日を改めて後日。
エポックタイム使えない場合でモジュール使えないのであれば、ユリウス時間を使えばとかいってみるテスト
148 :
nobodyさん :03/03/25 22:44 ID:hk3KdRHA
すまん、ちょっと聞きたいんだけどさぁ cgiとか作りたいと思ったら本買った方がいいかなぁ?
>149 まず、配布されてるスクリプトの中身を見て、改造から入る。 次に、Perl関連の紹介などをしてるサイトを回り、基本的なことを覚える。 作るだけならこれで十分。 買うに越した事はないけどな。
>>149 プログラミングを他言語でしたことあるなら
別に買わなくても良いかと
初めてなら、とりあえず文法覚えり
とほほとかで
紙媒体がある方が覚えやすいような気がするのは、俺の気のせい。
すみません。 「ハッシュのキー」が同じなら真を返す。とかそんな技ないでしょうか? $abc{'aaa'} eq $efg{'aaa'}; #これを真にしたい。(と言うか同じキーかどうかが分かればOK) もしかして、無茶言ってますでしょうか?
キーが・・・ 定数同士なら見りゃわかる。条件式にかけるまでもない。 変数ならその変数同士を比べればよいのでは?
156 :
nobodyさん :03/03/26 09:38 ID:6kbB+W9+
例えば $aaa= 0..79; で 特定の値にだけ、配列の要素を割り当てるってことはできないでしょうか $aaa= 0..79; @bbb= ('あ','い','う','え','お'); print "$bbb[$aaa]"; というのをやりたいんですが、 @bbbに0..79までの要素を全て割り当てないで、 0と7と9だけ割り当てたいとか、そんな場合はどうすればよいでつか if文とか使わないで、「0はこれ!」「7はこれ!」て 定義したいです。
$aaa= 0..79; これってどういう振る舞いをするの? @aaa=0..79なら0から79までを配列に入れるんだけど。
>>156 意味がわからん……
配列初期化のときにダミー(undefか空文字列)を入れておいて、値のほうを制限。
またはハッシュを使うとか。
%bbb = ( 0=>'あ', 1=>'い' );
>>156 質問の意味がわからんので、そもそも何をしたいのかを書いてください。
もしかしたら、こういうことか? @bbb[0,7,9] = qw(a b c);
>>156 > 0と7と9だけ割り当てたいとか、
$bbb[0]=0; $bbb[7]=7; $bbb[9]=9;
これじゃだめなのか?
162 :
156 :03/03/26 11:50 ID:???
>>157-161 さむくすでつ!
>158
できた!マヂでできました!超うれしいよ!ありがとう!
質問がおかしくてスマンかったです。
$aaa= $ccc % 80;
の動きをするものです。
>158のやり方ででけました。ありがとう!
そうか!配列じゃダメなんですね!すごいよ!
>>160-161 後で試してみます。qwとかわからないので、本見てみます。
本当にありがとう!やた!やったー!
2chスゴイよ!毎日来ていいでつか?ありがとう!
163 :
156 :03/03/26 12:47 ID:w4nYALSA
また来ました 「0はこれ!」「7はこれ!」のやり方はわかったのですが、 「0〜7の範囲はこれ!」はどうしたらいいですか if文は使いたくないです。 $aaa= $ccc % 80; @ddd= (0..7,8..15,16..79); %bbb= ($ddd[0] => 'あ', $ddd[1] => 'い', $ddd[2] => 'う'); print "$bbb{aaa}"; 動かないでつ 何がいけないでつか この事態によく遭遇するんで、困ってまつ。 ハッシュのリストの中で、演算しをつかいたいです。使いたいです 範囲を指定したいんです。したいです これさえできれば、僕のやりたいことは全部できるんでつ 泣きそうでつ。
>>163 print "$bbb{aaa}";
を
print "$bbb{$aaa}";
もうちょっと落ち着け・・・
>>163 なんでif文を使いたくないの?
最初の質問もそうだけど、何をしたいのかがわからないのよ。
せめてどういう結果が欲しいのかをきちんと提示してくれ。
>>163 これで満足か?
map { push @ddd, 'あ' } (0..7);
map { push @ddd, 'い' } (8..15);
map { push @ddd, 'う' } (16..79);
print $ddd[$ccc % 80];
んー、でも春休みだぞ?
補講だろ(w
170 :
nobodyさん :03/03/26 17:21 ID:SzbA3L14
if ($#past > $log_line) { この$#pastって意味わかる? #っていうのはそのあと全部無効にするんでしょ? なにか特別な表現?
>>170 Perl の 配列について調べてみればすぐわかる。
ぜひ自分で答えに辿りつかれたし。
検索キーワードは、Perl 配列 インデクス、かな?
172 :
nobodyさん :03/03/26 17:45 ID:SzbA3L14
173 :
163 :03/03/26 17:53 ID:???
>>164-169 さむくすでつ!
>>165 僕のパソコンで動かす、日めくりカレンダーをつくってるんです。
僕の誕生日に
http://127.0.0.1/にアクセスすると 、
「誕生日おめでとう!○○(俺の名前)くん!」と出ます。
これは、さっき
>>158 さんに教えてもらったやり方でできるようになりました。
だけど、例えば15日〜20日まで同じものを表示したいときなど、
どうしたらいいか悩んでます。
if文だと、「14より大きくて21より小さいから、これ!」って発想になるのが
いやなんです。
だから、if文は使いたくないんです。好きじゃないんでつ。重いんでつ
今は練習段階だけど、うまくいったらWebでも使ってびっくりグーグルのように
したいです。
>>166 ありがとう!
mapというのは、ぐぐったらどうやら関数のようでつね
初めて見ました。
僕の持ってるPERL本5冊には、載ってない未知の領域です。
ネット上のリファレンスとか見たけど、いまいちわからないです。
わかったようなわからないような、悩ましい状況です。
悩ましくて苦しいです。あたまの中がループしてます。最後のお願いです
解説してください。これさえわかれば、何でもできるんでつ
お願いします。お願いします
174 :
座敷荒氏 :03/03/26 18:32 ID:SqsuYLcB
はじめまして。宜しくお願い致します。 RedHat7.2を使用して「すぐわかるPerl」を参考書に勉強しています。 「すぐわかるPerl」のP.19にファイル名でプログラムを実行するという手順があり、 #! /usr/bin/perl print ("3 * 2 = "); print (3 * 2); print ("\n"); と記述してプロンプトからファイル名を指定しても、 bash: calc: command not found と表示されるだけで $ perl ファイル名 で実行したものと同一の結果になりません。 (この場合には3 * 2 = 6と結果がかえってきます) 一行目を #!/usr/bin/perl に書き換えてもやはりダメです。 %type -a perlの結果は perl is /usr/bin/perl となっています。 原因と対処をご指導ください。 宜しくお願い致します。
>>174 パーミッションは?
ファイルの先頭に./(ドットスラッシュ)つけてる?
176 :
座敷荒氏 :03/03/26 18:51 ID:SqsuYLcB
パーミッションは-rwxrwxr-xとなっていて 一般ユーザー権限で試しています(言い方あってますか?) >ファイルの先頭に./(ドットスラッシュ)つけてる? つけていません。参考書に記載がないので。 これはどこに記述すればいいのですか? #! /usr/bin/perl の先頭に記載して ./#! /usr/bin/perl とすればよいのでしょうか?
$ chmod u+x calc $ ./calc ってことだな。 つまり、Perl より先に Linux の勉強をしる、ということだ。
178 :
座敷荒氏 :03/03/26 18:56 ID:SqsuYLcB
あ、できました。 ありがとうございます。 言い訳になりますがRedHatも こないだPerlのために用意したばかりで 勉強不足でした。 なぜこれでOKなのかは自分で勉強したいと思います。 本当にありがとうございました。精進致します。
>>179 少なくてもwebprogでifが重いとかいってるやつは、
短絡的で思い込みが激しくて相対的な思考ができない馬鹿。たいていA型
ifが重い・・・分岐はパイプライン処理を阻害するらしいが、こういう分野でそんなこと気にしていたら やっていられないよな。それにPerlならユーザの知らないところでたくさんの分岐を行っているはずだ。
ifを使って処理が複雑になるなら、使わない方がいいだろうけど。 アホには妙な先入観があるんでしょう。困った。
>>173 mapは戻り値を捨ててはいけないぞう。ぷぅ。
構造は、map BLOCK LIST、返り値は、LISTの各要素についての、
BLOCKの結果のリスト。
184 :
nobodyさん :03/03/27 00:54 ID:8Ff5snZV
Perlの事を詳しく知りたいので勉強始めたのですが、正直どこ から初めていいかよく分からなくなってきてしまいました。 MacOSXを仕事の関係で自宅でも使用しているのでperlは使え る状態まで設定が終わり、Perlの解説本(とほほWWW入門) を買ってきたのですが、理解が浅く、自分のやってみたい事 はあたまには浮かぶが、実際にperlで書けない状態です。 慣れるにはどのようにしていったらよいのでしょうか? 本当に困ってます。 馬鹿ですみません。
185 :
nobodyさん :03/03/27 01:02 ID:aF0pcOGY
漏れも初心者です。 とほほWWW入門がどんなのか知らないけど 初めから読む。 本に書いてあるプログラムを実行する。 分からなかったらそれを書き換えて自分が納得するまで いじる。ってのをしてます。 独習Perl読んでる。
>>185 そうなんですよね。
どうしても仕事で使うので、いろいろ必要な所をかいつまんで
いるのですが、時間が足りなくもうなんかダメダメになりそう
です。マジで泣きながらキーボード打ち込んでます。
今は使えそうなフリーの素材を使って少し命令をいじって自分
のマシンでテストしています。
俺には向いてないのかなぁ。このままじゃあ、クビになるかもし
れない、でも、ここの皆さんはできている人が多いみたいだし。
生き残るなんてできないのかなぁ。
愚痴になってごめんなさい。
もうちょっと頑張ってみます。
いい勉強法があるといいよね。 要するにその「いい勉強法」にたどり着けるかどうかが分かれ目なんだろうなと思う。。
>>186 ある程度のレベルに達してないとセキュリティ面で穴が空きそうだのう。
もしもの事があればおおごとじゃから諦めなされ。
だからと言ってフリーのものを少々b改造して著作権表示を
すり替えたりせんようにな。社会人としてのルールじゃ。
ここの板が過疎化している通り、webprogを自在に操れる人々は
ネット人口に対してはごく一部じゃ!まだ遅くはないぞ!
何事にも近道は無い。じっくり、まったり勉強なされ。
そうそう忘れておった。perlのセキュリティを学ぶには 技術評論社の「プログラミングによるセキュリティ強化ガイド」がまあまあいいぞえ。 自分の能力を向上させる為なら金は惜しむな。先人の偉大なる著作物を手に入れるのじゃ。
というか・・・ とほほな人がイタタな人だから心情的にはお薦め出来ないってのはある。 それに、perlの参考書を買うのもいいのだけどその参考書は二次生成物だから 本の駄目なレベルまでわかるレベルになればマスターした事になると思われ そいうことで、本としてお薦めは駱駝本になるのだけどね。 別に本を買わなくてもウェブ上で転がってる資料でも問題無いし、 別に本を買ったからといって覚えれる物でもない。
191 :
141 :03/03/27 14:57 ID:???
>>142-
>>145 ありがとうございます。
出来ました。
192 :
173 :03/03/27 18:19 ID:???
ひどいよ!みんな!
条件分岐させるのがいい場合もあるだろうけど、
最初から「これ!」て定義したいものには、if文とかより
もっと効率のいいやり方があるんじゃないかって思っただけだよ!
僕はO型でつ。
バカだけど、バカにされると一応悲しむだけの感情はあるんだぞ!
>>184 戻り値とか返り血とか何でつか
簡単な式でも略して書かれるとわからないレベルでつ
ひもとけないのでつ
ていうか、僕の所有する5冊のPERL本では簡略化されたものは出てこないので
順をおって書かれてないとわからない。わからないー
ほんとにお願いします。
いっこづつ解説してください。心からお願いします
>>192 その話し方じゃ教えたくないと思うのはオレだけじゃないはず。
レス番くらい間違えないでください。
>>192 Perl流の省略の仕方が理解できない分際で、
if文が重いとかほざくな。
足し算ができない奴に掛け算ができるわけがない。
自分が理解できてることだけでスクリプト組んでろ。
>196 いいこというなぁ。 漏れも頑張るか・・・。
というか、
map使うのが一番メモリー食うらしいですけどね・・・
>>192 まぁ、順序追ってその時その時で覚えた関数がどう使えるかというのを理解しつつ
やっていくとよいと思うけどね。
いっぺんに効率の良い処理を書こうと思ってもそれは無理だから一度ソース書いて
それがどうやれば見やすくなるかって考え方で逝くほうがいいと思う
200 :
nobodyさん :03/03/27 23:06 ID:AfQiNFrt
perlを使ってウエブのテキストエリアの部分に文字を 挿入する事ができるんでしょうか?
<textarea>文字</textarea> でいーじゃん
>>201 うーんと、ちょっと違うかもしれません。
要は今見ているページのテキストエリアにperlのgetもしくは
postで任意の文字を入れる事がperlが動作するマシンから実行
できるのかなという事なんですが、説明がうまくできなくてご
めんなさい。
?????
>>204 うまく説明ができない・・・。
ブラウザからgetやpostで情報を受け取る事ができるなら、
ブラウザのテキストエリアに送る事もできるのでしょうか?
>perlのgetもしくはpost アホですか?
>>205 よーわからんけどssiじゃないのそれ?
>ブラウザのテキストエリアに送る 全然わかんない
Javascriptのお仕事だな。
>>206 すみません・・・。
どこがアホなんでしょうか?
教えてください
>>205 は、基本的なHTTPプロトコルを学ぶべき。
HTML文書のフォームから送ると言うことは、FORMタグのアクションに指定されたページに飛ぶのと同じ。
>>210 うまく説明できないなら、まず
言いたいことを整理するか、
やりたいことの具体例を示しなさい。
別にあせらんでもこのスレは逃げません。
>>212 とりあえず思いついた例として
掲示板に書き込みをする際にブラウザを使った書き込みではなく
自分のマシンからperlにて書き込みができないのかなと。
こういう感じでよろしいのでしょうか?
>>213 できます。
HTTPをしゃべるスクリプトを書きなさい。
以上。
215 :
nobodyさん :03/03/28 00:36 ID:OXxoJAYf
>>214 ありがとうございます。
見よう見まねですが自分で作った掲示板に、自分で作った
perlで書き込みができるのかテストしてみます。
もしよろしければそのhttpをしゃべるスクリプトの例とい
うのがどのように探せばあるのか、教えていただけません
か?
よろしくお願いします。
216 :
4 :03/03/28 00:40 ID:JsShpJ/5
>>213 できます。
HTTPとSocketモジュールの使い方勉強したらすぐできる。
217 :
nobodyさん :03/03/28 00:42 ID:td6NGscT
218 :
4 :03/03/28 00:43 ID:JsShpJ/5
>>216 どうもありがとうございます。
長々と説明を続けてしまって申し訳ありません。
アホなので、許してください。
早く皆さんのように質問に答えられるようにスキル
を身につけてみます。
もしその前に挫折して聞きに来る事があるかと思い
ますが、よろしくお願いします。
>>215 荒らしにつかわれることを懸念してか、
POST のサンプルスクリプトは、あまり見つからない。
# まあ、これは俺の検索が甘いだけかもしれんが
書き込むだけなら GET でも可能だし、これなら
Perl Socket HTTP あたりをキーワードにして検索すれば
いくらでも見つかる。
GET で HTTP での会話を知ってしまえば、POST だって簡単。
tcpdump に類するツールを所有しているなら、
それでWWWブラウザとHTTPサーバとの会話の様子を
覗いてみるのもお薦め。
>>218 oioi
>>214 簡単なサンプルならlwpcookにもあるんじゃない?
perldoc汁
222 :
211 :03/03/28 01:10 ID:???
ごめん。まちがった。 s/214/215/
223 :
4 :03/03/28 01:30 ID:JsShpJ/5
HTTPのRFCを一度読んでみたらいいと思う。
HTTPは比較的簡単プロトコルだと思うのでネットワーク関係の
プログラム作りたいならHTTP ClientやHTTP Serverを書いてみる
といいかも。
まじめに答えると、
http://x68000.startshop.co.jp/~68user/net/ とか、いいかも。GETはあります。
POSTは上に書いてあるとおりContent-Lengthつけて、ヘッダと
ひとつ空行あけて送るデータを書けばいいだけです。
224 :
4 :03/03/28 01:32 ID:JsShpJ/5
どうでもいいが HTTP プロトコル と書くのは、 Perl言語 と書くのと同じだと思う。
LWP使え。
227 :
nobodyさん :03/03/28 02:00 ID:OFR1eFyu
質問です。 ネット上のページを取得するのに、LWP::Simpleとwgetを使う方法があるとのことで、 それぞれで実際に取得するところまで漕ぎ着けました。 対象ファイルのサイズは20〜50kb程で、それぞれの実行時間はほぼ同じでした。 このスクリプトは共用鯖でCGIとして実行するので、負荷が気になります。 負荷の上ではどちらが良いのか、もしくは他の方法があるのか、お教えください。
どうでもいいが Perl言語 と書くのは、 チゲ鍋 と書くのと同じだと思う。
どうでもいいが Perl言語 と書くのは、 POP言語 と書くのと同じだと思う。
早い話がどうでもいいスレ。
ほんとすんませんが、お聞きしたいことがあります。 Perl5以上で記述された、「URL通知システム」どこにあるか知りませんか? たとえば、あるページを見ている人が自分の携帯電話に、そこで指定されているURLをメールしたい。 そんなのなんですが、よく広告ページの携帯用出会い系サイトなんかで使われているやつです。 もし。公開しているところがあったら教えてください。 ほんとすんません・・・・・・・
234 :
nobodyさん :03/03/28 09:30 ID:CxnPNSFm
235 :
bloom :03/03/28 09:35 ID:Mi9Fl0u+
236 :
初心者 :03/03/28 09:54 ID:???
2つ質問があるのですが1つずつ・・・ クッキーを書き込みたいのです。 で、色々調べて回って、何とかこんな感じでできました。 #1 #!/usr/bin/perl #2 use strict;&main;exit; #3 sub main{ #4my $id = "abc"; #5my $value = ""; #6print "Set-Cookie: ".setcookie($id,\$value); #7print "Content-Type: text/plain\n\n"; #8print "SetCookie!!";} #9 sub setcookie{ #10my ($id,$cookie) = @_; #11my $expires = ""; #12my $day = 1; #13$$cookie =~ s/([^\w ])/'%'.unpack('H2',$1)/eg; #14$$cookie =~ tr/ /+/; #15if ($day > 0){ #16my ($mday,$month,$year,$youbi) = (localtime(time + ($day * 86400)))[3..6]; #17$youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$youbi]; #18$month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$month]; #19$year += 1900; #20$mday = sprintf("%02d",$mday); #21$expires = " expires=$youbi, $mday-$month-$year 00:00:00 GMT";} #22return "$id=$$cookie;$expires\n"; #23 } 書き込めるのですが、ブラウザを閉じたら消えるようにしたいのです。 #12行目のmy $day = 1;の数字をゼロにしたけど、うまくいきませんでした。 同じく数字を消してもみましたが、うまくいきませんでした。 どこをどういじれば良いのか分からないので、どうか教えては頂けないでしょうか。
>>236 #15 を削除
#21 の「}」を削除
238 :
236 :03/03/28 10:12 ID:???
これが236を受けるスクリプトです。少々改造したいのですが、方法が分からなくて困っています。
Cookieの有無を調べて、abcというクッキーがなければよそに飛ばしたいのです。
#1 #!/usr/bin/perl
#2 use strict;&main;exit;
#3 sub main{
#4 my $id = "abc";
#5 my %cook = ();
#6 getcookie("abc",\%cook);
#7 print "Content-Type: text/plain\n\n";
#8 print "a:$cook{'a'}\n";
#9 print "b:$cook{'b'}\n";}
#10 sub getcookie{
#11 my ($id,$cook) = @_;
#12 my %cook = ();
#13 my $cookie = $ENV{"HTTP_COOKIE"};
#14 $cookie =~ tr/+/ /;
#15 $cookie =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2',$1)/eg;
#16 foreach my $x (split ";",$cookie){ my ($key,$value) = split "=",$x,2;
#17 $key =~ tr/ //d;
#18 $cook{$key} = $value;}
#19 foreach my $x (split ",",$cook{$id}){ my ($key,$value) = split ":",$x,2;
#20 $$cook{$key} = $value;}
#21 }
#13行目に my $cookie = if($ENV{'HTTP_COOKIE'},'abc' ) < 0 ){
print "Location:
http://www.hoge.com/\n "; }
とでも書けば良いのでしょうか? それとも全然違う行に全然違う事を書けば良いのでしょうか?
何にしても初心者の私にはこれ以上は難しいでとても困っています。
どうか救いの手をお願いできないでしょうか?
239 :
236 :03/03/28 10:15 ID:???
237さん早速どうも有り難うございます。m(_ _)m
>>236 CGI側ではブラウザを閉じたことを判別できないので、無理です。
JavaScriptを併用すれば可能かもしれない。が、これ以上はスレ違い。
>>234 ありがとう御座います。
いいですねえ、こんなの。もっとシンプルに1っ子だけしか送れないやつでも良いんですけどね・
ええっと・・・・・そのですねえ・・・プログラムが置いてあるところが知りたいんですけど・・・・
すみませんが・・・・よろしくおねがいします・・・・・・
ほんとだ!
244 :
227 :03/03/28 11:40 ID:???
スレ違いみたいなので「WebProg 初心者の質問」に移動します。 お邪魔しました。m(_ _)m
245 :
236 :03/03/28 11:42 ID:???
238に間違いが見つかりました。 #8 print "a:$cook{'a'}\n"; #9 print "b:$cook{'b'}\n";}は #8 print "abc$cook{'abc'}\n";でした。<(_ _)>
246 :
nobodyさん :03/03/28 16:44 ID:I24HmqWV
たまに、html内に「%%HOGE%%」こんな記述を見るんですけど これは一体なんの意味があるんでしょうか。
247 :
kyo :03/03/28 17:25 ID:b4ccXG3w
BBSをperlで作っているのですが、レス機能の付け方が良く分かりません。 どこか分かりやすい解説が載っているサイト知りませんか?
>>247 ログファイルに「スレ文」か「レス文」かを分けるなんらかの目印を入れる。
読み出しの時はその目印でレスかスレかの処理を分ける。以上。
他には書きようがない。
他人のBBSでも眺めれば?
CGIスレで誘導?されたのでこちらで質問させてください apple,青森,40 orange,愛媛,20 strawberry,茨城,30 ↑これがそれぞれ @fluit = ('appe','orange','strawberry'); @from = ('青森','愛媛','茨城'); @price = (40,20,30); こんな感じに配列に入ってるとき、たとえば下のようにすると、、、、 foreach (sort { ($price[$b] <=> $price[$a]) || ($a cmp $b) } 0 .. $#price) { print "$fluit[$_],$from[$_],$price[$_]\n"; } apple,青森,40 strawberry,茨城,30 orange,愛媛,20 ↑こうなると思うんですが、 ソートする条件をフォームから指定させたいんです。 たとえば、($FORM{'jyouken'} eq "fluit")ならfluitでソートって感じに・・・ どのようにすればいいでしょうか?(説明へたですいません)
あげ忘れましたすいません
>>249 あっちにもかいたけど
構造がだめっぽ 自分ならこうする
@data= (
{fluit=>'apple',from=>'青森',price=>40},
{fluit=>'orenge',from=>'愛媛',price=>20},
{fluit=>'strawberry',from=>'茨城',price=>30}
);
@data = @data[sort{$data[$a]->{$FORM{select}} cmp $data[$b]->{$FORM{select}] } 0 ..$#data];
for (0 .. $#data) {
print "$data[$_]->{fluit},$data[$_]->{from},$data[$_]->{price}\n";
}
res有難うございます。 えっと、恥ずかしながら @data= ( {fluit=>'apple',from=>'青森',price=>40}, {fluit=>'orenge',from=>'愛媛',price=>20}, {fluit=>'strawberry',from=>'茨城',price=>30} ); これははじめて見たんで、何をしてるのか・・・調べてきます。 できれば弄るところが多くなると思うんで、そのままの構造でいきたいんですが、、、
253 :
4 :03/03/28 19:08 ID:JsShpJ/5
それは連想配列のリファレンスを配列として 扱っているのだと思います。違ってたらスマソ。 俺もこういうのちょっとガンバロ・・
254 :
249 :03/03/28 19:19 ID:???
}] } 0 ..$#data]; ↓ }} } 0 ..$#data]; こうですね。動作確認できました。 しかし、なにをやってるか調べてもわからないので、 どう組み込んだらいいのか・・・ この解説ページないですかねぇ
255 :
4 ◆oIfBpVov3. :03/03/28 19:32 ID:JsShpJ/5
>>246 テンプレートファイルに特定の変数値を流し込むための目印みたいなもん。
s/%%HOGE%%/$hoge_value/;
で、変換しているとか。
258 :
lanble :03/03/28 20:38 ID:iBaRMkHH
正規表記で日本語にマッチさせるにはどうすればいいですか? text:<head><title>タイトルン</title></head> があるばあい「タイトルン」だけに変更して表現するときはどうすれば いいですか?あと text:<head><title>titlen</title></head> のtitlenにもマッチさせたいのですが、これらを正規表記一行で表現すると どうゆうふうになるのですか?
261 :
nobodyさん :03/03/29 00:45 ID:fHpTV+Jc
3年くらいperlをいじってなかったので、 初歩的な質問かもしれないですが・・・・・・・ パスワード制限するページで、 IDとパスワードでアクセス制限 (Basic認証でなく、<form>タグ内と<input tyle= text と passworsで) して、ページを、 Apacheとperl5の環境でやりたいのですが、 どういう方法があるのでしょうか? ●<input type=hidden>で変数をやりとりする ●クッキーを使う は知っているのですが、 これしか方法はないのでしょうか?
262 :
nobodyさん :03/03/29 01:01 ID:8vJPU8lo
質問させてください。 cgiで以下のを実行させるとフレームが5個くらいできるのだけど なぜですか? #! /usr/bin/perl test(); sub test{ print <<END; Content-type: text/html; charset=Shift_JIS <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <html> <head><title>testdesu</title></head> <frameset cols="50%, 50%"> <frame name="t2" src="$ENV{'SCRIPT_NAME'}?frame=test2"> <frame name="t3" src="$ENV{'SCRIPT_NAME'}?frame=test3"> <noframes> <p>このページはフレームをサポートしているブラウザで利用する必要があります</p> </noframes> </frameset> </html> END }
>>261 セッションのキーはその何れかで残すしかない。
265 :
nobodyさん :03/03/29 01:48 ID:8vJPU8lo
>>263 足りなかったです。これを実行させたいのですが、brankのフレームが6個できます
なぜ6個でどういう動作しているのでしょうか?
#! /usr/bin/perl
if($FORM{'frame'} eq 'test2'){hidari();}
elsif($FORM{'frame'} eq 'test3'){migi();}
else{test();}
exit;
sub test{
print <<END;
Content-type: text/html; charset=Shift_JIS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html><head><title>test</title></head>
<frameset cols="50%, 50%">
<frame name="t2" src="$ENV{'SCRIPT_NAME'}?frame=test2">
<frame name="t3" src="$ENV{'SCRIPT_NAME'}?frame=test3">
</frameset></html>
END}
sub hidari{
print <<END;
Content-type: text/html; charset=Shift_JIS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>test2</title></head><body>test hidari</body></html>
END}
sub migi{
print <<END;
Content-type: text/html; charset=Shift_JIS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>test3</title></head><body>test migi</body></html>
END}
266 :
bloom :03/03/29 01:55 ID:i2vNq3FD
>>265 なぜって、これ以外にもスクリプトあるんじゃないの?
単独のCGIじゃないでしょ
268 :
nobodyさん :03/03/29 02:43 ID:wFiuyLe9
>>265 単純に$FORM{'frame'}のデコード処理がないからとか?
前にも見たな。$FORM{} に自動的にフォーム内容が入ると思い込んでるソース。
そういう楽がしたいんなら、PerlじゃなくてPHP使えってことだな。 後のことは知らんが。
JavaにあるisSecua()メソッドのような、
通信がセキュアであることを判定するようなメソッドが欲しいと思い、
いろいろ環境変数などを探してみたのですが、ぜんぜん見付かりません。
どうやったら確実に判別できるのでしょうか。
もしかして、「
https://から始まっていたらセキュア通信! 」みたいにすればOKですか?
>>272 isSecua() メソッドとは何をもって通信がセキュアであると判断するんだ?
あと、どこまでのセキュリティレベルを必要としてるんだ?自分で理解してるのか?
それに環境変数ごときで判断して良いなら SSL_* 変数をチェックすりゃ十分だろうし、
https:// から、なんてレベルなら SERVER_PORT でも見りゃいーじゃん。
Perl と関係ねーじゃん。よそ逝け。
274 :
nobodyさん :03/03/29 15:06 ID:GyYYsUNO
今isSecuaメソッドをPerlで書いてるんだっちゃ。 そげなこといわんと、実装方法教えてくんろ。
275 :
251 :03/03/29 15:10 ID:???
>>272 perlにも汚染モードがあるけどどこまで使えるかはしらね・・・
つか、全部自分で責任もつのが本来のperlだし
>>274 は、
>>273 を読んでないのか?
何をもってセキュアだとするのか、定義を決めなければ実装もできんだろうが。
自分がやることやらないで他人に頼ろうとするな。
277 :
nobodyさん :03/03/29 20:46 ID:rt7Ytb+z
278 :
nobodyさん :03/03/29 20:59 ID:NU31LA3c
>>227 >ネット上のページを取得するのに、LWP::Simpleとwgetを使う方法があるとのことで、
>それぞれで実際に取得するところまで漕ぎ着けました。
どうやるの??
>>278 man wget
perldoc LWP::Simple
読め
280 :
nobodyさん :03/03/29 22:17 ID:NU31LA3c
281 :
nobodyさん :03/03/29 23:42 ID:NU31LA3c
インフォシークに
#!/usr/local/bin/perl
use LWP::Simple;
my $url = "
http://www.google.com ";
my $content = get($url);
print $content;
exit(0);
ってのをアップしたんだけど500になってしまいます。
なんでだろう。
>281 LWPが使えないから。 tu-ka,テストはローカルでやれ。
>>281 まずローカル鯖でテストしてからやれや、ボケ。
headerも無いな。 何でだろうも糞も無い。
LWPが使えるかどうかってどうやって調べるの?
使ってみる
>>287 500エラーって事はHTTP経由だろ?なら要るだろうが。
>>285 #! /usr/local/bin/perl
print 'Content-Type: text/html', "\n\n";
eval {
require LWP::Simple;
};
if ( $! ) {
print $!
} else {
print 'OK'
}
>>289 No such file or directoryこんなのでた。
使えないといっても二つあるよな。 ないから使えないだけなのと、自分で置いても使えないのと。
>>290 OKが出なかったんなら、エラーが出たってことだろ。
つまりないってことだ。少しくらい考えろ。
293 :
nobodyさん :03/03/30 03:20 ID:DsnrZpx8
>>293 Perlとはなんもかんけーねぇじゃねーか!
問題の分類も切り分けもできんような奴はすんな!
スレ違い!
春厨の季節でつね
なんでも春のせいにする厨房の季節でつね
「なんでも春のせいにする」と「特定の現象を春厨のせいにする」の違いが分からない厨の季節でつね。
300 :
299 :03/03/30 04:46 ID:???
聞き直す。 特定の現象とはどの現象を指しているの?
301 :
nobodyさん :03/03/30 05:26 ID:C4JPPs9n
Perlも2チャンネルも初心者なので御門違いな質問したらごめんなさい。 Perlで掲示板を作り、携帯からそれを利用できるようにしました。 するとauの携帯から書き込む際に cgi-lib.pl: Unknown Content-type: application/x-www-form-urlencoded; charset=shift_jis というエラーが出ます。この原因(とできれば解決法)を 一言でいいのでどなたか教えてください。 パソコンとi-modeからはちゃんと書き込めるんですけど…。
302 :
nobodyさん :03/03/30 05:48 ID:pEUiOEbB
この頃、掲示板やそのた色々なcgiのソースを読み漁ってるんですが 結構巨大なcgiとかになってくるとサブルーチンからサブルーチンとか ピョンピョン跳び回って、なかなか変数や配列の後を追えないと言うか 今、ココに格納されるべき変数は・・え〜っと何だっけ?アレ? ってな具合になってしまいます。サブルーチンの引数の中にサブルーチンが 含まれててその引数にまたサブルーチンが・・見たいなことになるとマジで 混乱してしまいます。 何か良い方法はないでしょうか?
エディターを変えてみ
304 :
302 :03/03/30 07:12 ID:???
以前、perlエディタスレを見て色々試してみて今はperl Edtiorってのを 使わせて貰ってます。変数エクスプローラーってのがあってサブルーチンや 各変数にピョンピョン飛べるのが凄く助かります。
305 :
251 :03/03/30 10:35 ID:???
>>302 構造化エディタを個人的には使ってるけど
sjisしか使えないのがネックだなぅ
秀丸+尻。
perl初心者な者ですがIDについて質問です。 306 :nobodyさん :03/03/30 11:31 ID:[ コレ ] こういう風に、毎回IPが一緒とは限らない実行側を どのように判断して毎回同じIDを与えているのでしょうか? 判断材料としてはやっぱり IP、HOST、ブラウザなんかを読んで判定してるんでしょうか? 質問へぼくてすみません。
IPと日付
IPアドレスと日付と板ID
>>308 Perlと何の関係が?
そのうち「Perl初心者な者ですがハヤシライスの作り方について質問です」なんていう
質問が来そうで鬱だ。
>311 #! /usr/local/bin/perl print "Content-Type: text/html\n\n"; print 'ハヤシライス'; exit;
>>312 それなら
#! /usr/local/bin/perl
print "Content-Type: text/plain\n\n";
print 'ハヤシライス';
exit;
だろうよ。
314 :
nobodyさん :03/03/30 20:04 ID:lN4HiIUc
perlのマニュアルを全文検索できるサイトはないでしょうか?
315 :
nobodyさん :03/03/30 20:18 ID:lN4HiIUc
Perlメモにある「
http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF 」
「値に改行コードを含む CSV形式を扱う」
http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF を使ってみたのですが、
結果、改行を含むセルが、2行として分析されてしまいます。どうすればいいのでしょうか?
■csvファイルは、以下の通りです。
a,1,2,"あああ
いいい",かかか
あ,2839,sw,5,6
■cgiの実行結果は以下の通りです
a12"あああ<br>
いいい"かかか<br>
あ2839sw56<br>
■スクリプトは以下の通りです。
open (IN,"read_csv.csv") or die;
while (my $line = <IN>) {
$line .= <DATA> while ($line =~ tr/"// % 2 and !eof(DATA));
$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
# @values を処理する
foreach $column (@values){
&jcode::convert(\$column, "sjis");
print $column;
}
print "<br>";
}
close IN;
317 :
315 :03/03/30 20:53 ID:???
318 :
315 :03/03/30 21:24 ID:oGZ4ZySM
もう1ついいでしょうか?
Perlメモにある排他制御を使いたいのですが
(
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock )
とりあえず中身がどういう仕組みかわからないながらもとりあえず使いたいのですが、
使用方法がわかりません。。。。
# ロックする(タイムアウトあり)
$lfh = my_flock() or die 'Busy!';
# アンロックする
my_funlock($lfh);
とあるのですが、具体的に、
たとえば、./log/bbslog.txt にロック/アンロックするには、どういう書式にすればいいのでしょう
>>314 http://search.cpan.jp/ ここなんかどうでしょ
で、私の質問ですが、
multipart/form-dataでデータを受け取って
CGI..PMでアップロードしようとしています。
で、
use CGI;
my $cgi = CGI->new;
こうした時点で/cgi-bin(実行path)にtmpファイルが作成されるのですが
これを回避することってできるんでしょうか?
あるいはせめてtmpファイル作成場所の指定をしたいわけです。
ご存知の方教えてください。
>>321 $CGITempFile::TMPDIRECTORY = './your/lovely/dir';
323 :
321 :03/03/31 01:15 ID:???
324 :
nobodyさん :03/03/31 02:28 ID:U3RJ6jN1
perlなるものに挑戦しようとおもっているのですが、Perl CGIを配布している方ってみんなUNIXなんですか? UNIX環境で云々と書いているので、UNIXなんですかね。WindowsにActive Perlとhttpadじゃだめですか?
試してからモノを言え。
326 :
nobodyさん :03/03/31 02:48 ID:poa5fGTP
俺はWindowsにActivePerlとApacheだぞ。 気にするな
328 :
p0604-ip02sasajima.aichi.ocn.ne.jp :03/03/31 05:14 ID:E9hS93FY
guest guest
自分のマシンがWindowsでもサーバマシンは殆どUNIXでしょ。 自分が初心者で、これからPerlをやっていこうとしてて、 使えるサーバスペースがWindowsしかないのなら、とりあえず UNIXのサーバを借りた方が勉強楽だと思うよ。
>>329 それはつまりサーバー上でテストしろという意味か?
テストはローカルでおねげぇしますだ...
専用サーバならOK?
333 :
nobodyさん :03/03/31 07:03 ID:z41dsEAY
>>324 将来どこまでやる必要があるかによる。
素人が遊びでやるならWindows+AnHttpd+ActivePerlが簡単でいい。
情報も集めやすいし。
将来、顧客に提供するWebサイトを目標にするなら、すくなくとも
Windowsは避ける。定番のUnix+Apache+Perl だろうね。
敷居が低いからと言ってWindowsを採用すると、保守できないシステム
になり、無理やり保守しようとしてとんでもない人件費がかかったりします。
>>335 いや、違うけどまあいいぞ。
↓次どぞん。
>>327 作るほうです。。
CGIの無料配布している方ってやっぱりUnixなんですかね?
ソウデモナイヨ Linuxとかの環境での動作確認はしてるだろうけど。
339 :
nobodyさん :03/03/31 14:35 ID:9YoHT9pl
>>338 どの程度の確認でしょうか?無料HP(Unix)で動いたらOKぐらいでいいのかな?
>>341 違います。どの程度かなと思ってきいただけです
>>340 動いたらOKとかいうより、Perlのバージョンに依存する部分があるか、
コマンドも使うならサーバによって使えないこともあるなど
書く前か書いてる最中にわかること。
>>343 なるほどぉ。。。
ちなみにVine Linuxってやつでもいいんですか?あれならCD持ってるからインスコしてみようかなぁ、とおもうんだけど。
WinとLinuxのデュアルブートっていうのは問題ないんですか?
>>344 スレ違いどころか板違い。とにかく、
試 し て か ら モ ノ を 言 え。
>>WinとLinuxのデュアルブートっていうのは問題ないんですか? 漠然とした不安をそのまま投げるなよー。 なんでもかんでも誰かに聞いて苦労をせずに済ませたいなんてのは プログラマ向けな性分じゃない。 取りあえずそのユーザ側的思考から抜けれ。
まぁ君はどうせ途中で投げ出すだろうから、 最初からやめとけってこった
350 :
nobodyさん :03/03/31 19:02 ID:a8GlaiRt
疑問は、自分で解決するのが一番早い。普通は。
↓そろそろ、Perl の質問をしておくれでないかい?
353 :
nobodyさん :03/03/31 19:20 ID:WQCBJdN9
特定のページ以外からの掲示板への直リンクを防ぐにはどうしたよいでしょうか?
>>353 厳密には無理。
一応、Perl スクリプト内でできるレベルとしては、
環境変数 HTTP_REFERER を見て判断するという方法がある。
その他、.htaccess を利用する方法もある。
こちらの解は該当スレへ。
そもそも、検索かけりゃ一発で答が出ると思うが?
>>354 それで直リンクは防げるのだろうか?
ジャンプしてくるのは防げるだろうが。
ヨソからジャンプしてくるのは大抵リンクじゃないかな? まぁこの手の質問って、こう返すしかなくない?
357 :
nobodyさん :03/03/31 19:37 ID:a8GlaiRt
じゃあ、HTTP_REFERERが空っていうのも規制すれば。
359 :
353 :03/03/31 20:04 ID:WQCBJdN9
どうも有り難うございます、助かりました。
LWP::Simple;を 使うにはどういう風にサーバーの設定をすればいいですか?
>353 「特定のページ」とやらが同一サイト内なら、有効期限付きのCOOKIEを使う手もあります。 しかし、Perlの話じゃなくなるので、相応しいスレを探してください。
>360 サーバーの設定に関することは、UNIX板などで聞いた方がいいと思われます。
>>360 まず、サーバの管理者にソケットが使えるかどうか聞いて。
使えないなら何やっても無駄。
使えるなら、もしルート権限があるなら普通にインストール、
ないなら自分の置ける場所にインストールして、スクリプトの方で
パスを指定すれば大丈夫。
無理。 管理者に文句言え。
>>365 タダで借りてる身分なら文句は言えんだろ
367 :
nobodyさん :03/03/31 21:44 ID:rFaVLjrq
今探しているのですが、見つかりません。 Telnetモジュールを使用したTelnetで ポートを変更するにはどうしたらいいですか?
TelnetモジュールってNet::Telnet? perldoc Net::Telnet 見れ
369 :
nobodyさん :03/03/31 22:42 ID:rFaVLjrq
>>368 失礼しましたrootだから見れませんでした。
見てみます。 ありがとうございました。
4月1日になりました。 これから24時間嘘が飛び交います。
perlは僕が作りました
375 :
372 :03/04/01 00:34 ID:???
PHPも僕が作りました。 実を言うとTCP/IPプロトコルを作ったのも僕です。 もちろんFTPもですよ
ごめん。RFCね、アレ、全部嘘。 見なかった事にしといて。
つーか、ひろゆき嘘が一番すげーなw トップページに閉鎖しますだってよw
今時閉鎖ネタは無いよねーと言われる中、 やるとはさすが・・・
Apr 1ネタも出ないほど人いないのかこの板は、 と思ってたら発見 age
あのぉ2chのidってどうやって作ってるんですかねぇ? cryptとかpack関数とか関係あるのかなと思って調べてみたんですけど、 cryptはともかくpackって私には理解不能で・・・ 2chのIDもどきの作り方、どなたか教えていただけないでしょうか?
age忘れ
if ($chars[$config{'char'}]{"points_$arg1"} > $chars[$config{'char'}]{'points_free'}) って言うソースの一部で悩んでいるのですが $chars[$config{'char'}]{"points_$arg1"} って何だ?・・理解できない。 何というか配列の構造(変数)?が理解できません。 脳内処理では @chars = (%config,%etc.... %config = ('char'=>points_$arg1 のように考えてしまったのですがコレは明らかに違う様な気がします。 そもそも連想配列のkeyに連想配列を使えるのか・・?とか言う疑問が 頭の中で反乱してグチャグチャになっとります。 多分こんな説明では教える方もわからないと思いますが 配列の構成みたいなものをビシっと言って頂けるととても助かります。 4/1日ですけどマジ質問です。
>>384 >@chars = (%config,%etc....
>%config = ('char'=>points_$arg1
とか
>連想配列のkeyに連想配列
とか、言ってることがさっぱりんこだが、
$chars[$config{'char'}]{"points_$arg1"}
これは、
$chars[$config{char}]->{"points_$arg1"}
としたほうがわかりいいんか?
use strict;
my %config = (char => 0);
my $arg1 = 123;
my @chars = ({ points_123 => 'hage' });
print $chars[$config{char}]->{"points_$arg1"};
# or
# print $chars[$config{'char'}]{"points_$arg1"};
# same as
# print $chars[0]->{points_123};
わかた?
use strict; my %config = (char => 0); my $arg1 = 123; my @chars = ({ points_123 => 'hage' }); print $chars[$config{char}]->{"points_$arg1"}; # or # print $chars[$config{'char'}]{"points_$arg1"}; # same as # print $chars[0]->{points_123}; グホッ、やばいです、インダス文字に見えてきました。 しかも->の意味がわかってないし・・ 教えて貰った情報を元にもう一回解説サイト回って消化できるようにしてきまつ。 わけわからんこと書いてるのにアドバイスありがとうございます。
日付の99/01/22といった形式から 1970年1月1日からの秒数に変換してくれるツールありませんか?
>>387 Time::Localだね
use strict;
use Time::Local;
# Usage:
# $time = timelocal($sec,$min,$hours,$mday,$mon,$year);
my $date = '99/01/22';
my @date = reverse split m|/|, $date;
$date[1]--;
my $time = timelocal(0, 0, 0, @date);
print $time;
389 :
246 :03/04/01 13:54 ID:2CNQXE4J
遅レスですが、どうして、「%%HOGE%%」%二つで囲むのでしょうか。 別に他の文字とかでもいいんですか? 慣習上の問題ってやつですか?
CGI.pmを使ってファイルをアップロードするスクリプトを書いてみたのですけども カレントディレクトリに CGItemp28729 など 一時ファイルが残ってしまい消えません #アップロードするごとに増えていく 環境はWinXP+ActivePerl v5.8.0 built for MSWin32-x86-multi-thread です。 初歩的なところでつまずいてると思いますが 一時ファイルを残さない方法教えてください。
391 :
251 :03/04/01 15:08 ID:???
>>390 関数はunlinkでできるけど安易に使うと全部消去しかねない諸刃の剣
そもそも、自分でスクリプトを書いてて何故ソースが理解出来とらんのだろうかと・・・
392 :
251 :03/04/01 15:11 ID:???
>>389 <!-- HOGE -->
で自分は括っとるけど、そんなものは作った人の勝手でしかない
393 :
390 :03/04/01 15:16 ID:???
>>391 いや実はUnixではきれいに消えてるんですが
知り合いにソース頂戴と言われて
あげたら環境がWindowsXPで
テンポラリファイルが消えないと文句言われました。
で自分でその環境を作ったらやはり消えない・・・
394 :
390 :03/04/01 15:19 ID:???
テンポラリディレクトリを指定して スクリプト起動するごとにそこのディレクトリを 掃除するってことも考えたんですが なぜ消えないのかの方が疑問になったんです。 んー なんででしょう・・・
395 :
251 :03/04/01 15:22 ID:???
>>394 ソースで問題無い(Cgiなんちゃらを出力してない)のならばwindows版apachの処理の問題じゃないですか?
396 :
251 :03/04/01 15:23 ID:???
397 :
390 :03/04/01 15:55 ID:???
>>395 一応ANHTTPd Apache BJD試してみましたがどれも同じ結果に・・・
ついでに自分の書き方が悪いのかとおもって
他の方が配布しているスクリプトを使ってみても同じでした・・
うーん 気持ち悪い
>>390 うだうだ言ってないで、テンポラリファイルを消している部分の
ソースコードをここに示してください。
また、余計な部分は示さないでください。
399 :
390 :03/04/01 16:06 ID:???
同じく前CGI.pmでアップロードさせたらTempファイルが残っちゃったよ。 結局、僕は解決できなかったので諦めました。
401 :
4 ◆6ykHaReEM2 :03/04/01 16:28 ID:2ihQy5Oo
opendir(DIR, './'); foreach (readdir(DIR)) { /^CGItmp/ && unlink; } closedir(DIR); これでだめだろうか?
402 :
4 ◆6ykHaReEM2 :03/04/01 16:32 ID:2ihQy5Oo
あ、CGItempか,, Upload終わって、プログラム終了前に↑してもだめなのですか?
403 :
4 ◆6ykHaReEM2 :03/04/01 16:34 ID:2ihQy5Oo
実は、CGI.pm使ったUpLader作っているので気になる。 暇あればWindowsで試してみます。
404 :
390 :03/04/01 16:34 ID:???
>>402 それがいちばんよさそうですね
UPしたやつはロックかかってるのかわかりませんが消えません
以前にUPしたやつは消えました。
これって激しく既出の問題だったんでしょうか?
同じくCGI.pmのアップロード機能でつまずいてるものなんですけど 一時ファイルって作成する場所って自分で指定できないんでしょうか?
ホットメールでのメンバー登録を防止したいのですが これだと特定のアドレスは阻止できてもhotmail全部は無理みたいです どうすればいいんでしょうか? if ($FORM{'EMAIL'} eq "****\@hotmail.com"){ push @err,'・このメールアドレスは使えません'; }
407 :
390 :03/04/01 16:44 ID:???
解決しました。すみません。 原因はファイルハンドルを閉じて無かったことでした。 $filename = $query->param('File'); この状態で <$filename>が存在してしまうので close($filename); の一行入れるだけで問題なく一時ファイルは消えるようになりました くだらん質問してスマソ!!
409 :
nobodyさん :03/04/01 16:49 ID:zxB6PEfR
410 :
406 :03/04/01 16:51 ID:???
if ($FORM{'EMAIL'} =~ /hotmail/){ push @err,'・このメールアドレスは使えません'; } でいいかな?
413 :
406 :03/04/01 17:25 ID:???
リストコンテキストを作り出すために、カッコをつけているんじゃないかな。
#"; てのは、なんだかわからん。 普通に考えれば、# 以降は行末までコメントだけど・・・。
417 :
414 :03/04/01 18:40 ID:???
ありがとうございます。左端の括弧はリストコンテキストですね。 調べが足りませんでした。 しかし、右端の #"; は謎ですね。コメントにしか見えないんだけど、 何の意味をこめてコメントにしたのかわからないし、 タイプミスだとしても、タイプミスで「"」を入力するヤシがいるのかと問いたい。
世の中には対応する括弧やクォートを強調表示したり、 そこへ飛んだりできるエディタが多く存在するのだよ。 そういうエディタで /boundary="([^"]+)"/ なんて行が あると、クォートの数が揃わんで難儀するのだよ。
420 :
414 :03/04/01 19:10 ID:???
>>418 なるほど!!
では、#"; のセミコロンも意味があるのだろうか・・・
気分?
422 :
bloom :03/04/01 19:13 ID:xVxahWvN
423 :
nobodyさん :03/04/01 23:05 ID:jYJDEp5A
@template = ("aaa","bbb","ccc"); foreach $line (@template){ $line =~ s/aaa/AAA/; $hoge = $hoge . $line; } print "@template : $hoge"; こうすると、$template[0]自体がAAAになってしまいます。 違うのです。配列の要素は変わらないで欲しいんです。 っていうか、配列の要素に対して置き換えしてるわけじゃないのに どうして配列の要素の$template[0]が置き換えされちゃうんでしょうか。 $lineに対して処理をしてるのに。
424 :
423 :03/04/01 23:09 ID:???
例えば、@templateを何度か使い回しする時、 配列の要素が変更されてると困っちゃうんです。
>>423 思いっきり配列の要素を変更しようとしています。
) foreach $line (@template){
) $line =~ s/aaa/AAA/;
) $hoge = $hoge . $line;
) }
foreach ループ内では、$line は配列@templateの各要素にセットされます。
$line を変更すると、配列の要素が変更できる、ということです。
変更したくない場合は、一旦別な変数にコピーしてから、扱いましょう。
「コピーする」「セットする」という用語がみそです。
久々に初心者らしい質問だったな
ここまで全部嘘でした。
428 :
nobodyさん :03/04/01 23:55 ID:wgIEAtF8
#!/usr/bin/perl @arr = ('aaa', 'bbb', 'ccc'); $str = 'zzz'; foreach $str (@arr) { print $str . "\n"; } print $str . "\n"; 最後に表示される1行は、zzz だよ。 今日は4月1日だな。(笑)
>>428 何を訳わかんないこと一人で納得してんの?
foreach の横に書いた変数はlocalが付いているものとして解釈される、ということ。 でも今の、foreachの中で$strが@arrの各要素のエイリアスになる、ということには関係ない。
431 :
:03/04/02 01:20 ID:???
モジュールを使わないでmailを送る方法って無いでしょうか?
がんばれ
>>431 モジュールって意味わかって言ってんのかなぁ?
申し訳ないです、"->"の意味を教えて頂けないでしょうか?関数等なら検索すれば 直ぐに出てくるのですが記号等は検索しても何故か引っかからないのでお手上げ状態に なってしまいます。
矢印演算子 Perl で検索すれば出てくると思う
アロー演算子だろ。
438 :
:03/04/02 14:38 ID:sWPLndkw
質問です。 投票CGIの多重投票防止をクライアントのNICのMACアドレスを取得 することで実現できないかと考えたのですが、実現可能でしょうか? また実現可能な場合、どのようなコードを書けばいいのでしょうか? ご教授ください。
すごいな。
441 :
438 :03/04/02 15:06 ID:sWPLndkw
>>440 それでもIPやクッキーよりもましだと思うので、方法があるのでしたら
ご教授ください。
偽装の前に、そもそもMACアドレスって、どこまで知れ渡るの? 同じネットワーク内だけじゃ?
春だなぁ〜(´∀`
Net::PcapかNet::PcapUtilsでパケットつかまえて NetPacket::ARPとか使えば出来そうだけど、 敷居が高すぎてやったことないね。 それよりもネットワーク系超ニガテだけどさ、 442さんの言うとおりイーサネットまででしょ。 多分つかまえられるのはてめーんとこのルータのMACアドレスまでだね。 他はIP+ポートのソケット単位でルーティングされてるんだろうから。 リモートのIPじゃだめなの? よって、クッキーたべさせなさい。
445 :
:03/04/02 15:35 ID:sWPLndkw
>>445 掲示板に書き込もうとした人に無理矢理ipconfigを実行させるのか?
そんなことができるなら、とっくにみんなやっていると思うけど。
448 :
:03/04/02 15:39 ID:sWPLndkw
>>444 IPだと再ダイアルアップしたらだめだし、クッキーもその都度消されちゃったら
だめなんでMACアドレスならいいかなと。それにルーターまででも桔梗いいん
じゃないかと・・・
449 :
446 :03/04/02 15:39 ID:???
掲示板じゃなくて投票か。どうでもいいけど
>>448 だから、てめーんとこのルータまでだって。
ルータ製品を変えない限り何万回でも何億回でも
同じMACアドレスしかつかまえられないでしょ。
そんなクッキーよりIPより無用なものがよかったら
NetPacket::ARP使いなさいってこった。
それにipconfigをクライアントで実行させた値を取ってこれたら、 果てしなくガクブル系セキュリティホールだな。 しかも、OLEなんて全然関係ないし。
452 :
nobodyさん :03/04/02 18:04 ID:4v5aHOPP
外部に作成したHTMLファイルから読み込んで <!--here--> みたいなコメントの部分をCGIで置き換えて出力する部分を作成しています(Perl)。 この、HTMLファイルを、CGIのディレクトリと違うディレクトリにいれたんですが、 これだと、HTMLが画像のリンクなどを含んでいた場合、困ったことになります。 HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。 ホームページの編集ソフトなどで作成したHTMLを、指定フォルダにアップする形にしたいので、 すべての画像パスを絶対パスにするとかそういう解決策は無しで、何かいい方法はないでしょうか? 一般的な解決策などがあるのでしょうか?
君みたいな人はお金で買ったほうが早いよ
> HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。 その相対パスの指定が間違っているだけではありませんか。 結果的に正しい相対パスになるように、書いておくしかないのではないでしょうか。
正規表現で自動で置き換えるようにするとかさぁ なんで<!--here-->は置き換えられてIMGタグは置き換えられないのかと・・・ry
$iptext = "ip.txt"; ################################## $openimg = "svropen.gif"; $closeimg = "svrclose.gif"; open IN, "<$iptext" or die "ERROR:ipファイルが開けません!"; $ipdata = <IN>; close IN; if ($ipdata == "close") { $dispimg = $closeimg; &dispimage; } else { $dispimg = $openimg; &dispimage; } sub dispimage{ print "Content-type: image/gif\n\n"; open IMG, "$dispimg" or die "ERROR:imgファイルが開けません!"; binmode IMG; binmode STDOUT; while (<IMG>){ print STDOUT $_; } close IMG; } __END__ これのopenimgとcloseimg両方を文字で表したいのですがどうすればいいですか?
説明下手が多いよな、手助けしたくても理解できんよ。
460 :
457 :03/04/02 20:43 ID:???
#!/usr/bin/perl ##############ファイル設定################# $iptext = "ip.txt"; $open = "あ"; $close = "い"; ########################################### if ($ipdata == "close") { print "$open\n"; } else { print "$close\n"; } これでは表示されないのかなぁ?
何を言ってるのかやりたいのか、さっぱりわからん???
なんで open IN, "<$iptext" or die "ERROR:ipファイルが開けません!"; $ipdata = <IN>; close IN; を消してんだよ。
463 :
457 :03/04/02 21:10 ID:???
あれ〜〜〜。。 これさ、imgタグで表示させるから、文字にしても意味ないか、、、
独り言は脳内でやってくれや
聞く前に一番最初に気づけ。
466 :
457 :03/04/02 22:19 ID:???
重ね重ねすいませんが、 今やろうとしているのは、 まずip.txtを読みにいって、IPがあれば、「公開」、空白だと「非公開」 (ip.txtの更新はNoDNSというフリーソフトでやってます) というふうにして、HTMLに表示するCGIを作りたいのですが、どうでしょうか?
468 :
457 :03/04/02 22:38 ID:yhPO3ktu
#/usr/bin/perl $ex=0; open(FILE,"ip.txt"); while(<FILE>){ if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/){ $ex++; } } close(FILE); if($ex){ &settion; }else{ &unsettion; } sub settion { print "content-type: text/html\n\n"; print "<html><head><title>公開</title></head>\n"; print "<body><h1>公開</h1></body>\n"; print "</html>\n"; exit; } sub unsettion { print "content-type: text/html\n\n"; print "<html><head><title>非公開</title></head>\n"; print "<body><h1>非公開</h1></body>\n"; print "</html>\n"; exit; }
469 :
457 :03/04/02 22:51 ID:???
>>468 わざわざこんなに書いていただいたのに申し訳ありませぬが、
あらかじめいろいろ書いているindex.htmlに付け加える形にしたいのですが、、、
なんどもすいません
470 :
nobodyさん :03/04/02 23:01 ID:yhPO3ktu
SSIを使でよびだすのはだめですか?
471 :
457 :03/04/02 23:03 ID:???
>>470 CGIがいいです、はい。
注文多くてごめんなさい。
あ、でも、使いそうなので教えてくれますか?
472 :
nobodyさん :03/04/02 23:09 ID:yhPO3ktu
SSIでやるには、読み込みたい部分に<!--#exec cgi="よみこむCGIファイル" --> でいいとおもいます。 CGIでは・・・やりかたがいまいちおもいつきません。index.htmlのフレームを わければなんとかなりそうですが・・・
473 :
457 :03/04/02 23:19 ID:???
>>472 そうですかぁ。。。
付け加えるのなら、画像にしてIMGタグにするしかないんですかね
474 :
nobodyさん :03/04/02 23:19 ID:yhPO3ktu
付け加えるって追加indexに追加書き込みするってことですか?
475 :
457 :03/04/02 23:24 ID:???
476 :
nobodyさん :03/04/02 23:35 ID:yhPO3ktu
#/usr/bin/perl $ex=0; open(FILE,"ip.txt"); while(<FILE>){ if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){ $ex++; } } close(FILE); open(FILE2,"+>index.html"); while(<FILE2>){ if(s/<\/body>(.*)<\/html>/\1/ig){ print FILE2 "$_"; }else{ print FILE2 "$_"; } } close(FILE2); if($ex){ &settion; }else{ &unsettion; }
477 :
つづき :03/04/02 23:36 ID:yhPO3ktu
sub settion { open(FILE3,">>index.html"); print "<h1>公開</h1></body>\n"; print "</html>\n"; close(FILE3); exit; } sub unsettion { open(FILE3,">>index.html"); print "<h1>非公開</h1></body>\n"; print "</html>\n"; close(FILE3); exit; }
普通はSSIだよな
479 :
名無しさんパーフェクト :03/04/02 23:50 ID:RgSUli0E
indexを読み込んだときにそのプログラムを読み込むのではもう遅いのでは? それならまた違うhtmlを編集して最後にそちらに飛ばした方が
480 :
名無しさんパーフェクト :03/04/02 23:51 ID:RgSUli0E
あげてしまった吊ってくる
鬱・・・
482 :
457 :03/04/02 23:56 ID:???
すいません。ほんとに迷惑かけて。SSIで行くことにしました。。 自宅鯖は<!--#exec cgi="よみこむCGIファイル" -->です。 ってして、あとどうすればいいですか? CGIファイルはどれにすればいいんですか? ほんと何も知らないですいません。。
483 :
nobodyさん :03/04/02 23:57 ID:yhPO3ktu
これでだめならSSIかframeで分割して読み込んでください。
484 :
nobodyさん :03/04/03 00:06 ID:os6gOz9a
>>468 のファイル名をserchip.cgiだとして
それをSSIでindex.htmlに組み込むとすると
組み込みたい場所に
<!--#exec cgi="serchip.cgi"-->
てなかんじでいいとおもいます。
485 :
457 :03/04/03 00:20 ID:???
できないなぁ。トクトクはSSIOKなはずなのに、、、
>>485 何をどうやってできないのか、はっきり言え。
そうでなければただの独り言だ。独り言を公開の場に垂れ流すな。
487 :
457 :03/04/03 00:49 ID:???
>>486 #!/usr/bin/perl
$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/close/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "閉鎖中\n";
exit;
}
sub unsettion
{
print "公開中\n";
exit;
}
これでSSI使ったらできました。
>>468 の
(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
が違ってるとしかおもえないんですが、、どうでしょう?
489 :
457 :03/04/03 01:03 ID:???
>>488 コンテンツタイプとかのは、
自宅のAN Httpdだと筒抜けですが、トクトクだと、ちゃんとBODYだけ表示されます。。。
490 :
457 :03/04/03 01:05 ID:???
トクトクにあげているのはこれです。 #!/usr/bin/perl $ex=0; open(FILE,"ip.txt"); while(<FILE>){ if(/close/){ $ex++; } } close(FILE); if($ex){ &settion; }else{ &unsettion; } sub settion { print "content-type: text/html\n\n"; print "閉鎖中\n"; exit; } sub unsettion { print "content-type: text/html\n\n"; print "公開中\n"; exit; } 直接cgi実行するとちゃんと変わるんですが、SSIにするとうまくいきません。 自宅鯖は<!--#exec cgi="ip.cgi" -->です。って書いたのに、 自宅鯖はです。 になってしまいます。SSIの文まちがってますかね?
>476 百合親切だな
SSIの呼び出し方に決まりごとなかったか? ちゃんと設定方法とか読んだのかよ、 つか漏れ的には if(/close/){ が非常に気になるわけだが・・・。
493 :
457 :03/04/03 01:16 ID:???
>>492 #!/usr/bin/perl
$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "content-type: text/html\n\n";
print "<html><head><title>公開</title></head>\n";
print "<body><h1>公開</h1></body>\n";
print "</html>\n";
exit;
}
sub unsettion
{
print "content-type: text/html\n\n";
print "<html><head><title>非公開</title></head>\n";
print "<body><h1>非公開</h1></body>\n";
print "</html>\n";
exit;
}
これで直接実行したらできました。あとは、SSIです。。。
494 :
457 :03/04/03 01:25 ID:???
トクトクでは、SSIを動作させるにはファイルの拡張子を .shtml にしなければいけません。 .htaccess もトクトクでは動作しませんのでこれは変更不可能です。 また、トップページは index.htm , index.html の形式しか許されていませんので、トップページにSSIを利用することはできません。 ( ゚Д゚)ポカーン・・・・・ 逝ってきまつ
>>493 そのコード自体が目的不明に見えるんだが
$ex++みたいにカウントアップして何か意味あるのか?
496 :
457 :03/04/03 01:28 ID:???
>>495 これはほかの方が教えてくれたやつです。。。
index.shtmlにしたらデキターヨ。。
みなさんスレよごしてごめんなさい。
>495 whileが最後まで回る所とかな。
>>490 「うまくいきません」の定義はなんだよ?
「自宅鯖はです。」って、HTMLソースレベルでみてそれ言ってるの?
SSIコケたら[an error occurred while processing this directive]が出るだろ普通。
ソース見てみ。多分SSIの構文が丸裸かもしれんぞ。サーバが何かわからんけどよ。
あと、ちゃんとエラーを捕捉しろって。
リファクタリングしてやる。
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw#fatalsToBrowser#;
my $ex = 0;
open(FILE, "ip.txt") || die $!;
while (<FILE>) {
if(/close/){
$ex++;
last;
}
}
close(FILE) || die $!;
print "content-type: text/html\n\n";
print $ex ? "閉鎖" : "公開";
print "中\n";
共通化できる所はまとめなさい。
499 :
457 :03/04/03 01:44 ID:???
>>498 すいません。トクトクでは、shtmlでないといけなかったみたいです。。。
でも、このCGI直すところいっぱいありますか?
そもそも目的がはっきりしてないんだよな。
>>466 の「まずip.txtを読みにいって、IPがあれば、」って、
ファイルにはどれだけのデータがあるのか?
IPある無しの答えは1個なのか複数かもはっきりしてないし
txtのフォーマットもわからないしな
>434じゃないんですけど、
perl色々勉強してて、「->」につまづいて、もう全然わけわからなくて、
http://www.rfs.jp/sitebuilder/perl/04/06.html ↑ここが一番詳しいかなとおもうんですけど、ここ見ても意味不明で・・・
だんだんやる気なくしてたんですけど、ちょっと教えていただけませんか?
まず、「矢印演算子を使わなければならない理由」、
あるいは、別に使わなければならないわけでもないなら、
「矢印演算子を使うことでどのようなメリットがあるのか」を
できれば、例をだして、「こういう風なことをしたいときにこうする」
または、「こういう風にするときにこうした方がこういうメリットがある」
という感じで教えていただけないでしょうか?
次に
http://www.rfs.jp/sitebuilder/perl/04/06.html こことかで出てくる、「無名の配列」「無名のハッシュ」・・・
の「無名」ってのはどういう状態を指してるんでしょうか?
あと、そんなことよりこのサイトで勉強しろよってのがあれば、
貼っていただけると自分で勉強してきます
無名の名ってのは、変数名のことじゃないかなぁ。 @arr = (1,2,3,4,5); ってときは、arr っていう名前が、この配列についてる。
んーホント難しい・・・ >無名の名ってのは、変数名のことじゃないかなぁ。 そういうことだと思うんですけど、じゃあ、これが無名ってのは、どういう状態なんでしょう? まだ、宣言されてない変数ってことなんでしょうかねぇ? >どうしてもアローを使わなければならないケースは少ないだろう。 でも人のソースを解読したいときに激しく不便、ってかできないんです 教えていただいたurl・・・難しい。明日改めて勉強しに行ってきます
506 :
nobodyさん :03/04/03 07:32 ID:Nji/7HYX
>>505 無名配列、無名ハッシュってのは、多次元のそれらを作るときできる。
@ar=([baka, aho, manuke], 'kuso', 'manko');
ここで($ar[0], 'kuso', 'manko')は、arって名前の配列だな。
だけど(baka, aho, manuke)ってのは、名前のない配列や。
上のは、print $ar[2], "\n";で表示できるが、下のは、
print $ar[0][1], "\n";または、print $ar[0]->[1], "\n";だ。
ハッシュのときは、矢印演算子使うた方が分かりやすいからよく使われる。
507 :
nobodyさん :03/04/03 07:52 ID:Nji/7HYX
まだ分からんか。ハッシュの例だ。 %hash=('baka' => 'kuso', 'aho' => {'manuke' => 'manko', 'boke' => 'shikko'}); print $hash{'baka'}, "\n"; print $hash{'aho'}->{'manuke'}, "\n";
508 :
nobodyさん :03/04/03 08:06 ID:Nji/7HYX
まだか。まだ分からんのか。 (...)ってのはリスト構造だ。[...]ってのは配列だ。{...}ってのは ハッシュだ。いいか?だから、 $ar=['baka', 'aho', 'bokenasu']; $hash={'baka', 'kuso', 'aho', 'manko', 'bokenasu', 'shikko'}; って書くと直接無名配列、無名ハッシュができる。 $ar->[1]とか$hash->{'baka'}ってアクセスするっきゃ内。
509 :
nobodyさん :03/04/03 08:09 ID:Nji/7HYX
おい、分かったって言ってくれ。 もう出かけるぞ。
こういう無名ハッシュを考える。$hashには{ .. }のアドレスが入ってる。 $hash = {a => 1, b => {c => 3, d => 4}; $$hash{a} これはちょっと格好悪いから、矢印を導入。 $hash->{a} $$hash{b}->{d} $hash->{b}->{d} #{..}の間の矢印は省略できる。一気にデリファレンスする感じ。 $$hash{b}{d} $hash->{b}{d} 無名ハッシュに対してスライスを使いたいとき、矢印は使えない。 @$hash{b}{'c', 'd'} # (3, 4) 普通のハッシュに戻す事もできる。 %hash = %$hash; このとき、 $hash{b}->{d}は、さっきのルールが適用されて、 $hash{b}{d}でアクセスできる。
無名っていう物は、元の英語だと、Anonymousになってて、匿名って読み替えてもいい。 %hash = (a => 1, b => 2); $hash = {a => 1, b => 2}; この2つの状態を比べると、データは同じでも、上の方は、%hashっていう名前が 付いているのに対して、下は、データのアドレスが$hashに入ってる。 つまり、1つの変数にメモリ上のデータが対応している状態を、普通の状態。 変数に対応していないデータの事を、無名だ。という。
この2つは、実際に持っている情報は同じでも、… 5行目を修正。。
矢印のまとめ。 $str = 'hoge'; $ref->{a}[0]->($str)->$str->$str($str->$str);
514 :
名無しさん@Meadow :03/04/03 11:46 ID:694fbPsK
$this->[514] はぁ?
516 :
251 :03/04/03 12:22 ID:???
ん〜アロー演算子ってのは二次元以上の配列を作るときに重宝するかなぁ 例えば、xが2yが3の領域の値を見たい時は print $area[2]->[3]; あと、xyzの値を登録したい時は $point[1]->[2]->[3] = 'fujiyama'; こんなふうに呼び出すとか・・・ んで、無名配列はリファレンスの概念を理解すると解り良いと思う perlだと 配列は @ayaya0 =(1,2,3) ハッシュは %ayaya1 = (a=>1,b=>2); で表記出来るのだけど リファレンスは $ayaya2 =[1,2,3]; $ayaya3 ={a=>1,b=>2}; や、 $ayaya2 = \@ayaya0; $ayaya3 = \%ayaya1;
517 :
251 :03/04/03 12:22 ID:???
になるわけだわね、配列やハッシュを一つの$ayayaみたいな変数で呼び出せるのがみそ。 $ayaya自体にはデータが格納されている位置情報が入ってる。 だから、データーが巨大でもその位置情報をわたすだけで済むので処理が高速化出来るとかいわれてる。(ソース次第だけね・・・) んで、呼び出しは $ayaya0[0] $ayaya1{a} ってなることはperl初心者でもわかると思うけど、 リファレンスを参照する場合は $ayaya2->[0] $ayaya3->{a} となる。要は$ayayaだけでは必要とする要素をいままでのままでは書けないから->を使って記述しましょうということです。 オマケで、リファレンスを配列構造やハッシュに戻す時は @ayaya0 = @{$ayaya2}; %ayaya1 = @{$ayaya3}; まぁ、ルールとしてはこうなんだけどアロー演算子自体が省略可能・・・ $hoe->{a}->[3] なら $hoe->{a}[3] とか でも $hoe{a}[3]はこの場合だとNG 何故なら %hoeの aというkeyを参照してしまう為 $hoe{a}->[3] と解釈されてしまう・・・ 気をつけなければならない所が多いため最初のうちは演算子等はしっかり付けとくほうがいいと思われ。 で、ココまではハードリファレンスの話、OO思考プログラムはまたルールが違うのでそれは別の話に・・・
518 :
251 :03/04/03 12:36 ID:???
%ayaya1 = %{$ayaya3}; だったすまね・・・
519 :
457 :03/04/03 13:46 ID:???
#!/usr/bin/perl open INPUT, "<ip.txt"; if($_ = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){ &START; } else($_ = /close/){ &CLOSE; } sub START { print "content-type: text/html\n\n"; print "<html><head><title>公開中</title></head>\n"; print "<body><a href=\"jump.cgi\">公開中</a></body>\n"; print "</html>\n"; } sub CLOSE { print "content-type: text/html\n\n"; print "<html><head><title>閉鎖中</title></head>\n"; print "<body>閉鎖中</body>\n"; print "</html>\n"; } これだと、Perlチェックでelseの部分がおかしいって出るので、ぜんぜんわからないので、 ↓にかえました。
520 :
457 :03/04/03 13:47 ID:???
#!/usr/bin/perl open INPUT, "<ip.txt"; if($_==/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){ &START; } if($_!=/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){ &CLOSE; } sub START { print "content-type: text/html\n\n"; print "<html><head><title>公開中</title></head>\n"; print "<body><a href=\"jump.cgi\">公開中</a></body>\n"; print "</html>\n"; } sub CLOSE { print "content-type: text/html\n\n"; print "<html><head><title>閉鎖中</title></head>\n"; print "<body>閉鎖中</body>\n"; print "</html>\n"; } こうしたんですけど、if文でifが複数あってelseがないっていうのは文法上だめですか?
521 :
502 :03/04/03 13:52 ID:???
みなさんすいませんでした。こんなに解答していただいてたのに
質問しっぱなしで寝まくってました。
で、今ざっと皆さんのレス読み返してるんですが、
>>517 さんの一行目でなんとなくメリットがわかりました。
つまり、一旦新たな配列に値をコピーしてからサブルーチンなんかにわたすより、
値の入ってるアドレスを渡した方が、効率的ってことですね?
で、矢印演算子はそれらの代入や参照のときに使うものだと
今からもう一度皆さんに書いていただいたのを読み直してみます。
本当に有難うございます。多分理解できると思います
むちゃくちゃだな。
523 :
457 :03/04/03 13:54 ID:???
>>520 いいかげんにしろや。同意が欲しいなら言ってやる。
それでオッケー!完璧です!
>>523 仕様をはっきりさせないから。
ip.txtって複数のアドレスが入ってるの?その場合はデリミタは?
それとも一つあるか、空のファイルのどちらか?
あるいはアドレス以外の何かも含まれているの?
まーSSIじゃなくてもindex.htmlに文字列埋め込むことは出来るわけで。 とか、まぜっかえしてみる。
528 :
nobodyさん :03/04/03 15:33 ID:kftTqlDW
529 :
nobodyさん :03/04/03 15:56 ID:jWA2mxiH
そういえばCGIスクリプトを外部JavaScriptファイル(?)として読み込み、document.writeで書き出すテキストカウンターがあったな。
531 :
CGIでwww上のhtmlソースを取得 :03/04/03 16:08 ID:507cBmxs
perlのCGIでこの動作を実現したいのですが www.kasai.fm/perlHTTP/ www.antun.net/tips/cgi/perl.html tohoho.wakusei.ne.jp/wwwperl2.htm#socket 上記のサイトの通りにCGIを設置しても動いてくれません。 どなたか幅広い環境で動くコードをお持ちでしたら いただけないでしょうか? これがどうしても出来なくてもう一週間も製作が止まった ままになって参ってます、大変ずうずうしいお願いでは ありますがどうか宜しくお願い致します。m(_ _;)m
532 :
nobodyさん :03/04/03 16:10 ID:+bF3BpEY
わかりません〜 0chのスクリプトをDLして掲示板を精製したけどその掲示板にアクセスするには何処にアクセスすればいいのですか〜? (他のサイトではindex.htmlでアクセスしてたが
リンク先見ていないけど、多分コードの問題じゃなくて、サーバーの設定の問題だろ。 自分のコンピュータでやればうまくゆくと思う。
534 :
533 :03/04/03 16:12 ID:???
>>530 それそれ。
>>527 ということでhogehoge.cgiというファイルの出力で
print "Content-Type: text/javascript\n\n";
print "document.write(\"$hogehoge");\n";
とかしておいて、
HTMLファイルに
<script type="text/javascript" src="hogehoge.cgi"></script>
と書くと$hogehogeの内容が出てくる。
537 :
nobodyさん :03/04/03 16:35 ID:sUO6GuNu
次のような場合の動作は、1通りではないと言うことでしょうか。 ${$hoge} = 'abc';
538 :
531 CGIでwww上のhtmlソースを取得 :03/04/03 16:37 ID:507cBmxs
>>533 それが..
他人が作ったCGIはちゃんとこの動作を
してるのに自分のは動かないんです...
トクトクサーバのOSはLinuxなのでWINDOWSやUNIXサーバ用に
書かれたコードは動かないんでしょうか..
539 :
nobodyさん :03/04/03 16:41 ID:jWA2mxiH
542 :
537 :03/04/03 16:54 ID:sUO6GuNu
すみません。書き直します。 ${$hoge} = 'abc'; このような代入の動作は、 $hogeの中身の文字列と同じ名前をもつスカラ変数に 'abc' という文字列を代入する。 $hogeの中身であるスカラへのリファレンスが指している変数に、'abc' という文字列を代入する。 のどちらかが、場合場合で行われる、ということでしょうか。
543 :
457 :03/04/03 16:56 ID:???
>>525 ip.txtには公開状態にしたいときに、1つのIPアドレスが書き込まれています。
閉鎖時は「close」という単語が書かれています。(空ファイルはなんか不安なもので)
それで、一から自分で書き直したのがこれです。
544 :
457 :03/04/03 16:56 ID:???
#!/usr/bin/perl open(FILE, "ip.txt"); while (<FILE>) { if (/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){ &connection; }else{ &unconnection; } } close(FILE); sub connection { print "content-type: text/html\n\n"; print "<html><head><title>公開</title></head>\n"; print "<body><h1>公開</h1></body>\n"; print "</html>\n"; exit; } sub unconnection { print "content-type: text/html\n\n"; print "<html><head><title>非公開</title></head>\n"; print "<body><h1>非公開</h1></body>\n"; print "</html>\n"; exit; } なんとなく理解できるんですが、whileの中にifを入れないとできないのがよくわかりません。 if(<FILE> =/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) とかだめでしょうか?whileは絶対いるのでしょうか?
545 :
531 CGIでwww上のhtmlソースを取得 :03/04/03 16:59 ID:507cBmxs
Perlの最新版って5ですか? それとも6ですか?
547 :
457 :03/04/03 17:07 ID:???
#!/usr/bin/perl open FILE, "ip.txt"; $data = <FILE>; close FILE; if($data == "/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/"){ &connection; }else{ &unconnection; } sub connection { print "content-type: text/html\n\n"; print "<html><head><title>公開中</title></head>\n"; print "<body><a href=\"jump.cgi\"><font color=\"blue\"> 公開中</font></a></body>\n"; print "</html>\n"; exit; } sub unconnection { print "content-type: text/html\n\n"; print "<html><head><title>閉鎖中</title></head>\n"; print "<body><font size=\"2\" color=\"red\"> 閉鎖中</font></body>\n"; print "</html>\n"; exit; } これは理解できるんですけどねぇ。 はじめに教えてくれた方がwhileを使ってたのが気になりまして。。。
>>542 そう、前者はシンボリックリファレンス、後者はハードリファレンスと呼ばれているね。
前者はstrictプラグマで禁止することができる(というか、通常はstrictにしているべき)
同一サーバー以外はimenu.cgiを経由してリンク作りたいんですけど、
こんな感じで作ってみたんですがもっと効率いい方法あったら教えてくれませんか?
なにぶん素人なんで、どういったコードが効率いいのかわからんのです。。
$copy = $message;
while($copy =~ m{(
http://[\w\.\*\+\!\?\\\|\$\@\%\&\#:;/~=-]+ )}gi){
my $url = $1;
# 同一ドメイン内へのリンク
if($url =~ /^
http:\/\/$ENV{HTTP_HOST}\//i ){
$message =~ s/\Q$url\E/<a href="$url" target="_blank">$url<\/a>/gi;
}
# その他外部リンク
else{
my $imenu = $url;
$imenu =~ s/^
http:\/\///; $message =~ s/\Q$url\E/<a href="imenu.cgi\/$imenu" target="_blank">$url<\/a>/gi;
}
}
550 :
251 :03/04/03 17:21 ID:???
>>542 $hoge = \'abc';
と
${$hoge} = 'abc';
とは同じ意味。コレでわかるかな?
>>544 仕様があやふやだから回答するほうも迷うんだよ。
whileを使ったのはファイルを最後まで読み込むためだろう。
ファイル中のどこにIPアドレスが入ってるかわからない質問だったから。
>なんとなく理解できるんですが、whileの中にifを入れないとできないのがよくわかりません。
whileのループ内でIPアドレスがあるかどうかの判定しないでどうするっての?
>if(<FILE> =/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
ファイルハンドルについて勉強しなさい。
>>457 とりあえず、whileの意味とか調べてきてから質問しろや
人なめんのもいい加減にしろ
553 :
nobodyさん :03/04/03 17:35 ID:os6gOz9a
open(FILE,"test.dat"); @f=<FILE>; $_="@f"; chomp($_); $text="\"$_\""; print 'i='; print "$text;\n"; test.datのなかみは aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa です。 このスクリプトを実行すると ";"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa document.form.text.value=i; となります。 i="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; document.form.text.value=i; と言う風にしたいのですが上のようになるのはなんでですか?
$POINT{($name)[0]}形式でポイントをカウントしているのですが foreach (sort {$POINT{$b} <=> $POINT{$a}} keys %POINT) でポイントの大きい順にソートできるのはわかるのですが $name順にソートするにはどうしたらいいでしょうか?
555 :
4 :03/04/03 17:43 ID:addlh6nt
質問っす。 use Benchmark;として得られたベンチマーク結果、 no1: 5 wallclock secs ( 4.40 usr + 0.01 sys = 4.41 CPU) @ 22727.27/s (n=100000) このときの、usr と sysってなんすか?
556 :
457 :03/04/03 17:49 ID:???
>>551 open(FILE,"ip.txt");
@data = <FILE>;
close(FILE);
if(@data = "/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/"){
&connection;
}else{
&unconnection;
}
こうですね。でも、なぜif(@data = "/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/")が代入演算子でするのでしょうか。
テキストのデータが*.*.*.*だった場合の処理だから比較演算子ではないんでしょうか?
>>457 #!/usr/bin/perl
open(FILE, "ip.txt");
$data = <FILE>;
close FILE;
if($data =~ /close/){
$dotti='非公開';
}else{
$dotti='公開';
}
print "content-type: text/html\n\n";
print "<html><head><title>$dotti</title></head>\n";
print "<body><h1>$dotti</h1></body>\n";
print "</html>\n";
exit;
558 :
4 :03/04/03 17:52 ID:addlh6nt
>>553 open(FILE,"test.dat");
chomp($text =<FILE>);
close(FILE);
print qq/i="$text"\ndocument.form.txt.value=i/;
こんな感じにしたらどうだろうか?
560 :
457 :03/04/03 17:56 ID:???
561 :
bloom :03/04/03 18:00 ID:iUh0kMHD
562 :
531 CGIでwww上のhtmlソースを取得 :03/04/03 18:01 ID:507cBmxs
答えて下さる方がもういらっしゃらないようなので また自力で頑張ろうと思います。m(__)m
>>560 配列ってのは複数のデータを格納するもの。
IPアドレスかcloseという語のどっちかなんでしょ?
それならスカラ変数でいいの。
564 :
457 :03/04/03 18:03 ID:???
>>559 すいません。あと2つだけお願いします。
$data =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
これですが、「~ 」はどういった意味なんでしょうか?これがないとできなかったんですが、重要なものですか?
それと、なんで「==」ではだめなんでしょうか?
566 :
457 :03/04/03 18:03 ID:???
>>564 正規表現にあてはめる、って解釈が一番簡単かも
>>562 >>531 に書いてある方法を使うためには条件があるのはわかるよね?
君の環境も何もわからなきゃ誰もわからないの
570 :
553 :03/04/03 18:08 ID:os6gOz9a
>>558 すいません。それで試しても結果は変わりません。
ファイルから読み込まずにやるとうまくいくのですが・・・
571 :
457 :03/04/03 18:08 ID:???
>>569 あ、ホントですね。本にありました。
パターン結合演算子「=~」ですか、理解しました。
どうもありがとうございました。
572 :
531 CGIでwww上のhtmlソースを取得 :03/04/03 18:10 ID:507cBmxs
>>568 おっしゃる通り説明不足でした、申し訳無い..
勉強して出直してきます。m(__;)m
573 :
nobodyさん :03/04/03 18:12 ID:addlh6nt
>>564 めちゃくちゃにも程がある
配列も知らん香具師に何ができるんだ?
それにパターンマッチ云々知らなかったとしても
>これですが、「~ 」はどういった意味なんでしょうか?これがないとできなかったんですが、重要なものですか?
↑この発言はないだろ。
それぞれ一文字一文字にちゃんと意味があるに決まってるだろ?
聞く前にネットなり本なりで少しは調べろ
特に配列なんてのは大概一番最初の方ででてくることだ
その認識は改めたほうがいいよ。
577 :
531 CGIでwww上のhtmlソースを取得 :03/04/03 18:58 ID:507cBmxs
>>573 わ.. そのCGIをローカルサーバと無料レンタルサーバで
試してみたところどちらでもちゃんと動きました。(汗
ソースもシンプルなのでとても参考になります。
このCGIを参考に自分のプログラムが動かなかった原因も
調べてみます、感謝っす!m(_ _;)m
>>553 553のスクリプトをWinXP+ActivePerlの環境で実行したら
i="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
となったので、そのスクリプトで問題ないのでは?
>>555 何だろ、俺も知りたい
UN*X の time(1) なら
user ... 実行に要した時間
sys ... システムのオーバーヘッドに要した時間
だけども。同じかな?
Perlの最新版って5ですか? それとも6ですか?
>>580 おたくなぁ、同じこと何回もかいてるんじゃねぇよ
現在使える分は5.8
6は使うならば自分でperlをコンパイルせねばならんのだからおたくのレベルにはかんけーねーよ
583 :
nobodyさん :03/04/03 23:31 ID:LZizHVyk
掲示板などで半角カナを使いたいのですが使用すると文字化けしたり 全角カナに強制的に変換されたりします。どうやって表示させればよいのでしょうか?
強制的に変換したり、文字化けさせたりしなければいい。
586 :
nobodyさん :03/04/04 00:43 ID:MGOn1k3A
UserAgentを書き換えるにはどうすればいいんですか?
592 :
nobodyさん :03/04/04 01:52 ID:CT5BhxQd
ページの再送信回避の方法ってありますか、 できればGETにしたくないのですが。
>592 完全な方法はない。 保存データとの比較が最も安全ではあるが、間に別のデータが挟まれば結局無意味。 無難な方法はLocation。
Locationするとか前回のと照らし合わせて同じだったらエラーにするとか
>>589 UserAgentの文字列を別の文字列に書き換えればいい
598 :
nobodyさん :03/04/04 02:01 ID:CT5BhxQd
>>593 ありがとう。locationで飛ばしてみます。
599 :
nobodyさん :03/04/04 02:04 ID:CT5BhxQd
>>592 =598ですが、うまくいきました。thx
eBrain21.comは、インターネットユーザーがホームページを
掲載するにあたって必要なサーバースペースを有料レンタルしています。
お客様に快適なサーバーを提供するためにさまざまなホームページの目的に応じて、
単なるホームページスペースだけではなく、動画やゲームまたは個人放送はもちろん、
そのツールとしてCGI、PHP、SSI、SQLデータベースなどあらゆるサーバースペースを提供しております。
http://www.ebrain21.com/ [email protected]
601 :
nobodyさん :03/04/04 04:54 ID:i3RHe7j/
質問させてください。 アパッチの1.3.27でActivePerlを使っていて、OSはXPです。 自宅サーバを使って、HPを作っているのですがカウンタが動かないんです。 掲示板は動いているので、CGIはちゃんと使えていると思ったのですが なぜかカウンタだけ「×」がでたまま動いてないんです。 KENT WEBさんの夢カウンタを使用していて、設定や記述は何度も見直した のですが、チェックモードでCGIまでのURLを打ち込んでみてもCGIファイルがその まま開いてしまうのです。 すみませんが、何か心あたりがあえば教えてください。 ちなみに、前もHPを作ったことがあるのですが(同じパソコンで)その時 はちゃんと動きました。そのときは、知り合いに同じ質問をしてフォルダ オプションから関連付けをしたら動いたような記憶があるのですが、OSを 再セットアップしたのでまた同じ症状になってしまっています。前聞いた 人間は「忘れた」とだけ言って相手にしてくれません(涙 検索しているのですが、なかなか見つかりません。すみませんが、 よろしくお願いしますです。
>>601 >CGIファイルがそのまま開いてしまうのです。
どういう意味?ソースが表示されてしまうっていうこと?
603 :
601 :03/04/04 07:20 ID:i3RHe7j/
そうです。CGIファイルをメモ帳で開いた時のものが出るんです。
>>601 スレ違いだっつーの。
ここでCGIの質問するな。
605 :
601 :03/04/04 07:36 ID:i3RHe7j/
それは大変失礼しました。 初心者なので、perlと関係があると思ってました。 別板行きます。
606 :
nobodyさん :03/04/04 08:12 ID:jZjztjzX
perlの最初に use Win32::API; と、書かれているのですが、これを読み込んだ瞬間にperl.exeのウインドウが閉じてしまいます どう対処したらよいでしょうか?
>>605 それ以前にXPで鯖公開したらライセンス違反にならないか?
独り言だけど、
>>605 を読んで、初心者とはそう言うものなのかと初めて知った、春の日の朝。
609 :
nobodyさん :03/04/04 09:12 ID:fwRQKvSx
KENT氏のaskaBBSの、$flagはどういう役割を果たしてるんでつか?
610 :
bloom :03/04/04 09:46 ID:ZGDQypNs
出た、bloom そろそろ赤字でIP晒して欲しいな。
612 :
nobodyさん :03/04/04 11:02 ID:lpjcObWV
データと、CSV形式で保存したいと思ってます。 で、CSV形式つっても、アプリによって微妙に差があるじゃないですか? そこで、自分はエクセル用のCSVにしたいと思ってるんですが、 その際の仕様はどーすればいいんでしょうか? ●値は,で区切る ●値の中に"があるときは""と入力 ●改行はそのまま改行を入れる。 ●数字以外はセルの値を""でくくる ・・・でOK?
perlと関係ねー
614 :
nobodyさん :03/04/04 11:37 ID:T4cPGriS
keys 関数 keys関数は、ハッシュ変数のすべてのキーをリスト値として返します。 @key = keys( %hash ); キーの格納には乱数を使った手法が使われるため、ハッシュ全体を出力する場合、その順番は保証されません。ですから、@key には %hash のキーが順序を無視して格納されます。 順番通りに格納すればいいのに、どうしてこういう仕様になってるんですか? perl作ってる人は何を考えてるんですか?
616 :
615 :03/04/04 11:39 ID:???
>>614 メモリ効率や実行速度を優先させたから。
>619 なんでKENT氏のaskaBBSなんてものをわざわざ探して調べてやらにゃならんのだ
(´・ω・`)…
>>620 それがこの板の住人の仕事であり、使命でもあるから。
623 :
nobodyさん :03/04/04 13:29 ID:Oo/SV5Mj
getpw... getgr...という組みこみ関数のことなんですが、/etc/passwd, /etc/group のパスを指定することができない(みたい)ので、テストで非常に難儀します。 サンプルのpasswd,groupファイルを読ませる方法はないのでしょうか。仕方なく Unix::ConfigFileを使っているのですが、重いです。非常に便利で、なおかつどこで も使える組みこみ関数なだけに惜しい。
624 :
251 :03/04/04 13:49 ID:???
>>614 >キーの格納には乱数を使った手法が使われるため、
って笑われぞ。ちゃんと順番には出てくる。
メモリーの格納順であって、キーの順番になっとらんだけだつーの(w
>>627 IISってなに?
俺はXP+Active Perl+AN httpdで公開してるけど、、
マズいのかなぁ。
s
630 :
nobodyさん :03/04/04 14:48 ID:n4Opp+jH
ログイン・ログオンなどについて熱く語ってるサイトあったら教えてください。 ヤフーのログイン・ログオンはどういう仕組みなのかな?
>>630 そりゃ Perl と全く関係無いとは言わないけれど、
そもそも Perl スレに書き込む話題か?
>628 Win板のXPスレで聞いてこい。
635 :
nobodyさん :03/04/04 18:47 ID:jyfKo/rm
636 :
606 :03/04/04 19:09 ID:???
>>624 試しにperl.exeを起動して、最初の一行目に
use Win32::API;
と、入力してリターンを押すとウインドウが閉じてしまってエラーメッセージすらも見れません
win32::apiが入ってない場合はどのようにすればいいのでしょうか?
よろしくお願いします(´Д⊂)
>試しにperl.exeを起動して >ウインドウが この時点で俺はお手上げだなぁ。 とりあえず、その perl.exe とやらはどこから入手したのさ?
638 :
606 :03/04/04 19:33 ID:???
>>637 ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.msi
のセットに入っている奴です
>>606 っつーか、perl.exeのウインドウ って何?
たぶん、
>>606 はコマンドプロンプトを知らんのでしょう。
perl.exeを*ダブルクリックで*起動して、perlがstdin待ちになったところへ
use Win32::API;と入れて、すく終了してウィンドウが閉じたと。漏れはUNIX派なので
ここらへんよく分からんが、WindowsだとCtrl-d押さなくても終了になるんかな。
コマンドプロンプトを知らん人が、Win32::APIなど使えるわけありません。あきらめ
た方が時間の節約になりますYO。
皆わかってて、からかってるんだってば。
優しい人発見。
>>640
643 :
606 :03/04/04 21:22 ID:???
とりあえず、ある***.plってのを動かしたいんですが 一種類だけ動かないんで聞いてみました
644 :
nobodyさん :03/04/04 21:28 ID:OlDxyviA
ページが変わっても変数や配列を保持しておくことができますか? 例えばあるページで使用した$test1=10を次のページでも form変数やurl変数で送らずに使用したいです。 可能でしょうか?教えてくださいまし。
>644 ファイルに保存しる。
>>644 データをプーリングしておくためのサーバを起動しておく。
で、現ページでPUTして次ページでGETする。
652 :
606 :03/04/04 22:05 ID:???
>>651 解決しました
time-hiresとhttp-liteは入れたんですが、一つ足りなかったようですね
なんか勉強不足で訳分からない事言ってたと思いますが
ありがとうございます
自作CGIを評価してくれるサイト知りませぬか?
漏れも自作CGIを評価してくれるスレが欲しいな せっかくだから653が立ててよ ていうかこのスレでガンガン貼っていってもいい? 一応初心者ってことで質問とは限ってないみたいだし
iisで鯖公開したら違反ってマジで? なんでそうなるのよ? じゃあiisってなにするためにあるの?
配列@dataには[0-9],\n,\tとスペースが含まれてます。 それを確かめるためのif文はどう書けばいいのでしょうか? 要するに、 if (配列@dataに、[0-9],\n,\tとスペース以外が使われている){ &error; } この( )の中の記述です。 やっぱforeach等でまわさないとダメっすか?
>>659 if (join('', @data) !~ /^[0-9\n\t ]+$/){
&error;
}
661 :
659 :03/04/05 06:45 ID:???
>>660 様!
完璧っす!
joinの使い方覚えました!
実は。。。
/^[0-9\n\t ]
を
/[^0-9\n\t ]
って読み違えてて。。。
きゃははははは! (もう笑うしかない。。。 自爆)
662 :
マリモーマ ◆r6PDGT6Xd2 :03/04/05 11:23 ID:4Hc1kYlW
僕が立てようと思ったが 無理だった よかったら 下を使ってね タイトル 自作CGIを評価するスレ 内容 自分の作った CGIを みんなに評価してもらうレスだよ
>>661 >きゃははははは! (もう笑うしかない。。。 自爆)
~~~~~~
>>655 独立したスレの方がいいと思う。。。ここではPerl以外はスレ違いになるし。
というわけで立ててくる。
667 :
653でつ :03/04/05 14:07 ID:t4dpk1aS
ここに春には長過ぎまつ 掲示板を作ったのでつが、細かい部分から全体の流れまでを評価してくれるサイトを知りたかったのでつが・・・
open (LOG,$logfile) || &error("ファイルオープンエラー : $logfile"); LOG書き込み処理 close (LOG); open (DAT,$datfile) || &error("ファイルオープンエラー : $datfile"); DAT書き込み処理 close (DAT); ↑こんなときにdatfileを開くところでエラーが出たとき、 logfileには書き込まれてるのにdatfileは書き込まれないって事になりますよね? それを回避するためには↓のようにすればいいのかなぁなんて素人なりに考えたんですが、 おかしいですか? open (LOG,$logfile) || &error("ファイルオープンエラー : $logfile"); open (DAT,$datfile) || &error("ファイルオープンエラー : $datfile"); LOG書き込み処理 DAT書き込み処理 close (LOG); close (DAT);
errorが何をする関数か分からん。その中でexitしてたら結局同じ。 openとcloseをどう並べ変えようが無理じゃないかな。 DAT書き込みが失敗したらLOG書き込みを「自分で」削除することが必要。
>>670 &errorの中でexitします
んで、質問はopenで失敗したらだったんですが、
たしかに書き込みで失敗したら一緒ですよね
でも例えば$logfileのmax行数が決まってて、
書き込み処理のなかでmaxを超えてたら古いのを削除とかしてると、、、
こういう複数ファイルの処理の時ってどうするべきなんですかねぇ?
みなさん気にせず書いてるものなんですか?
正式なファイル名で中途半端な物を作るのは良くない。 完全な物を作ってからリネームするのが普通。
673 :
デフォルトの名無しさん :03/04/05 16:03 ID:E+nPGg0Q
>>669 >↑こんなときにdatfileを開くところでエラーが出たとき、
それより、書き込むには、
open (LOG,>$logfile) ってしなきゃだめだよ。
open (LOG,$logfile) で書き込めてるなんておかしいよ。
慎重に質問しれ。
674 :
669 :03/04/05 16:22 ID:???
>>672 なるほど。テンポラリーを作っといてリネームするんですね
勉強になりました。ありがとうございます。
>>673 すいません。読み込みのところからコピペしたんで忘れてました。
675 :
nobodyさん :03/04/05 17:40 ID:EfZ+i867
コンビネーション{nCr}の計算をしたいんですが結果がおかしいんです。 多分オーバーフローしてるんだと思うんですけどいい方法無いですか?
まず原因を突き止めなさい。闇雲に動いても意味無い。
678 :
nobodyさん :03/04/05 18:06 ID:MPfOwriq
679 :
675 :03/04/05 18:11 ID:MPfOwriq
>>677 ダメでした。
今やりたいのは十進で60桁程度の演算なんですけど
そういう計算したいときにみなさんはどうやってやるんでしょうか?
>>679 だから本当にオーバーフローのせいなのか?計算式間違ってるとか
>>681 forの中身が間違ってました。
スレ汚し申し訳ないです。
683 :
669 :03/04/05 18:59 ID:???
>>672 open (LOG,>$logtmp) || &error("ファイルオープンエラー : $logtmp");
LOG書き込み処理
close (LOG);
open (DAT,>$dattmp) || &error("ファイルオープンエラー : $dattmp");
DAT書き込み処理
close (DAT);
rename("$logtmp", "$logfile") || &error("リネームエラー : $logfile"); #※1
rename("$dattmp", "$datfile") || &error("リネームエラー : $datfile");
ちょっと思ったんですけど、↑こういうことですか?
じゃあ※1でエラー出たら一緒じゃないですか?
>>683 リネーム失敗なら、テンポラリを削除して処理を終了でいいでしょ。
読み書きは正常なのに……とかセコいこと考えないで、完全エラー無し以外は
すべて異常終了扱いにしたほうがいい。
1つ目のrenameが成功して2つ目のrenameが失敗すると困りませんか
1,2,3,10,22 という配列があって sortすると 1,10,2,22,3となってしまいます。 これを1,2,3,10,22のように実際の大きさ順に ソートするにはどうすればいいのでしょうか?
sort {$a <=> $b}
renameは失敗しないことにする。
>>688 それでは最終的に元ファイルが更新される保証がない。
>>689 「元ファイルが更新される保証」はいらないだろ。
「$logfileと$datfileの整合性が保たれる保証」が必要。
691 :
669 :03/04/05 19:43 ID:???
>>684 んーよくわからないんですが・・・
>完全エラー無し以外は すべて異常終了扱いにしたほうがいい。
それはわかるんですが、どういう風に書けばそうなりますか?
rename("$logtmp", "$logfile") || unlink("$logtmp");
rename("$dattmp", "$datfile") || unlink("$logtmp","$dattmp");
こういうことですかねぇ?
あと、今まで既にあるデータを読み込まずに
open (DAT,>>$dattmp) || &error("ファイルオープンエラー : $dattmp");
DAT書き込み処理(追加)
close (DAT);
↑こうして追加してたんですけど、
一度テンポラリファイルを作ってリネームとなると、
全て読み込んでから新しいのを足したものを上書き
しないといけなくなりますよね?
処理の重さは変わらないですか?
もちろん重くなる。 でも、やらなきゃならないんなら、しょうがない。
>>669 open (LOG,>>$logfile) || &error("ファイルオープンエラー : $logfile");
$pointer = 0;
$pointer = ファイルポインタを取得する関数
LOG書き込み処理(追加)
close (LOG);
if (!open (DAT,>>$datfile)) {
if ($pointer != 0) {
open (LOG,>>$logfile)
truncate($pointerで切り詰め);
close (LOG);
}
&error("ファイルオープンエラー : $datfile");
else
DAT書き込み処理(追加)
close (DAT);
end
むちゃくちゃだけど、こんなんはどうですか?
694 :
Perlですが :03/04/05 20:17 ID:qMi3a/lA
ファイルをアップロードするシステムを構築していますがわからないことだらけです。 index.cgiのFORMデータをsubmit.cgiに引き渡して処理させたいのですが、どうやればいいのでしょうか? 親切なアドバイス待ってます。
697 :
669 :03/04/05 20:41 ID:???
>>693 わざわざ有難うございます。
ちょっとわからない事だらけなんで調べてきます。
698 :
Perlですが :03/04/05 20:41 ID:qMi3a/lA
>>695 それではなくて他に方法はありませんか?
>親切なアドバイス待ってます。 なんかムカつく。 submit.cgiでおこなう処理をindex.cgiの中から呼べばいいだろ わざわざ"引き渡す"意味がわからん
>>693 if ($pointer != 0)
の条件判断は不要な気がする。
ファイルポインタ?
>>669 ちょっと直した
open (LOG,>>$logfile) || &error("ファイルオープンエラー : $logfile");
$pointer = tell(LOG); # ファイルポインタの位置を返す
LOG書き込み処理(追加)
close (LOG);
if (!open (DAT,>>$datfile)) {
open (LOG,>>$logfile) # ←エラーが発生しないことを祈る
truncate(LOG,$pointer);
close (LOG);
&error("ファイルオープンエラー : $datfile");
} else {
DAT書き込み処理(追加)
close (DAT);
}
こんなんでいいのかどうか分からないが・・・
logfileとdatfileの整合性を保つためのもっといい方法があるのだろう・・・
>>699 >>親切なアドバイス待ってます。
>なんかムカつく。
>>694 は、あまりにもアレな質問して叩かれたことがあるに1000クックブック
>>702 tell(LOG);で0を返すんですが・・・
>>704 「>>」でopenすれば、ファイルの末尾の位置を返すよ。
>>705 $pointer = tell (LOG);
windowsじゃtell使えないんでしょうか?
なぜか0を返すんです。
ちゃんとその後printしたものは追加書き込みになってるんですけどねぇ
707 :
705 :03/04/05 22:37 ID:???
>>706 漏れの環境(WinXP+ActivePerl5.6)で
open(FILE,">>test.dat");
$p = tell FILE;
close(FILE);
print "$p\n";
test.datの中身を例えば、
aaa\r\naaa\r\n
として、上のスクリプトを実行すると、
「10」となります。
なんで706さんは0になるのかなぁ。わかんねぇ。
$ cat hoge perl -e open(F,">>hoge");$p=tell(F);close(F);print $p,"\n"; $ wc hoge 1 4 60 hoge $ perl -e 'open(F,">>hoge");$p=tell(F);close(F);print $p,"\n";' 60 漏れの環境でも正常です。Win2k $ perl -v This is perl, v5.6.1 built for cygwin-multi
あ、他がおかしいんですね。お騒がせして申し訳ないです。 調べてきます。
710 :
:03/04/05 23:10 ID:sLGWgkab
PerlでGUID取得する方法ないっすかね?
711 :
nobodyさん :03/04/05 23:11 ID:RuMeXkuC
ハッシュの値で並び替えを行いキーと値を表示したいのですがどうすればいいでしょうか
sort {$hash->{$a} cmp $hash->{$b}} keys(%hash)
sort {$hash{$a} cmp $hash{$b}} keys(%hash);
714 :
nobodyさん :03/04/05 23:30 ID:RuMeXkuC
715 :
nobodyさん :03/04/06 00:32 ID:httIMQcy
クッキーがあるかどうか確認する方法を教えてください。
716 :
:03/04/06 00:43 ID:88ZLH8qE
>>715 $ENV{'HTTP_COOKIE'}に値がはいっていれば在り、無ければ無し
717 :
nobodyさん :03/04/06 00:53 ID:/U6PDdMC
>>716 サソ
それは自分のCGIから吐き出されたクッキーなんですか?
718 :
:03/04/06 01:00 ID:88ZLH8qE
719 :
nobodyさん :03/04/06 02:34 ID:ONKJQ6B1
PerlでUserAgentを書き換えるにはどうすればいいんですか?
>>719 「何の」UserAgentを書き換えたいのか?
$ENV{'HTTP_USER_AGENT'} = "もじら Version 2.3"; でいいだろ。
722 :
nobodyさん :03/04/06 03:07 ID:oW/lvYed
xpで、active perlが入ってて、 iisを作動させてブラウザからcgiの確認なんかはできるんですけど、 コマンドプロンプトでの動かし方がわかりません。 どこかの説明で「コマンドプロンプトを開いてper-vと打ち込む」 って書いてあったんですけど、 >'perl-v' は内部コマンドまたは外部コマンド、 >操作可能なプログラムまたはバッチ ファイルとして認識されていません。 ってでてきます。 それ以前に最初から、 >C:\Documents and Settings\***> これが表示されてるんですけど、この後にperl-vって打つのであってますか? つまり >C:\Documents and Settings\***>perl-v こう打つと >'perl-v' は内部コマンドまたは外部コマンド、 >操作可能なプログラムまたはバッチ ファイルとして認識されていません。 こうなります。
まず
C:\Documents and Settings\***>perl -v
と打ってみろ。それでも失敗したら
C:\Documents and Settings\***>PATH
の結果を貼れ
(
>>721 の名前欄無視して)
>>723 有難うございます。いけました>perl -v
でもなぜですか?
ってゆうか、perl -v って打つのが普通なんですね。 この前見たページ確認しにいってきたらスペース入ってました。 すいませんでした
727 :
nobodyさん :03/04/06 03:43 ID:ONKJQ6B1
>>720 アクセス解析の入っているページで
use LWP::Simple;
my $url = "
http://yahoo.co.jp/ ";
my $content = get($url);
print $content;
と、ソースを取得した時に
アクセス解析でlwp-trivial/1.35解析されずに
Monazilla/6.00と解析されるようにしたいです。
>>727 はyahooがアクセス解析してると仮定してます。
my $ua = LWP::UserAgent->new; $ua->agent(Saitama'); perldocなり、cpan也でもうちょっと調べるべきであるかな
730 :
nobodyさん :03/04/06 08:03 ID:xn7ICdMG
CGIを設置しているのですが .cgiのファイルをいじっていて、その中にメールアドレスを 書こうとしたらエラーになります。 どうも@を書くとエラーになるようですが cgiの中に@を記入したい場合どうしたらよいのでしょうか?
ダブルクォートでくくられた文字列の中にメールアドレスを 書こうとしているのだと想像します。 その場合、@ が配列変数として認識されてしまっているので、 @ の直前に \ をつけて書くことをお勧めします。 あるいは、変数が展開されないシングルクォートで、文字列 をくくるという方法もあります。 今後は、エラーが出たときは、エラーメッセージをここに 貼り付けてご質問されることをお勧めします。
packageってC++のnamespaceみたいなもの?
736 :
nobodyさん :03/04/06 11:52 ID:xQ2onnJ6
perlで指定したサーバーが稼動しているか倒れているか調べる関数か何かありますか? 自鯖構築に利用したいのですが、独自ドメインからWebサーバーに飛ばして、 そこで、perlが処理するのですが、 if ($自鯖稼動状態 == 1) { print "Location: $ZISABAurl\n\n"; } else { print "Loaction: $WEBSABAurl\n\n" } みたいにしたいのですが。
737 :
bloom :03/04/06 12:25 ID:Ne2teiuv
740 :
邪穂 :03/04/06 13:36 ID:xn7ICdMG
>>741 厨が迷い込んでくるから貼らないでくれよ…
早いな。
春休みが終わった途端に加速していたスレが止まりましたね。
花見で忙しいんだ罠
外部に置いた設定File"param.txt"に #param.text $param1 = 'value1'; $param2 = 'value2'; という変数宣言文が有り、これを読み込んで記述された通りの変数に展開 するにはどうすれば良いのでしょうか? open( FILE , 'param.txt'); @buf = FILE; close(FILE); foreach(@buf){ $_; }; print "param1 = $param1\nparam2 = $param2\n"; という感じにしても駄目でした。
>>747 直接の回答じゃないけど、スカラー変数の名前をtxtファイルで
指定しとくのはやめたほうがいいんじゃないかな。
ハッシュでやりましょう。
749 :
747 :03/04/08 07:41 ID:???
>>748 いや、本当はやりたくないんですが、既存のFileを再利用しつつ
新規のprogramを作れというデムパな指令がおりてきまして・・・
なにやらNTT謹製のcgiがこの方法を使っているとかで、既存のFileを
出来るだけいじらずにProgram側で処理しなくちゃならんという事に
なったので困っている次第なのです。
#やっぱ'$'消して連想配列に突っ込むってのが一番安全な方法かなぁ。
require "param.txt"; じゃだめなの?
requireが駄目なら、 perl -e '$a="param1"; $$a="value"; print $param1;' っていう方法もあるよ。 適当に書くと foreach(@buf){ my ($var,$val) = split(/=/,$_); $$var = $val; }; print $param1; (合ってるかな?)
ちょっとだけちゃんと書いてみた。スカラーだけ。その他param.txtの書き方に制限有り open(FILE , 'param.txt'); @buf = <FILE>; close(FILE); foreach (@buf) { my ($var, $val) = split(/\s*=\s*/,$_); $var =~ s/^\$//; $val =~ s/^["']//; $val =~ s/;\s*$//; $val =~ s/["']$//; $$var = $val; } print "param1 = $param1\nparam2 = $param2\n";
753 :
747 :03/04/08 08:11 ID:???
>>750 えぇと、元になるparam.txtが複数(別名で)有って、呼び出される時の
パラメータ(formの内容次第)で読み替える様にしなくちゃならんので
requireは使用不可と判断しました。
>>751 なるほど、「可変変数」という手が有ったのですね。
あとは改行と「'」消しだけで問題無く(根本的解決では無いが)出来そう
です。
ありがとうございますです。
754 :
747 :03/04/08 08:17 ID:???
>>752 あ、入れ違いで、、、
意図した通りに動作しました。
ありがとうございます。
>>753 %form = フォーム;
require $form{'whichfile'};
じゃだめなの?
756 :
747 :03/04/08 11:02 ID:???
>>755 whichfileが存在しない場合ってエラーになりませんでしたっけ?
・・・という事を考えて敢てFile読み込みの方向で考えていたんですが。
757 :
nobodyさん :03/04/08 11:05 ID:KoNa94bz
掲示板作ってます。 記事の削除機能、修正機能を加えたいと思っています。 記事ナンバーとパスワードを入力し、該当の記事を引き出す事には成功しましたが、 そこからのログファイルの操作?がよく分かりません。 よろしければご教授下さい。お願いします。。
>>757 それだけでどうやって答えろって(ry
該当レスをテキストエリアにでも表示させて編集後に再書込み
該当レスを削除してログを前につめるか削除メッセージで代替して再書込み
そんなとこじゃないの
759 :
757 :03/04/08 11:33 ID:sQEXk45G
>758 すいません、、ありがとうございます。
中にファイルが入ってようが無かろうが関係なしに ディレクトリを削除ってことはできないですかね? rmdirじゃあ、中に入ってると消してくれないんで
>>761 Linux だったら
rm -rf /
今日、STDOUTをtieしてContent-Lengthを出すっていうのを 思いついたんだけど、同じ事考えた人っている?
>>762 れすどうもです。
これは何でしょう?コマンドかなんかでしたっけ?
んーやっぱりディレクトリの中調べて、全部消してrmdirにしようかな
$data1 〜 $data10って言う変数の値を1行ごとファイルに書き出すのですが、 print OUT "$data0\n"; print OUT "$data1\n"; print OUT "$data2\n"; print OUT "$data3\n"; print OUT "$data4\n"; print OUT "$data5\n"; print OUT "$data6\n"; print OUT "$data7\n"; print OUT "$data8\n"; print OUT "$data9\n"; print OUT "$data10\n"; ってやってます。 もっと簡単にできる(書ける)方法を伝授くださいませ。
for ($i = 0; $i <= 10; $i++) { $data{$i} = "$i番目の要素"; } for ($i = 0; $i <= 10; $i++) { print "$data{$i}\n"; } こんな感じね。
>>766-768 んなことせんでいい。
foreach (0..10) {
print ${"data$_"};
}
>>769 わかってるが
$data1〜$data10 っていうのはみると気持ち悪いんだYO!
>>769 すっきりでつ!
改行が入ってなかったんでちょっと悩みました。
アホっぽいから。
ぎゃあああああああああああああああああああああああああああああああああああああ
ごめん・・・ 本当にあった怖い話実況スレと間違えた・・・
ワロタ
禿藁
>>764 perldoc File::Path
>>747 my %files = (
foo => 'foo.pl',
bar => 'bar.pl',
foo_alias => 'foo.pl',
);
my $configfile =$files{ $form{wichfile} };
do $configfile if -e $configfile;
779 :
nobodyさん :03/04/09 00:39 ID:XTBH8kIa
ちょいと質問。 mod_perl でeval ってやっても問題なし? eval ってその中に書かれた文字列をコードとして認識するってことは その中の文字列をコンパイル→実行 ってわけだよな? mod_perl ってコンパイルしたコードをメモリに置いておくもんだが、 eval でコンパイルされたコードはゴミとしてメモリに残ったりしない? あと、@list = qw(a,b,c,d,e,f,g); ってのがあるとき $list[2] は c $list[5] は f ってのは当たり前なんだが、 $list[25] ってのを参照しようとしたら 普通は未定義値となると思うんだが、-w スイッチつけると Use of uninitialized value in concatenation とかエラー出る。 mod_perl で安定したプログラム作るとき、 こういうのもやめたほうがよい?
780 :
251 :03/04/09 01:41 ID:???
シンボリックリファレンスは使わぬほうがいいんだけどなぅ・・・ せめて配列を覚えよーよ・・・
781 :
nobodyさん :03/04/09 05:00 ID:7s8viccH
>>779 evalの実行結果が残ると思っているならんなことはない
というか、oオプション使ったマッチングで結果が残らないようにわざとevalでくくったりする
evalの中はコンパイルされないのよ。単なる文字列だから。だから実行中にランタイムエラーを拾える。
未定義値の参照は、mod_perlでも問題ないよ。(たしか)
ただ、未定義の領域にアクセスするなんてperlだから許されることで、
お勧めはしない。
(個人的には-wオプションでランタイムで出る警告気にしてたらperl使う意味無いと思うけど。)
>>779 evalは
>>781 の通りで、mod_perlでの問題はないはず。
蛇足だがグローバル変数のほうを気にしたほうが。
-wでのwarnは、漏れは気にしてしまうほうだが
配列の添字を直接指定して使うことがあまりない。
必要なときはdefinedや要素数で念のためチェックする。
-wの警告は気にするな。 本当にその警告が出ても問題ない場合は、no warnings 'warnings-category';として一時的に警告を無効にすればいいんだし。
784 :
nobodyさん :03/04/09 13:23 ID:azVD19ZG
lanにあたっているグローバルアドレスを、取得するにはどのような方法が あるでしょうか? 外のサーバにアドレスを吐き出すプログラムを置いて、チェックする方法以外を 教えてください。
785 :
nobodyさん :03/04/09 13:26 ID:1sAaMz5U
質問です。cgiでC言語のように バイナリーファイルを読み込もうと思うのですが、 どうも変数に何も入らないみたいです。 open(IN, 'test.bin'); binmode(IN); sysread(IN, $buf, 64); close(IN); 何がいけないのでしょうか?
787 :
785 :03/04/09 13:48 ID:1sAaMz5U
>>786 自分はC長いことやってて、perlは初心者なんですが、
perlだとテキストを行単位で読み込むことは簡単ですが、
バイナリーをバイト単位で読み込む方法がよくわからない。
というか、どうやってもうまくいかない。
Cだとstdioでもioでもバイナリー読み込みは簡単に出来るのに
perlにはそういう機能が無いのかなと思って。
>>787 Perlならreadでできるはず。
Cをやっていたのならfreadは知っているよね?あれと同じようなもの。
>>785 何がいけないんだろね。
とりあえず俺の環境ではそのソースで動いたよ。
syswrite で変数の中身出して目で比較したんだけども。
>>785 一行目を見逃してた。
>cgiで
いきなりCGI?ローカルではちゃんと動いたってことか?
791 :
785 :03/04/09 14:08 ID:1sAaMz5U
大変申し訳無い。 まったく別の部分が原因でデータがうまく取得できてなかったみたい。 つまんない質問でスレを汚してしまってすみませんでした。ペコーリ
792 :
nobodyさん :03/04/09 18:28 ID:yosCCaSF
ログファイルを読み込んで、配列の入れ替えを行いのですが… 4と6の列を入れえるときは $a = 4; $b = 6; とフォームからもってきます。 例: 7<>こんにちは<>2002/4/9<> 6<>おはよう<>2002/4/9<> 5<>おやすみ<>2002/4/9<> 4<>さようなら<>2002/4/9<> 3<>ごきげんよう<>2002/4/9<> ▼(4と6を入れ替え) 7<>こんにちは<>2002/4/9<> 4<>さようなら<>2002/4/9<> 5<>おやすみ<>2002/4/9<> 6<>おはよう<>2002/4/9<> 3<>ごきげんよう<>2002/4/9<> この様な形で再度ログファイルに保存したいのです。 push関数で上手くいかないものなのでしょうか? ご教授をお願いします!
どうしてそこで push が出てくるのか良くわかんない。
pushよりspliceの方がいいと思うが。
>push関数で上手くいかないものなのでしょうか? 自分なりに使う関数を思いついてるのに、何故実行に移さぬのですか。 GOサインもらわんとコード書けんわけでもないでそ。
>>795 pushを使えばうまくゆくと思いやってみたが、うまくゆかなかったということだろ。
797 :
792 :03/04/09 18:47 ID:FE+VX2Y9
>>792 です。
色々と試行錯誤しているのですが、
実行すると…
7<>こんにちは<>2002/4/9<>
4<>さようなら<>2002/4/9<>
5<>おやすみ<>2002/4/9<>6<>おはよう<>2002/4/9<>3<>ごきげんよう<>2002/4/9<>
と入れ替えた場所以降が全てつながってしまいます。
使う関数はspliceの方がベストなんでしょうか?
799 :
792 :03/04/09 18:56 ID:FE+VX2Y9
>>798 入れ替えるところだけを変えるので、
そこは\nを入れているのですが…
ソース晒そうよ
>>800 は
>>792 に向かって言ってるんだよな?
だったら同意見。
つか、まっさきにソースさらすべきだろ。
よーしパパ、1000行あるソースを全部貼っちゃうぞ〜
803 :
nobodyさん :03/04/09 19:27 ID:2liy07Cv
>802 やっちゃぇ〜ぱぱぁん♪
foreach(@lines) { chop; my ($no,$aisatu,date) = split(/<>/); ・ ・ ・ push(@new,$_\n) }
↑つーかめちゃくちゃだわ。ごめん
foreach $key ( keys( %hash ) ) { } こうすると、キーを文字コード順で並び替え、 処理することができるんですが、 数字順?で並び替えて処理するのは可能でしょうか? 可能なら方法など教えていただけないでしょうか? つまり上のなら 122 , 13 , 1778 , 2 と並ぶとおもいますが、 2 . 13 . 122 . 1778 でソートして処理したいってことです。
808 :
251 :03/04/10 05:43 ID:???
>>807 それは無理ですね。
只、ハッシュのkeyを配列に入れなおすなりしてその結果を
ソートの種値にもってくのは可能です
>>807 >こうすると、キーを文字コード順で並び替え、
残念。そのままでは並び替えはされません。
文字コード順に並び替えるには、sort をつけるだけでok。
foreach $key (sort keys %hash) {
}
数字順にするには、sortに条件式を指定してやります。
foreach $key (sort { $a <=> $b } keys %hash) {
}
810 :
806 :03/04/10 05:58 ID:???
>>808 そうですか・・・
そうやって配列に入れてる説明をしてるサイトがあったんで、
もしかしたら、無理なのかなぁと思いながらも質問してみました。
有難うございました
>>809 あぁごめんなさい
sort書いたつもりで、書いてないところコピペしてしまってました。
てか、えっ?
foreach $key (sort { $a <=> $b } keys %hash) {
}
これいけるんですか?確認してきます
下のやついけました。 有難うございました。
______
/_ |
/. \ ̄ ̄ ̄ ̄|
/ / ― ― |
| / - - |
||| (5 > |
| | | ┏━┓| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | | ┃─┃| < こんなサイトを見つけた
|| | | | \ ┃ ┃/ \ 正直、スマンカッタ
| || | |  ̄ \_________
http://saitama.gasuki.com/kensuke/
http://www.saitama.gasuki.com/kaorin/ こんなのございま−す♪
 ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜oノハヽo〜
,.-''"¨ ̄●`' ‐(^▽^)
(,,●i,,,i,,,,,,,,i,,,,●),,)⊂ )
) ( || |
( ^▽^) (_(__)
~~~~~  ̄ ̄ ~~~~~ ~~~~~
それ流行ってんの?
変数で変数名を決めてるのですが、微妙に複雑化してきた所でエラーになりました。 ${"data$form{name$no}"}{'age'} これなんですが、 どうもエラーの原因は「$form{name$no}」これっぽい。 でも、ダブルクウォートの中にダブルクウォートなんて書けないし、どうしたら良いでしょうか?
>>817 > ${"data$form{name$no}"}{'age'}
${'data'. $form{'name'. $no}}{'age'}
とか。
でもそれ、基本的なところから見直したほうがいいのでは・・・。
819 :
nobodyさん :03/04/10 12:17 ID:ofuMCP5l
http://namihei.zone.ne.jp/upup/up/1098.lzh ラジオたんぱのサイトからNEWS記事のリンクを取得するCGIなんですが、
突然出来なくなりました。
どこを修正していいか分かりません。
教えてください。
宜しくお願いします。
具体的には取得してきたhtml
と<!---------------------記事部分------------------->
を比較したいんですが…
文字コードが違うのかうまくいきません。
for( $i = 0 ; $i <= $#data ; $i ++ ){
$data[$i] = &PrintSjis($data[$i]);
if( $data[$i] eq &PrintSjis("<!---------------------記事部分------------------->")){
print $data[$i];
last;
}
}
----
宜しくお願いします。
>>819 そんな部分のコードだけ見たってわかるわけないだろ
いじったのならオリジナルに戻せばいい
822 :
鮮民 :03/04/10 13:29 ID:oo4Xo2Ys
>>817 $data = {
01 => {
neme => 'name',
age => 'age',
},
};
$data->{$form{'no'}}->{'age'};
こんな感じにしてみたら?
823 :
817 :03/04/10 13:31 ID:???
>>818 どうもです。変数名の中で演算子も使えるとは知りませんで…。
>でもそれ、基本的なところから見直したほうがいいのでは・・・。
出来るだけコンパクトになるよう考えてこれなんですよ…お恥ずかしい限り。
824 :
817 :03/04/10 13:39 ID:???
>>822 時間差で気付きませんで。
リファレンスですね。ちゃんと勉強してみようかな。
今までなんとなく避けてたし…。
825 :
nobodyさん :03/04/10 13:50 ID:5ksdsSWS
Perlというか文字コードの話だと思うんですが <HEAD>内でcharset=iso-8859-1を指定して書かれた HTMLのフォームから日本語で文章を打ち込んでメールを送信したいんですが フォームでSUBMITしてCGI(Perl)でテキストエリアに入力された日本語を取得して sendmailを開いてメールヘッダに print SENDMAIL "Content-Type: text/plain; charset=iso-8859-1\n"; を指定して所定のアドレスにメールを送信したんですが outlook expressで受信して開くと思いっきり文字化けしてる感じです。 とりあえずoutlookで見た時に日本語が表示されている必要があるんですが HTMLのcharsetの方は事情により変更できないので Perlの方でうまいぐあいに文字コードを変換(?)してメールするようにしたいんですが・・・ なにか方法とか参考になるサイトなどありましたらアドバイスよろしくです
まず、実際にメールを送信する前に、 テキストファイルに落とす等ちゃんとテストしてくれ。 んで、文字コードの件は、Jcode.pm か jcode.pl で。 あと charset に iso-8859-1 を指定したい理由が不明なのだが?
827 :
nobodyさん :03/04/10 14:05 ID:5ksdsSWS
>>826 一応、実際にメールを送信する前に
フォームに入力された文章の確認画面があるんですが
ここでは正常に日本語が表示されてるようです。
(吐き出されたHTMLのソースを見ると日本語が「???」などとなってる)
メールのヘッダに指定するcharsetは何を指定すればいいのか
分かんないのでHTMLの方とあわせただけです・・・
一応、メールの送信前にはPerl内で
&jcode'convert(*msg, 'jis');
などとはしているんですが、受信したoutlookの方では、そのまんま
日本語の部分が「???」などとなってしまう状態です・・・
jcodeでどんな変換が必要でメールのヘッダに
何のcharsetを指定すべきなんでしょうか・・
828 :
825 :03/04/10 14:08 ID:5ksdsSWS
あれ、なんか???になっちゃいましたが 「???」の部分は 「&#12354;&#12354;&#12354;」てな感じです。
ぎゃあっ!!
charset に何を指定良いか分からん奴が
メールを送信するプログラムを書く時代になったのか…。
すげーショックだ。
>>827 >フォームに入力された文章の確認画面があるんですが
アホ
>jcodeでどんな変換が必要でメールのヘッダに
単なる plain text だろうから、その変換で OK
>何のcharsetを指定すべきなんでしょうか・・
他のメールのヘッダを覗いてみなさい。
っつーか、少しは勉強してからそういうプログラム書いてください。
お願いします。この通りです。
830 :
鮮民 :03/04/10 14:20 ID:oo4Xo2Ys
私も一年前まではそんな感じで、データを管理していましたが、 レファレンスを覚えてからは管理が楽になりましたよ。 1<>name<>age<>tel 2<>name<>age<>tel @fields = qw(num name age tel); while (<FILE>) { $i = 0; %hash = map {($fields->[$i++]) => $_ } split /<>/; push(@lines,\%hash); $lines{$hash{'num'}} = \%hash; } print "$_->{'num'} $_->{'age'}\n" for @lines; print $lines->{'1'}->{'age'}; 順番で表示したり、データをキーで指定できたりと何かと便利です。 初めは、わかりにくいと思いますが、頑張ってみてください。 リファレンスがわかれば、オブジェクト指向も出来るようになりますし。
831 :
鮮民 :03/04/10 14:24 ID:oo4Xo2Ys
832 :
鮮民 :03/04/10 14:32 ID:oo4Xo2Ys
間違い発見 @fields = qw(num name age tel); $fields = [qw(num name age tel)]; 意味は無いけどレファレンス。
あぼーん
834 :
825 :03/04/10 14:49 ID:5ksdsSWS
>>829 メールのヘッダにてcharset=iso-2022-jpを
指定してみましたが、指定する前とまったく同じ結果でした…
フォームから受け取った文字が、すでに
&#12354;&#12354;&#12354;のような形ですので
これを&jcode'convert(*msg, 'jis');してメールヘッダでcharset=iso-2022-jpを
指定しても、そのまんま
&#12354;&#12354;&#12354;で表示される感じです。
でもIEのブラウザですとHTMLソース内の文字が
&#12354;&#12354;&#12354;となってても
画面ではちゃんと日本語に変換されて表示されてるようです。。。
outlookで開いて見る時のエンコードの設定もいろいろいじってみましたが
どの文字コードにしても&#12354;&#12354;&#12354;のまんまのようで・・・
いったい、どんなコード書いてるんだ???
丸ごとtextにしてUPしたほうが早い
いや、書いてるコードは想像できるよ。
単にそのまま sendmail に渡してるだけでしょ。
> そのまんま &#12354;&#12354;&#12354;
当たり前じゃん。
ちなみに「あああ」って書いたんでしょ?
>>834
>825 > <HEAD>内でcharset=iso-8859-1を指定して書かれた > HTMLのフォームから日本語で文章を打ち込んでメールを送信したいんですが ブラウザによってはページの文字コードを無視して送信するものもあるので、 こういったやりかたはあまり推奨されない。 きちんと文字コードを取得してから変換すべし。
839 :
825 :03/04/10 15:37 ID:5ksdsSWS
840 :
825 :03/04/10 15:39 ID:5ksdsSWS
>>837 そこまで書いてなぜ正解を書いてあげないの〜?
>>834 >フォームから受け取った文字が、すでに
>&#12354;&#12354;&#12354;のような形ですので
HTMLの ?数字; 表記法を参照のこと。
これを正しい文字コードにそのまま変換できるモジュールあるのかな?
?数字;を抜き出して一文字ずつjisに変換するしかない?
842 :
841 :03/04/10 16:01 ID:???
しまった化けた。もう一度。
>>834 >フォームから受け取った文字が、すでに
>&#12354;&#12354;&#12354;のような形ですので
HTMLの &#数字; の表記法を参照のこと。
これを正しい文字コードにそのまま変換できるモジュールあるのかな?
&#数字;を抜き出して一文字ずつjisに変換するしかない?
>>841 837ですが、
1. 数値文字参照から charset=iso-2022-jp に適合するように変換する
効果的な方法を私も知らない
2. <FORM> のページが charset=iso-8859-1 という時点で
努力する方向が間違ってる気がする
3. 既にPerlの領域じゃない気がする
以上です。
844 :
841 :03/04/10 16:29 ID:???
>>843 どうしてこうなるのか不思議に思ってたんだが、
フォームのページの問題を読み忘れていたようだ…。
というわけで
>>825 よ。
フォームのページのcharsetを日本語にしてみてくれ。
そもそもの問題はここにあると思われ。
リンクなしが主流になる中、 ユーザーも規約が緩いサイトに流れるけど 多少規約が厳しくても(無論常識内)ファンが絶たないサイトみると やっぱ実力なのかなぁ、、、とちょっと憧れる。
ごめん、、素材スレと誤爆〜・・・・
配列なら$#をつかって配列の個数を知ることができましたが、 ハッシュだとややこしいことしないと、 いくつ入ってるかを知ることはできないのでしょうか?
>>847 $num = keys %hush;
スカラーコンテキストでkeys関数を使う。
scalar keys %hash
えっと、だめもとで、 ハッシュで$#これやってみたら、 期待してたとおりの動作が得られました。 いろんなサイトで探したんですけど、 見つからなかったんで質問させていただいたんですが・・・ それと、皆さん全然違うの書いてくださってますよねぇ? $#使っちゃだめなんでしょうか?
853 :
849 :03/04/10 18:59 ID:???
逝ってきます
あ、うそですすいません。 勘違いしてました
ふぅ
857 :
nobodyさん :03/04/11 03:32 ID:Ngj0Yn4X
(´-`).。oO(某スレはまったく見当違いだからスルーは当然だな・・・) (´-`).。oO(ここでもスレ違いとスルーされるだろうな・・・)
859 :
nobodyさん :03/04/11 03:41 ID:Ngj0Yn4X
>>858 (´-`).。oO(適切な場所に誘導してください。。)
861 :
nobodyさん :03/04/11 03:52 ID:Ngj0Yn4X
862 :
nobodyさん :03/04/11 04:03 ID:e9H5z3qo
ハッシュの中に配列のデータを入れたいのですが、 何か良い方法ありますでしょうか。
864 :
nobodyさん :03/04/11 04:22 ID:e9H5z3qo
>>863 言い方悪くてごめんなさい。
私が描いているイメージは
$hash{key} = @array;
こんな感じです。
もしもできればご教授願いします。
865 :
251 :03/04/11 04:22 ID:???
>>863 %hash = \@array;
でそ・・・
866 :
251 :03/04/11 04:23 ID:???
867 :
251 :03/04/11 04:27 ID:???
>>864 $hash{key} = \@array;
で呼び出しは
$hash{key}->[0];
とかね・・・
??????????????-??????! ??????? '????- ?????'??????????????????.???? ???????! ??????????????????
869 :
nobodyさん :03/04/11 17:12 ID:+804Cr9x
すんません、ある文字列から頭2バイトだけ取り除いたものが欲しいのですが my $a = 'abcdef';#欲しいのは$a='cdef'。 substr($a, 0, 2); print $a; 結果 'abcdef' となってしまいます… 何か良い方法ありますか?
$a = substr($a, 0, 2);
872 :
869 :03/04/11 18:18 ID:+804Cr9x
>>870 すいません、勘違いするような書き方でしたね。
欲しいのは2バイト取り除いた後の残りの文字列なんです。
この場合はcdefが欲しいのですがabしか取れないんです…
>872 向こうのスレで答えもらってるじゃん。
マルチに答えるバカがいるスレはここです
875 :
869 :03/04/11 18:39 ID:+804Cr9x
向こうでこっちに誘導されたのでカキコんだのですが、皆さんに迷惑を掛けてしまった ようですね。 どうもスイマセンでした。
誘導した奴が悪いということか
877 :
869 :03/04/11 19:29 ID:+804Cr9x
>876 いえ、「こちらに行きます」と明記しなかった私が悪いです。 本当に申し訳なかったです。
>877 向こうで言われた事をそのまま書くだけか? 自分で考える脳は? そんな考え方しかできないから、適切なスレに誘導してくれた人に対して お礼も言えないんだよ。
>878 ほっとけよ、生理が伝染るぞ
880 :
869 :03/04/11 20:36 ID:+804Cr9x
>>878 なんか会社で怒られてるような気分になりました。
よくこんな感じで怒られるんですよ。
自分はトロいのでやれと言われたことしか中々できないの
ですがもっと自分の頭で考えられるように頑張ります。
本当にすいませんでした。
そしてありがとうございました。
881 :
nobodyさん :03/04/11 20:42 ID:nKHFlgQT
そうやってみんなでせめんなよ 醜いアヒルの子でも見れ
甘やかすだけでは何も前に進まない。 がんすけも分かっているはず。
×がんすけ ○ガァ助
× スレ自体を間違えました ○ 板自体を間違えました
888 :
nobodyさん :03/04/12 01:59 ID:Wz2xojvl
基本なんですけどよくわからないので、ファイルを開く時のモードのことで質問があります。 読み書き両用でファイルを開く時、 open (DATA,"+<./data.dat"); open (DATA,"+>./data.dat"); この両者にはどういう違いがあるのでしょうか。 自分でやってみたところ前者は「>>(末尾に追加)」で、後者は「>(読み込んだ時点でファイルが空に)」と同じようでした。 「読み書き両用」の正しい使い方を教えて欲しいです。
現在のファイルの内容を残すか長さ0に切りつめるかの違い。
>>888 読み込みと書きこみを1回のopenでしたいときに使う。
例えば掲示板の削除処理を俺はこう書く
open LOG, "+<", "./bbs.log" or die;
flock LOG, LOCK_EX;
while (defined(my $article = <LOG>)) {
chomp $article;
my($no, $name, $body) = split /\t/, $article;
$no == $delno or push @newlog, $article . "\n";
}
truncate LOG, 0;
seek LOG, 0, 0;
print LOG @newlog;
close LOG;
俺ならこう書くな while (defined(my $article = <LOG>)) { next if $article =~ /^\Q$delno\E\t/; push @newlog, $article; }
アバウトじゃね?
こんばんわ、Perlを勉強しはじめたのですが、理解できない部分 があったので質問させてください。 for($w=0;$w<10;$w++){ $f=&k($w); print"$f\n"; } sub k{ local($d)=@_; my($w); $w=$d*$d; return($w); } というものがあるのですが、2行目の$wには1行目のfor()で決定される数字が 入るのでしょうか?それともreturnでの返り値が入るのでしょうか? もし前者の場合は返り値はどこにはいるのでしょうか?&k($w)自体に入るのでし ょうか? もしも後者の場合は関数kには式だけあって数字がなくなってしまう気がしますが どこから数字をもってきているのでしょうか? きっとすごい簡単なことなんでしょうけど、教えていただければ幸いです。 よろしくおねがいします。
>>893 はあ?
forの$wとsub kの$wは別ものだよ。
895 :
251 :03/04/12 03:45 ID:???
>>893 for($w=0;$w<10;$w++){
$f=&k($w);
print"$f\n";
}
sub k{
local($d)=@_;
my($w2);
$w2=$d*$d;
return($w2);
}
こうすれば理解しやすいかな?
2行目の $wにはforループの$wがはいって、$fにはsub kのreturnが入ります。
おまけで、ソース的にもあやしいんで書きなおし
for($w=0;$w<10;$w++){
$f=&k($w);
print"$f\n";
}
sub k{
my $d =$_[0];
my $w2 = $d*$d;
return($w2);
}
ソースとしては 多分local($d)=@_; じゃなくて local($d)=$_[0];だとおもう
my $d =$_[0]; にしたのはlocalである必要が無い為・・・
>>894 さん
それはsub kの$wはプライベート変数になっているからですよね?
8行目の$w=$d*$d;で2乗していますけど、そこの$dに入る数字は
どこから持ってきているのでしょうか?
よろしければ教えてください。
おねがいします。
>>895 さん ありがとうございます!
とても分かりやすい説明で理解することができました!
>>251 まず
my($d) = @_;
受け側も右側もリストコンテクストだから、
右側の配列の要素0が左がわの最初の変数に入る。例えば
my($d1,$d2) = @_;
だったら
my($d1, $d2) = ($_[0], $_[1]);
と同じ。次に
my $d = @_;
受け側がスカラーコンテクスト、右がリストコンテクストだから、
my $d = scalar(@_);
と同等になる。よって、$dには@_に何個要素が入っているか、その数が
入る。最後に
my $d = $_[0];
受け側も右側もスカラーコンテクストだから、そのまま$dに@_の最初の
要素が入る。
というわけでlocal($d) = @_;というのは文法的には誤りはない。
local()の使い方としては多分間違ってるけど。(my()が正解)
899 :
251 :03/04/12 06:00 ID:???
>>898 なるほど、両方ともリストコンテクストか・・・
微妙な所だけど、補足ありがと
回りくどい説明だな…。
901 :
888 :03/04/12 10:35 ID:???
>>889-891 ありがとうございました。
「読み込みと書きこみを1回のopenでしたい」とまさにその通りでした。
truncate関数なんてものがあったんですね。勉強になりました。
おかげさまで無事解決。
902 :
nobodyさん :03/04/12 11:56 ID:9LVB7yXu
$_ while (<LOG>); を $article while (defined(my $article = <LOG>)); にしている意味は何のためですか?
>>902 変数を明示的にするため。
というのが一般的な理由…だと思う。
>>901 truncateは使えない鯖があるからevalの忘れるなよ
クラスの中の関数を外から呼べないようにする方法はありますか?
どうしようもない質問があります。 #!/usr/local/bin/perl my $test = '表示成功'; &test(); exit; sub test { print "Content-type: text/html\n\n"; print "$test"; } __END__ このスクリプトを実行すると、出力が「表示成功」になります。 何故my宣言したのにこのような事が出来るのでしょうか?
>>906 > 何故my宣言したのにこのような事が出来るのでしょうか?
あなたが自宅の部屋に立てたテントの中も
「あなたの自宅の中」だからです。
>>906 ## ↓ここから package main;
my $test = '表示成功'; # パッケージに属する変数(my $main::testと等価
&test();
exit;
sub test {
print "Content-type: text/html\n\n";
print "$test"; # ブロック内に$testがないので、$main::testを探す
}
__END__
## ↑ここまで package main;
>907 アンタ説明うまいな、惚れそうだ!(´д`*
>>902 <LOG> が 0 とか "" とか返したらループから抜けちゃう。
defined でチェックすればファイル末尾に達するまで確実に真値が返る。
>>911 ちょっと気になったので試してみたが、while (defined(my $hoge = <FH>))
while (<FH>) どちらでも "", 0 は出力されたぞ。
>>912 漏れもやってみたが、0のみの行があってもループ抜けないよね。
おかしいとおもたよ。
というか、、、 0の行→0\n 空白の行→\n なわけで、偽にはならんわな。
>>914 0とだけ書いたファイルでも同じだった。
\x00だけのファイルはどうよ?バイナリだが。
>>912-916 ごめん、while <> の場合は EOF までちゃんとループしてくれるね。
while(defined($var = pop @array)) { ... } てなのが頭にあったのよ。
>>914 $/ の中身が改行とは限らない。
あんまり意味はないけど $/ = \1; で1 byte 単位とか。
>>904 使えない関数がある時evalするべきと聞きますが、そうすると致命的エラーは発生しないものの
当然evalされた関数は実行されないんですよね?
flockとか実行されないとかなりまずいと思うのですがどうなんでしょうか。
evalしたらあとは祈るしかないんですか?
それと使えない関数があるというのはどういうことなんでしょうか。
Perlのバージョンが古いということですか?それともサーバサイドの設定によるものなんですか?
サーバのことは全くと言っていいほど無知なのでわかりません。
だいたい全体の何割ぐらいのサーバが使えないようになっているんでしょうか。
あやしい関数は使うなということなんですかね。
evalの是非とは関係なく、
>>918 はエラー処理しない人の気がする。
>>918 代替となるロック処理をするのは当然。
evalはエラーを出さなくするための関数じゃないんだから。
truncateとかflockはOSに依存した関数なので、OSがその機能を実装して
いなければ使えない。
私も
>>915 さんのように、バイナリで無理やり数字のゼロだけを含む
ファイルでやってみたのですが、やはり!? while のループの中に入って
行きました。
while ($line = <FILE>) { ...
と書いたので、読み込まれた文字ゼロ (0x30) だけが $line に代入され、
そのゼロがそのまま while の条件式の値となって、偽と判断されるはず
だと思うのですが、私は何か勘違いをしているのでしょうか。
>>921 >バイナリで無理やり数字のゼロ
>文字ゼロ (0x30)
???
>>922 失礼しました。誤解を招く書き方でした。
data.txt というファイルを、0x30 という1バイトのみを持つように設定して
プログラムに読み込ませるデータファイルとしました。この 0x30 を、
>>921 の文中の「数字のゼロ」および「文字ゼロ」は、この 0x30 を指す
言葉として使いました。
●data.txt の中身
> hexdump -C data.txt
00000000 30 |0|
00000001
●プログラム
> cat test.pl
#!/usr/bin/perl
open(FILE, "<data.txt");
while ($line=<FILE>) {
print "hoge\n";
}
close(FILE);
●実行の様子
> ./test.pl
hoge
>>923 それは全然意味ないんじゃないのか?普通に0と書くのと変わらないじゃん。
ってことで\x0でやってみた。
$ perl -e 'open(F,">data.txt");print F "\x00";close(F);'
$ dump data.txt
data.txt:
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 00 .
$ perl hoge.pl
hoge
入ってる。
>>921 おっと、説明不足だったが、
>バイナリで無理やり数字のゼロ
の意味が分からないってことだよ。
0x30を書くんだったら普通にテキストエディタで"0"って書けばいいんじゃん。
>>921 どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。
行入力演算子が undef 返すのは EOF に達した時だけだから、
ファイルは全部読まれるみたい。
統一感の無さは Perl らしいけど、便利と言えば便利。
凄く間抜な質問だと思いますが、あえて聞いてください \0x00とかのコードはどう知ればいいんでしょうか。 どこか一覧表とかあるのかな…。 あと、ずっと気になっていた、画像を生成する際の数字の配列は みなさんどうやって計算?しているのでしょうか。
画像を生成する数字って何?
>928 ダミー画像などでよく見かける、テキストだけで生成してるやつです。 別に、画像を読み込んで出力すれば良いんだけど どうやるのか気になってたもので。
お絵かきソフトで作って バイナリエディタで覗いてみたら? 色数落としていくとそれになるよ。
なるほど、ありがとうー 早速明日試してみる事にします。 今日は眠いのでもう寝ます…。
933 :
nobodyさん :03/04/13 08:46 ID:P9fP4Q1N
結局
>>926 からすると、
>>890 の
while (defined(my $article = <LOG>)) {...
の書き方は助長なのか?
>>934 冗長ですな。
でも、私も厳密に考えたら defined を使って書いていたと思う。
>>926 の
「どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。 」
というのはわかったのだけど、なんとなく釈然としない。
マニュアルのどの部分に、そのことが書いてあるんだろう・・・。
>>935 「どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。 」
は違うみたい。
The defined test avoids problems where line has a string value that would be treated as false by Perl,
for example a "" or a "0" with no trailing newline. If you really mean for such values to terminate the loop, they should be tested for explicitly:
while (($_ = <STDIN>) ne '0') { ... }
while (my $line = <STDIN>) { print $line } In these loop constructs, the assigned value (whether assignment is automatic or explicit) is then tested to see whether it is defined. The defined test avoids problems where line has a string value that would be treated as false by Perl, for example a "" or a "0" with no trailing newline. If you really mean for such values to terminate the loop, they should be tested for explicitly: while (($_ = <STDIN>) ne '0') { ... } while (<STDIN>) { last unless $_; ... }
↓↓↓↓↓↓↓↓↓↓ いい加減な訳 ↓↓↓↓↓↓↓↓↓↓↓ while (my $line = <STDIN>) { print $line } これらのループ構造では、(自動的であれ、明示的であれ)指定された値は defined されてるか否かテストされます。definedされてるか否かのテストをすると、 次の行を伴わない "", "0" のような、Perlでは 偽 として扱われる文字列が 行中にあったときの問題を避けることができます。 もし、おまいが本当にそれらの値("", "0")でループを終了させるのなら、 明示的に次のようにしる: while (($_ = <STDIN>) ne '0') { ... } while (<STDIN>) { last unless $_; ... } ↑↑↑↑↑↑↑ いい加減な訳、ここまで ↑↑↑↑↑↑↑↑↑ ということは、 「どうやら while の条件部は行入力演算子を使った場合に限って、 真偽値ではなく defined か否かで判定されるみたいだね。 」 は正しいのか?間違ってるのか? 誰か正確に訳してください。
940 :
926 :03/04/13 17:45 ID:???
#--- test.p ---
my $file = './test.txt';
open F, '>' . $file or die;
print F '0';
close F;
open F, '<' . $file or die;
A: { print 'A' while <F>; seek F, 0, 0 }
B: { my $foo; print 'B' while $foo = <F>; seek F, 0, 0 }
C: { my($foo, $bar); print 'C' while $foo = $bar = <F>; seek F, 0, 0 }
D: { my($foo, $bar); print 'D' while defined($foo = $bar = <F>); seek F, 0, 0 }
E: { print 'E' while <F> eq '0'; seek F, 0, 0 }
print "\n";
__END__
> perl test.p
ABDE
B が特別扱いっぽく見えるけど、「while の条件部に行入力演算子
のみを置いた場合はデフォルトで $_ に代入」との兼ね合いだろうね。
つまり while <> は while $_ = <> の文法的略記でしかなく、内部的
には後者で処理されてるんじゃないかな。
だから
>>926 を厳密に言うと、「while の条件部は $var = <> ならば
defined か否かで判断、そうでない場合は真偽値で判断」だね。
ドキュメント読んでないけど、挙動を見る限りは。
#!/usr/bin/perl $logfile = "./accesslog.dat"; $agent2 = $agent = $ENV{'HTTP_USER_AGENT'}; if ($agent =~ /AOL/) { $agent = 'AOL'; } 略・・・ elsif ($agent =~ /PDXGW/i) { $agent = $os = 'H"'; } if ($agent2 =~ /win[dows ]*95/i) { $os = 'Windows 95'; } 略・・・ elsif ($agent2 =~ /X11/ || $agent2 =~ /SunOS/i || $agent2 =~ /Linux/i || $agent2 =~ /HP-UX/i || $agent2 =~ /FreeBSD/i || $agent2 =~ /NetBSD/i || $agent2 =~ /OSF1/i || $agent2 =~ /IRIX/i) { $os = 'UNIX'; } $referer2 = $ENV{'HTTP_REFERER'} if ($referer2 =~/\w/){$referer = "$referer2";} open(FILE, ">> $logfile"); flock(FILE,2); print(FILE "$ENV{'DATE_LOCAL'},$referer,$agent,$os,$ENV{'REMOTE_HOST'}$ENV{'REMOTE_ADDR'}\n\n"); lock(FILE,8); close(FILE); exit; これが動かないのでチェックにかけると、 if ($referer2 =~/\w/){$referer = "$referer2";} の;}の近くがおかしいとでました。サッパリわかりません。 ちなみに、ここのリファラーのif文を省いたときは正常に実行できました。
agentのif文も、KENTさんのスクリプトをコピペすると正常なのに、 自分で同じものを書くと、;}の近くがおかしいとでます。 さらに、コピペではelsifはひっかからなかったのに、自分で書くと、 elsifというのはおかしいとか注意されます。もうサッパリです。
訂正しておきます。 $referer2 = $ENV{'HTTP_REFERER'} if ($referer2 =~/\w/){$referer = "$referer2";} else{$referer = 'Direct Access';} です。
>>942 嘘つき。同じもの書いたら同じ動作になるに決まってんだろ
>>944 そうなんですけど、自分で書くと、;}のところや、elsifがひっかかります。
チャックプログラムもKENTさんのところのやつです。
なんでですか?秀丸を使ってるんですけど、なにか関係ありますか?
$referer2 = $ENV{'HTTP_REFERER'} ←ここにセミコロンが無いのは気のせいか? ほんとに同じ物を書いたのか?
>>946 あ、ほんとだ。できました。ありがとうございます。
どうやら=文書くときにセミコロンを忘れる癖がついていたようで前にもこのようなことがなったんですね。。。
スレ汚しすいませんでした。
948 :
nobodyさん :03/04/13 23:18 ID:pEN/2OPI
以前この板で管理人のひろゆき氏よりもエラそうな一言 このスレに2度とくるな! と書かれた者ですが質問しても良いですか?
>>948 もしここで私が「ダメだ」と言ったら
ひろゆきさんに問い合わせるつもりですか?
それともいちいち2ch系サイトに
「あなたのサイトをひろゆきさんにチクリます」
とメールを出したり書き込んだりするつもりですか?
2度と来るなと言われたってことはかなりうざい香具師なんだろ?質問はしないでくれ。
2ちゃんで叩かれるのはそれなりの理由がある事が多い。 >ひろゆき氏よりもエラそうな一言 などと反省の色が見えないことを考えると二度と書き込まないほうがよかれ。
庭の石をひっくり返したら、 だんご虫が群がってるよね。 あれみたい・・・。 このスレ。
949=950=951=952 自演
955 :
nobodyさん :03/04/13 23:41 ID:pEN/2OPI
958 :
937 :03/04/13 23:54 ID:???
>>955 =
>>952 =
>>948 もういいよ。うざいバカだな。
>>956 なるほど。新しい版になると回避するようになってるってことか。
しかし MacJPerl 5.2.0r4 はわけわからんな。何が影響してるんだろうか。
やっぱ
>>937-938 の通りだな。心配だったらチェックしろってことか。
まあ俺の周りでは5.6以降しかないから大丈夫だろうな。
情報ありがd
959 :
948 :03/04/13 23:56 ID:???
952は流れを変えようとしているけど違いますよ。 955はもろそうですけど。
961 :
948 :03/04/14 00:10 ID:???
なんか、荒らしちゃったみたいなので又にします。 失礼しました。
962 :
nobodyさん :03/04/14 01:18 ID:oETCFM9h
例えば55555555という数字があってそれを55.5Mというようにするにはどうしたらいいんでしょうか?
55555555という文字列から、テキトーに3文字持ってきて、ならべる。 最後の文字の直前に、ピリオドを突っ込む。 以下独り言。 バイト数をメガバイトや、キロバイトという単位で表示したいのなら、 1024で割れば、キロバイトになる。 さらに1024で割ればメガバイトになる。 コンピュータの世界の数字ではないのなら、1024の代わりに1000を使う。
>>963 どうもありがとうござます。
数字÷1024÷1024をなんで浮かばなかったんだろう・・
>>937 948がうざがられたらどうするんだ!?
お前責任取れよ!
>>964 さらに1024で割ってギガバイト
${"domo"} = "ども"; use strictだと怒られてしまいます。 何故でしょうか…。
変数名は何?
>>967 use strict;
と書くと、
use strict 'refs';
と、書いてあるときと同じ制限(シンボリックリファレンスの禁止)が効いてくるからじゃないかな。
うわっ恥ずかしー。てっきりハッシュかと思ってた(鬱氏
存在するかどうか不明なのですが... 処理を行う文字列内に2バイト文字が含まれている場合、処理を中断させたいのですが Perl でコレに適した関数が存在しますでしょうか? 関数が存在しない場合、この様な処理を行いたい場合どのような考え方を行えばよいでしょうか?
EUC_JP なら、2バイト文字のどっちのバイトもトップビットが立ってるです。
>>972 様
それを利用して正規表現でマッチングすれば実現できそうですね!
因みに、コード S-JIS の場合は同じ様な方法で処理可能でしょうか?
>>974 様
うお!
杜甫々様にこんな項目があったなんて...
こちらの項目内をじっくり調べて見る事にします!
感謝です ^^
my $hoge='aaa' if($hoge); と書くと変数が空になる場合とそのまま表示される場合があるのはなぜですか?
冷やすことしか思い浮かばずに人を簡単に邪魔者にする、 言いたい事だけだを言って逃げるような人間は必要ない。
直前の質問に回答もせず(できず)に 言いたい事だけだを言って逃げるような人間は必要ない。
煽りデビューしてまだ間もないのかな
981 :
251 :03/04/14 16:42 ID:???
982 :
nobodyさん :03/04/14 23:20 ID:Fu0phwZ6
zisure
オイ糞ども 答えられねーくせに常駐してんなよ
987 :
nobodyさん :03/04/15 01:11 ID:GCPlWzzF
989 :
nobodyさん :03/04/15 01:22 ID:iui3dkW8
自分で書いたCGIの場合自分でパーミッションは考えるんですよね? あと、この場合のパーミッションはどうしたらよいか教えて下さい。 もしよろしければ、UPしてもらいたいんですが。。。だめですか?
誤:FTPクライアントによってやり方は違うからそれに関しての質問はスレ違い。 正:FTPクライアントによってやり方は違うが、それに関しての質問はスレ違い。
$a = 10; $b = 3; $c = $a / $b; だと $c = 3.3333〜になってしまいますし int($a / $b) だと $c = 3になってしまいます 少数第2位でそろえるためにはどうすればいいんでしょうか? 一応 $c = (int($a * 100)/$b)/100; っていうのも考えて見たんですが もっとスマートにやる方法ないでしょうか 表示するわけではないのでprintf()は使えません。
>>976 どんな意図があるか分かりませんが、
せめて
use strict;
してください。
>>994 サンクス 助かったYO。
sprintfでフォーマット決めて変数に代入できるんだね。
996 :
nobodyさん :03/04/15 07:22 ID:HrV7+0uT
じすれは?
ああ、次が立ってなかったんだな じゃあ、立ててくるから待ってて
__END__
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。