Perl 初心者コーナー Part21

このエントリーをはてなブックマークに追加
1nobodyさん
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
2nobodyさん:03/03/18 18:47 ID:???
[過去ログ]
Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc.2ch.net/php/kako/1042/10422/1042260745.html (タイトルに19と誤記)

[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html
3nobodyさん:03/03/18 18:48 ID:???
[総合]
 ・Perl Com: http://www.perl.com/pub/
 ・CPAN.com: http://search.cpan.org/
 ・ActivePerl: http://www.activestate.com/
 ・CGI-ML:http://forest.ne.jp/cgi-ml/

[お薦め]
 ・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
 ・Perl Recipes: http://www.effectiveperl.com/recipes/
 ・Randal's WebTechniques columns: http://www.stonehenge.com/merlyn/WebTechniques/
 ・Perlの部屋: http://www.cc.rim.or.jp/~midorin/mad-p/perl/index.html
 ・Perl初心者の部屋:http://www.harukaze.net/~mishima/perl/
 ・Perlリファレンス:http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
 ・Perlのページ:http://homepage1.nifty.com/nomenclator/perl/
4nobodyさん:03/03/18 18:48 ID:???
[Document&Tutorial]
 ・Perl News: http://www.news.perl.org/
 ・Perl Monks: http://www.perlmonks.org/
 ・use Perl; : http://use.perl.org/
 ・Learn Perl - Perl Education: http://www.devdaily.com/perl/edu/index.shtml
 ・Perldoc.com: http://www.perldoc.com/
 ・Using Perl5 in Web: http://docs.rinet.ru/Using_Perl5_in_Web/
 ・Rex Swain's Home Page: http://www.rexswain.com/
 ・Robert's Perl Tutorial: http://www.netcat.co.uk/rob/perl/win32perltut.html
 ・Perl Tuts: http://savage.net.au/Perl-tutorials.html
 ・Beginning Perl Tutorials: http://www.pageresource.com/cgirec/index2.htm
 ・jcode.pl の私的な解説書: http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
 ・Logical Choice Software, Home Page: http://www.logsoft.com/perltips/
 ・Perlfect Solutions: http://perlfect.com/
 ・The Perl Archive : http://www.perlarchive.com/
 ・Perl6 & Parrot VM についての情報: http://dev.perl.org/perl6/
 ・use Object; : http://perl.infoware.ne.jp/
5nobodyさん:03/03/18 18:48 ID:???
ずざー
6nobodyさん:03/03/18 18:54 ID:???
Part20 のURL間違ってた。ごめんなさい。

Part20 http://pc2.2ch.net/test/read.cgi/php/1044717887/ (タイトルに19と誤記)
7nobodyさん: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表です。
よろしくお願いします。
8nobodyさん :03/03/19 01:18 ID:???
>>7
}else( $ua = ~{
ってなによ・・・
9nobodyさん :03/03/19 01:44 ID:???
>>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";
}

文法コウゾウを理解したほうがよいかと
10nobodyさん:03/03/19 01:53 ID:???
>>7
UAは末尾まで丸々いるわけ?
そんなに細かく分岐させるの?
DoCoMoの6文字だけか1.0とか2.0までとか・・・

どこかで振り分けCGIを落としてきて使ったほうがいいんじゃないの?
11nobodyさん:03/03/19 02:07 ID:DZ7fCmeZ
真似だな。ぽまえ。
>7
細かすぎだろ?

12nobodyさん:03/03/19 02:13 ID:EytPlHC0
ttp://query.s3.xrea.com/active/index.html

みたいなのを自分流に作ってみたいのですが参考になるサイト
参考になるプログラムみたいなのってありませんか?
13nobodyさん:03/03/19 02:22 ID:???
>>12
そうやって質問を装ってブラクラを貼る馬鹿がいるので、できるだけ
文章で詳しく書いて欲しい。
14nobodyさん:03/03/19 02:45 ID:???
>>7
一応突っ込んどくと、 Locationヘッダにパス指定はNG。
ttp://www.studyinghttp.net/rfc_ja/2616/sec14.html#sec14.30
1512 ◆GsKnKxmx8s :03/03/19 02:59 ID:???
>>13
2ch研究さんのアクティブスレッドランキングなのですが
非常に使えるので自分流に改造したいとおもいまして
zenhiteiさんにご相談したところ、ご自由にどうぞとのことだったのです

で、perlをするにしても、あのプログラムの参考になるサイトすら
わからない状態でしたのでここの方々に指示を仰ぎたいなと思い
伺いました。

16nobodyさん:03/03/19 05:33 ID:X4k10DxJ
正規表現でマッチした回数を調べるにはどうすれば良いのでしょうか?
$hoge = 'hoge hoge hoge';
$hoge =~ s/hit/hoge/g;
↑の処理で置換した回数を知りたいです。
お願いします。
17nobodyさん:03/03/19 05:36 ID:X4k10DxJ
ウゲ!!
$hoge = 'hoge hoge hoge';
$hoge =~ s/hoge/hit/g;
です。。。
18nobodyさん:03/03/19 05:39 ID:???
$moge = $hoge =~ s/hoge/hit/g;
1916:03/03/19 05:42 ID:X4k10DxJ
できました!
こんな時間にこんなに早くレスもらえるとは思わなかったです!
どうもありがとうございました。
20nobodyさん:03/03/19 10:19 ID:???
perlで作成したHTMLファイルを保存させたくて
今はVBSでやってますがあまりうまくないんで、
何かいい方法ないでしょうか?
21nobodyさん:03/03/19 10:36 ID:???
>>20
ちゃんとしたやつをPerlで組む
22nobodyさん:03/03/19 11:25 ID:???
>>21>>20 の日本語を理解できたの?
23nobodyさん:03/03/19 12:08 ID:WfwFmo2+
質問です。
Data::Dumper より速いという Storable を使いたいのですが
うまくいきません。お使いの方、教えてください。
Storable.pm は CPAN より入手しております。
24nobodyさん:03/03/19 12:15 ID:???
>>23
どう使いたいのかわからんけど
とりあえずドキュメント
http://perldoc.jp/docs/modules/Storable-2.05/Storable.pod
2523:03/03/19 12:27 ID:???
use する以前に autosplit.ix がないと言われて、
で AutoSplit にてモジュールを分解して、 autosplit.ix などが
生成されたのですが、結局エラーになってしまいました。

用途は Data::Dumper のように変数をファイルに保存する事です。
2621:03/03/19 12:42 ID:???
>>22
20がやりたいことがよく分からんが
mimetypeを  application/octet-stream
とかにすればできるんじゃないの?
27nobodyさん:03/03/19 12:49 ID:???
>>26
やりたいことがわからんのに、できるって言っちゃうのもどーかと
287:03/03/19 13:12 ID:0vdjLWGs
>>8-14
ご指摘ありがとうございます。
1から勉強しなおしてきます。
29nobodyさん:03/03/19 13:37 ID:???
>>25=23
インストールに失敗してる可能性高し。
環境は?
30 ◆hMJAPH9PWA :03/03/19 14:54 ID:???
>>25
ビルドすらしていない可能性高し。
makeした?
31nobodyさん:03/03/19 19:17 ID:TkOxs7rI
print 10.1-1;
で結果が0.000000000000096

みたいな感じになるんですがこれってバグですか?
32nobodyさん:03/03/19 19:25 ID:???
>>31
仕様。実用上あまり問題にならないはずだが
有効数字は自分で意識して書かないといけない。
小数は一桁で良いのなら、表示はこうする。
printf "%.1f", 計算結果;
33nobodyさん:03/03/19 21:52 ID:???
>>31
どっか壊れてない?
34T女の竹田:03/03/19 22:31 ID:???
>>31
一瞬>>32みたいなこと思ったけど、よく読むと結果が一兆分の一ぐらいになってるじゃん。

10.1-10で0.0999999999999996になったけど、このことかな?

これは詳しく話すと浮動小数点がどうとかって話になるけど。
35nobodyさん:03/03/20 01:03 ID:jX8BFx3L
馬鹿げた質問で申し訳ないのですが
print "あいうえお";
print "かきくけこ";
print "さしすせそ";
これをまとめて書く方法ありませんでしたっけ?


????????????
あいうえお
かきくけこ
さしすせそ
???????????
こんな感じの関数があった気がするんですが・・・
36nobodyさん:03/03/20 01:16 ID:???
関数というか、
print "あいうえお\nかきくけこ\nさしすせそ\n";
じゃだめなのん?
print join("\n",@array);
とかかなぁ...
37nobodyさん :03/03/20 01:25 ID:???
print <<EOF;
あいうえお
かきくけこ
さしすせそ
EOF

コレの事?
38nobodyさん:03/03/20 01:39 ID:???
>>37
おお、これですこれです
ありがとうございました
39nobodyさん:03/03/20 13:03 ID:???
user,passを元にFTPサーバへアクセスして
ある条件の名前のファイルを取り出す・・・
というのをperlでやることは可能でしょうか?
40nobodyさん:03/03/20 13:19 ID:???
可能です。
ちったー検索しろ。
4120:03/03/20 15:08 ID:???
>>26 (=>>21)
フォームの値からHTMLを出力して
そいつをCGI実行時に、ブラウザで表示せずに直接ダウンロードさせたかったってことなんですが
(なんか言い回しがややこしくなりますね…)

application/octet-streamで調べたらこれが見つかりました
http://tohoho.wakusei.ne.jp/lng/200003/00030606.htm
どうやら確実に動作しないようですね

#うちの環境でもMIMEType変更してもIEが強制表示しちゃいました

レスクスコ
42nobodyさん:03/03/20 15:31 ID:???
>>39
perldoc Net::FTP
入ってなかったら入れてくれ。

>>41
確実なのは、メールで送る。
43nobodyさん:03/03/20 17:33 ID:gyHuovPa
ド素人な質問ですが、ttp://www2.snowman.ne.jp/~nnet/ にある
テキスト広告用CGIを使うために
掲示板スクリプトの2行目に require "randbbs.cgi";を
付け足したらエラーになるんです。randbbs.cgiはちゃんと
存在するんですが、何がいけないんでしょうか?
4443:03/03/20 17:35 ID:gyHuovPa
訂正です。テキスト広告用CGIではなく
「広告配信CGIのランダムTEXT広告配信CGI」でした。
45nobodyさん:03/03/20 17:41 ID:???
じゃあ、require〜 の一文を消したら動くの?
4643:03/03/20 18:05 ID:gyHuovPa
>>45
はい。普通の掲示板のCGIなんで。
47nobodyさん:03/03/20 18:07 ID:???
>>43
そのCGI設置ページの説明(動かんときの対処法)はひととおり試してみた?

あとさあ、ここPerlスレなんだが。なんでCGIの質問するのよ?
48nobodyさん:03/03/20 18:10 ID:???
>>47
聞くまでもなかろう。
4943:03/03/20 18:18 ID:gyHuovPa
>>47
対処法はひとつだけ書いてあるんですが、だめでした。
パーミションやディレクトリの位置なんかもいろいろ試したんですが。
というかこれってPerlの話じゃないんですか?
違うんだったらやめます。ごめんなさい。
50nobodyさん:03/03/20 18:32 ID:???
>>43
>掲示板スクリプトの2行目に require "randbbs.cgi";を
              ~~~~~~
51nobodyさん:03/03/20 23:07 ID:???
>>49
色々つっこみどころが多いな……

>対処法はひとつだけ書いてあるんですが、だめでした。
その方法を試したのか、試してないのか。
ダメならダメでどのようにダメだったのか。
これらの情報が全く含まれていない。

>パーミションやディレクトリの位置なんかもいろいろ試したんですが。
どう試したのか。
やはりこれも情報がない。

>というかこれってPerlの話じゃないんですか?
このスクリプトはPerlで書かれているが、PerlはCGIのためだけの言語ではない。
なお、CGIには専用のスレッドがある。

最後に一番大きなつっこみを。
なんで2chで聞く? まず作ったところ(作った人間)に聞くのが筋だろうに。
52nobodyさん:03/03/21 03:15 ID:???
変数を変数名として使う場合(?)
$text = "テキスト";
$name = "text";
print "$$name";
でできるのですが、$textがmyで宣言されていると
これでは表示されなくなってしまいます。
解決法は無いでしょうか・・?
53nobodyさん :03/03/21 03:27 ID:???
>>52 $$name はリファレンスに取られかねないからハッシュを使うほうが賢いと思われ
%text = ('test'=>'テキスト');
$name = 'test';
print $text{$name};

みたいな・・・
54nobodyさん:03/03/21 03:50 ID:???
すみません;;
${$name}と訂正しておきます。
>53の説明していただいた方法も考えたのですが、
頑固ですが、変数名には変数は使うのはむづかしいでしょうか(T_T)?
5554:03/03/21 03:54 ID:???
書いたばっかりですみません、
ハッシュを使う方向でやってみる事にしました。
5653:03/03/21 04:00 ID:???
>>54 ${$name} それ、リファレンスの記述そのものですが・・・
57nobodyさん:03/03/21 06:25 ID:???
$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とするにはどうしたらよいのでしょうか?
58nobodyさん:03/03/21 08:33 ID:???
>>57
データ構造が思いっきり糞。
ハッシュ使え、ハッシュを。

$data{sousa}{1} = 捜査一課の情報;
みたいにすれ。
5953:03/03/21 08:34 ID:???
>>57
まず配列にする事ですな・・・

$sousa[1]=(捜査1課の名簿がHTMLのデータで書かれてます);
$sousa[2]=(捜査2課の名簿がHTMLのデータで書かれてます);
     〜
$sousa[99]=(捜査99課の名簿がHTMLのデータで書かれてます);

で、帰ってきたform文が%FORMに入るとした場合

$sousa[$FORM{'sousa'}]

で解決


60nobodyさん:03/03/21 11:34 ID:???
>>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.
61nobodyさん:03/03/21 14:55 ID:???
eucのファイルをsjisに変換したいんだけど

「読み書きモードでファイル読んでコード変換して
元のファイルにsjisで書き込む」

このやりかた以外にもっと効率的な方法知ってたら教えてください
62nobodyさん:03/03/21 15:16 ID:???
>>61
ファイルを変換するならそれしかないでしょ
6320:03/03/21 17:35 ID:???
>>42
おおおお
そいつはいいアイデアかも
それでやってみます
6461: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);
65nobodyさん:03/03/21 18:11 ID:???
binmode(FH);
6664: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);
67nobodyさん:03/03/21 18:42 ID:x5txFKZl
下の例以外でディレクトリ内のディレクトリ一覧を得るような
スマートな書き方は無いでしょうか?お願いします。

foreach ( readdir(DIR) ) {
 next if (/^\.\.?$/);
 push @hoge,$_ if ( -d "$_" );
}
68nobodyさん:03/03/21 18:57 ID:???
@hoge = grep { -d $_ } glob("./*");
69ミツマじゃぱん:03/03/21 18:59 ID:CvSagfqM
貴方は or || どっち派?
どうでもいいんですけどね。
70nobodyさん:03/03/21 19:06 ID:???
>>68
スマートです!どうもありがとうございました。
>>69
||派に一票。
71nobodyさん:03/03/21 19:12 ID:???
>>69
おいらはor派。
|| は、ビット演算子の | とまぎらわしい。
orは優先順位が最低になってるのも理由のひとつ。
72nobodyさん:03/03/21 19:17 ID:???
>>69
俺はorを使ってる。
oとrがビジュアル的に「小さくてささやか」なのが好みに合ってるから
・・・ってのは、ネタのようだけど結構本気な理由。
7357:03/03/21 19:33 ID:???
>>59
データを配列に書き換えました。
OKです。
ありがとうございました。

>>58
%kenkei = ("sousa1" => "捜査1課" , "sousa2" => "捜査2課");
って言う風に書き換えました。
$kenkei{'sousa1'}なら捜査1課と出るんッスが、
$kenkei{'sousa$sousa'}だとundefッス。
$sousaの値は1です。
後学のために、房な所教えてくだせぇ〜
74nobodyさん:03/03/21 19:39 ID:???
>>73
$kenkei{"sousa$sousa"}だと出るはず。
''の中では変数展開が行われないんだよ。
7573:03/03/21 20:47 ID:???
>>74
出来ました。
ありがとうございました。
勉強になりました。
76nobodyさん:03/03/21 21:34 ID:???
私もor派だなぁ。
深い意味は無く、ヴィジュアルで(笑)
77nobodyさん:03/03/21 23:05 ID:???
||とor。
優先順位が大幅に違うので要注意。
(orは最下位)
78nobodyさん:03/03/21 23:10 ID:???
$a = ($b or $c);
$a = $b || $c;

open FH, "file" or die;
open(FH, "file") || die;
79nobodyさん:03/03/21 23:52 ID:???
優先順位とか良くわからないんだけど
片方固定でしか使わない場合は関係ないの?
80nobodyさん:03/03/22 00:24 ID:???
>>79
優先順位は他の演算子との関係を考えないと
81nobodyさん:03/03/22 00:25 ID:???
>>79
1+2*3 の答えを、9と答えるか7と答えるかほどの違いがある。
82nobodyさん: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/) {# タイムアウト時

# 行った処理のプロセスを切る処理

}
}
83nobodyさん:03/03/22 06:43 ID:???
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1:ちょっと大きいCGIなので、負荷を軽くしたい。(CGIです)
2:実行全体にロックをかけて、同時刻に複数人数が処理できないようにしてみたが…
3:それだと、本当に負荷が軽減されてるのか確かめようがなかった。

同時に実行されてない場合は、ちゃんと軽減されてますか?
84nobodyさん: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は全く変化しません。
なぜでしょうか?
8584:03/03/22 07:31 ID:35k142Il
>my test = 'affaaffaaafaaaafaaaaafaaaaaafffaf';
もちろん、
my $test = 'affaaffaaafaaaafaaaaafaaaaaafffaf';
の間違いです。
86nobodyさん:03/03/22 07:36 ID:???
my ($test) = 'affaaffaaafaaaafaaaaafaaaaaafffaf';
じゃねーの?
87nobodyさん:03/03/22 07:38 ID:???
>>84
my $test = 'affaaffaaafaaaafaaaaafaaaaaafffaf';
$test =~ s/a{2,5}/X/g;  ←{ }の中にスペース入れちゃダメ
print $test."\n";
8884:03/03/22 07:39 ID:35k142Il
>>84
my $test = 'hoge';
は問題ないず。
my $hoge, $foo = split(/\./, 'hoge.foo');
は、
my($hoge, $foo) = split(/\./, 'hoge.foo');
と書く必要があると思いますが。
どうでしょう?
8986:03/03/22 07:40 ID:???
かぶったね。

ん〜。なんでだろ。分からん。
ちなみに、この記述はperl5未満では使えないよ。
9084:03/03/22 07:40 ID:35k142Il
>>87
うお、できました。
スペースは無しでしか..
ありがとうございました。
91nobodyさん:03/03/22 07:41 ID:???
>>88

× my $hoge, $foo = split(/\./, 'hoge.foo');
○ my($hoge, $foo) = split(/\./, 'hoge.foo');
9253:03/03/22 08:54 ID:???
>>84
>my test = 'affaaffaaafaaaafaaaaafaaaaaafffaf';
$test だろ $抜けとる・・・・
93nobodyさん:03/03/22 10:28 ID:???
>83
同時実行されていない場合は、ロック処理の分負荷は増えている。

で、この部分は読んでないのかな?
>いらっしゃーい、Perlの"コーディング"で困ってる人のスレです。
94nobodyさん:03/03/22 16:05 ID:???
>92
一部だけ読んで適当に返事するのイクナイ
95nobodyさん:03/03/22 16:40 ID:???
>>82
パイプつきoopenでPIDを取得しておいて、必要に応じてkill関数で殺す
…と思ってやってみたらうまく行かなかった(お。
96nobodyさん:03/03/23 08:51 ID:???
<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で同じだから上書きされているんだと思うのですが、どう回避していいのかわかりません。
97nobodyさん:03/03/23 09:01 ID:???
>>96
ひとつ。それのどこがPerlの話なんだ?
ふたつ。cgi-lib.plを使っておきながら、自前でデコード処理してんのか? もしそうならとんでもないヴァカだな。

解決策
・CGIのことはCGIのスレに行け。
・cgi-lib.plの最新バージョンとその正しい使い方を学べ。
これで解決。
98nobodyさん :03/03/23 09:08 ID:???
>>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="まぐろ">まぐろ

等とやって処理を考えないと駄目
99nobodyさん :03/03/23 09:09 ID:???
>>97一応perlでしょ・・・ハッシュの扱いの問題だし
100nobodyさん:03/03/23 09:34 ID:???
>>96
checkboxは、複数選択すると

sakana=あじ&sakana=たい&sakana=まぐろ

みたいに同じnameが複数来るんだよ。
これが分かればあとはなんとかできるでしょ。
10196:03/03/23 09:50 ID:???
>>97-100
解決しますた。
特に>>97さん、&ReadParse;で桶でした(滝汗)

===以下言い訳===
最初はcgi-lib.pl使ってなかったんだが、複数選択が必要になり、ぐぐったらcgi-lib.plの&SplitParamでできるってので使い始めたわけ。
ヴァカでした。
CGIとPerlの区別も含めて
102nobodyさん:03/03/23 10:59 ID:???
$hogeにHTML文書が入っていると思われ
その中にいくつもある<a href="mailto:メアド">名前</a>を
名前=>メアドのハッシュを<title>タイトル</title>の
タイトル.txtで残しておきたいんだ。
教えてくれ。
できればタイトル.txtをサーバに保存やブラウザに表示するのではなく、ダウンロードさせたいのだが漏れにはさっぱりだ。
教えてくれ。
103nobodyさん:03/03/23 11:30 ID:???
>>102
ハッシュにするのはこれでいい?
%hash = reverse $hoge =~ /<a href="mailto:(.+?)">(.+?)<\/a>/ig;

ただ、HTMLのタイトルをファイル名にする場合、ファイル名が日本語になってしまう
可能性がある。OSによっては日本語ファイル名を作れなかったりといろいろ問題が
あるので、回答は省略。

ダウンロード云々はCGIの話になる。スレ違いになるのでこれで勘弁な。
104nobodyさん: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
}

笑わないでください。生まれてすいません
105nobodyさん:03/03/23 18:53 ID:???
いろいろ回答はあると思うけど、俺だったら

$hour %= 12;
$jikoku = sprintf("%02d:%02d", $hour, $min);
print "$jikoku\n";

>笑わないでください。生まれてすいません

卑下しすぎ。そんなくだらん質問でもない。
106nobodyさん:03/03/23 18:53 ID:???
$mod_hour = $hour % 12;
printf("%02d%02d",$mod_hour,$min)
107104:03/03/23 19:33 ID:???
>>105-106さん
ありがとうございます!
パっと見て理解できる能力が、まだないですが
時間がかかるので先にお礼を言わせてください。
メモってお勉強の材料にさせてください、すいません。
ありがとうございました。
108nobodyさん:03/03/23 21:17 ID:???
>>101
理解して学習する能力があるなら十分だね。
ヴァカなのはやりかたであって、本人じゃない。
気を悪くしてたら謝るよ。
109nobodyさん:03/03/24 18:08 ID:JKyHEx6G
質問です.

CGI で HTML のデータを標準出力するようなものを
実行したときには,その HTML が WWW ブラウザに
表示されるのでしょうか?
110nobodyさん:03/03/24 18:16 ID:???
>>109
HTTP-Header を無視した話であるならば、Yes。
111nobodyさん:03/03/24 18:19 ID:???
…などとマジ回答してしまったが、ここ Perl スレじゃんか。
CGIスレに行ってください。>>109
112109:03/03/24 18:21 ID:JKyHEx6G
失礼しました
CGI スレであらためます
113nobodyさん:03/03/24 19:52 ID:???
>>108
これからもビシビシと厳しくご指導ご鞭撻のほどよろしくおながいします。
114nobodyさん:03/03/25 00:41 ID:???
標準入力の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できたのですが。
これは仕様でしょうか?
115114:03/03/25 00:44 ID:???
間違いました
seek STDIN, -1*($ENV{'CONTENT_LENGTH'}) ,1;
116nobodyさん:03/03/25 00:48 ID:???
>114
$ppp = $str;
これでダメなわけを教えてくれ。
117nobodyさん:03/03/25 01:08 ID:???
ストリームはseekできないのでは?
118nobodyさん:03/03/25 08:22 ID:???
モジュールでもよんでんだろ
119nobodyさん:03/03/25 10:16 ID:ZJloW8nf
時間によって、特定のディレクトリ以下にアクセスできないように
したいのですが、Perlでできますか?
120nobodyさん:03/03/25 10:58 ID:???
>>119
OS は?ファイルシステムは?
誰に対してアクセス制御を行うのか?
自分以外?自分もアクセスできないの?
そもそもローカルの話?もしかして HTTP?それとも FTP?

… Perl でどうこう言う前に、定義すべき条件があるだろが。
1214:03/03/25 10:59 ID:4EHffvQl
>>119
何がアクセスできないようにしたいのか分からない。
Apacheなら無理だろ。
122nobodyさん:03/03/25 11:18 ID:???
>>121
いや無理でもないさ。
chmod 仕組んだ Perl スクリプトを cron でまわすとか。
.htaccess 更新するような Perl スクリプトを cron でまわすとか。
下位のディレクトリを全て 0700 にしといて、CGI 経由しないと
参照できないようにするとか。# 要 suExec

もっとも、>>119 が自分のWebサイトにおけるアクセス制御を
やりたがたっている、とは限らない罠。
123119:03/03/25 11:32 ID:???
>>120
>>121
>>122
説明不足ですいません。
プロバイダの共用サーバーで、自分のWebサイトの特定のディレクトリ
に対してやりたいです。すいません。
サーバーの情報は、今見たんですが書いてないのですが、@niftyの会員が
普通に無料で使えるやつです。すいません。
.htaccessは使用できないようです。すいません。
ただ、ちょっとPerlからズレますが、shスクリプトでchmodコマンドが使える
って書いてあります。
シェルスクリプトはわからないので、Perlでしたいです。すいません。
suExecていうのを知らないので、調べて見ます。
すいませんありがとうございます
124119:03/03/25 11:51 ID:???
何度もすいません。
suExecというのは、サーバーにインストールするもののようですが
どうやら、無いようです。
たとえば、「0-7時の間は、このディレクトリにはアクセスできない」
というのを自動で実行させるようなことをしたいのです。
nobodyさんに対してです。よろしくお願い致します。
125nobodyさん:03/03/25 12:10 ID:???
もう、Perl とは関係ないような気がしてるんだけど、
とりあえず、アクセス制御をかけたい「コンテンツ」を全てCGI化すれば
お望みの効果が得られるかと。

ただし、>>119 のサイトが人気サイトでアクセス数大ならお薦めできない。
126nobodyさん:03/03/25 12:20 ID:???
「すいません」をたくさん書けばいいってもんじゃない。
127nobodyさん:03/03/25 13:13 ID:???
特定の日付の1日前を求めるにはどうすればいいでしょうか?
128nobodyさん:03/03/25 13:19 ID:???
$date = 25;
$date = $date - 1;
129nobodyさん:03/03/25 13:26 ID:???
>>127
use Time::Local;
130nobodyさん:03/03/25 13:28 ID:beWiS6Gq



神  の  ホ  ー  ム  ペ  ー  ジ


        http://mypage.naver.co.jp/2ko657ih/

131nobodyさん:03/03/25 13:30 ID:???
>>128
それは無理…。

>>129
Time::Localでどうやってとれますか?
132nobodyさん:03/03/25 13:54 ID:???
>>131
ググれ!バカチン
133nobodyさん:03/03/25 14:00 ID:???
>>127特定の日にちって何?
$dayに特定の日にちが入っていれば>>128でOK
timestampだったら24*3600を引けばいい。
134nobodyさん:03/03/25 14:04 ID:???
>>133
年月日でしょ。
Time::Local でググりゃ答え一発。
135nobodyさん:03/03/25 14:19 ID:???
>>133
$year = 2002
$month = 1
$day = 1
これの前日とか。
136nobodyさん:03/03/25 14:29 ID:???
timelocalでUNIXtimestampにして24*3600秒引いてlocaltimeで戻す。
1374:03/03/25 14:30 ID:4EHffvQl
>>122
>chmod 仕組んだ Perl スクリプトを cron でまわすとか
たしかにそうだ。
cronが使えるかが問題だが。
>>119
perldoc -f chomd
138名無しさん@Meadow:03/03/25 17:29 ID:???
>>123
これはどう?朝7時に起動すれば、0時から7時までアクセスできなくなる?
while (1) {
sleep 60*60*17;
chmod 0700, 'foo';
sleep 60*60*7;
chmod 0755, 'foo';
}
139nobodyさん:03/03/25 17:52 ID:???
>>138
Nifty って shell 使わせてくれるの?
じゃなければ、suExec 未導入だし無理でない?
foo の owner を nobody にしたら意味無いし。
140nobodyさん:03/03/25 19:15 ID:dPveVoYX
全くの初心者じゃないけど,ちょっとつまづいてる人には
「達人が教える〜Perl/CGI道場」
http://www.amazon.co.jp/exec/obidos/ASIN/4844317423/qid=1048586885/sr=1-2/ref=sr_1_2_2/249-9931188-3133920
と,もう一冊推薦図書はないでつか?
(「かんたんPerl/CGI入門」は持ってまつ。)
141nobodyさん:03/03/25 19:31 ID:???
1:チャットで「ポ」、「ー」等を特殊表示してみたい
2:$com =~ s/ポー/<font color="yellow">テスト<\/font>/g ;
3:それだと、インターナルサーバーエラーが出て動かなかった。

です。
本来出来ないことは分かってるんですが,どうにかならないでしょうか?
御願いします。
142nobodyさん:03/03/25 19:34 ID:???
>>141
2:$com =~ s/\Qポー\E/<font color="yellow">テスト<\/font>/g ;
143nobodyさん:03/03/25 19:35 ID:???
>140
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/

>141
$com =~ s/\Qポー\E/<font color="yellow">テスト<\/font>/g ;
144nobodyさん:03/03/25 19:54 ID:???
「ポ」と「ー」を分けるのなら、142,143のではダメね。
でもここまでヒント出してあればできるでしょ。
145nobodyさん:03/03/25 19:55 ID:???
>>141
もっと根源的な解決方法としては、EUCコードで書くと言う手がある。
それなら、スクリプトを変更する必要はなくなる。
146102:03/03/25 20:11 ID:???
>>103
遅レススマソ
メアドの件OKでした。
タイトル.txtで保存の件、メアドの件の応用で試しにやってみたらOKでした。
ダウンロード云々の件は日を改めて後日。
147nobodyさん :03/03/25 22:12 ID:???
エポックタイム使えない場合でモジュール使えないのであれば、ユリウス時間を使えばとかいってみるテスト
148nobodyさん:03/03/25 22:44 ID:hk3KdRHA
>>139
そうか。不便だね。>niftyサーバ
149nobodyさん:03/03/25 23:18 ID:???
すまん、ちょっと聞きたいんだけどさぁ
cgiとか作りたいと思ったら本買った方がいいかなぁ?
150nobodyさん:03/03/25 23:24 ID:???
>149
まず、配布されてるスクリプトの中身を見て、改造から入る。
次に、Perl関連の紹介などをしてるサイトを回り、基本的なことを覚える。
作るだけならこれで十分。

買うに越した事はないけどな。
151nobodyさん:03/03/26 02:01 ID:???
>>149
プログラミングを他言語でしたことあるなら
別に買わなくても良いかと

初めてなら、とりあえず文法覚えり
とほほとかで
152nobodyさん:03/03/26 02:41 ID:???
紙媒体がある方が覚えやすいような気がするのは、俺の気のせい。
153nobodyさん:03/03/26 05:13 ID:???
すみません。
「ハッシュのキー」が同じなら真を返す。とかそんな技ないでしょうか?

$abc{'aaa'} eq $efg{'aaa'};  #これを真にしたい。(と言うか同じキーかどうかが分かればOK)

もしかして、無茶言ってますでしょうか?
154nobodyさん:03/03/26 05:24 ID:???
キーが・・・

定数同士なら見りゃわかる。条件式にかけるまでもない。
変数ならその変数同士を比べればよいのでは?
155nobodyさん:03/03/26 08:28 ID:???
>>153
そういう比較をする場面がよくわかんない。
とりあえず>>154と同じ意見。
156nobodyさん: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はこれ!」て
定義したいです。
157nobodyさん:03/03/26 10:53 ID:???
$aaa= 0..79;
これってどういう振る舞いをするの?
@aaa=0..79なら0から79までを配列に入れるんだけど。
158nobodyさん:03/03/26 10:57 ID:???
>>156
意味がわからん……

配列初期化のときにダミー(undefか空文字列)を入れておいて、値のほうを制限。
またはハッシュを使うとか。

%bbb = ( 0=>'あ', 1=>'い' );
159nobodyさん:03/03/26 11:31 ID:???
>>156
質問の意味がわからんので、そもそも何をしたいのかを書いてください。
160nobodyさん:03/03/26 11:33 ID:???
もしかしたら、こういうことか?
@bbb[0,7,9] = qw(a b c);
161nobodyさん:03/03/26 11:39 ID:???
>>156
> 0と7と9だけ割り当てたいとか、

$bbb[0]=0; $bbb[7]=7; $bbb[9]=9;
これじゃだめなのか?
162156:03/03/26 11:50 ID:???
>>157-161
さむくすでつ!

>158
できた!マヂでできました!超うれしいよ!ありがとう!
質問がおかしくてスマンかったです。

$aaa= $ccc % 80;
の動きをするものです。
>158のやり方ででけました。ありがとう!
そうか!配列じゃダメなんですね!すごいよ!

>>160-161
後で試してみます。qwとかわからないので、本見てみます。
本当にありがとう!やた!やったー!

2chスゴイよ!毎日来ていいでつか?ありがとう!
163156: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}";

動かないでつ
何がいけないでつか
この事態によく遭遇するんで、困ってまつ。
ハッシュのリストの中で、演算しをつかいたいです。使いたいです
範囲を指定したいんです。したいです
これさえできれば、僕のやりたいことは全部できるんでつ
泣きそうでつ。
164nobodyさん :03/03/26 12:54 ID:???
>>163
print "$bbb{aaa}";

print "$bbb{$aaa}";

もうちょっと落ち着け・・・
165nobodyさん:03/03/26 14:13 ID:???
>>163
なんでif文を使いたくないの?
最初の質問もそうだけど、何をしたいのかがわからないのよ。
せめてどういう結果が欲しいのかをきちんと提示してくれ。
166nobodyさん:03/03/26 14:37 ID:???
>>163
これで満足か?

map { push @ddd, 'あ' } (0..7);
map { push @ddd, 'い' } (8..15);
map { push @ddd, 'う' } (16..79);

print $ddd[$ccc % 80];
167nobodyさん :03/03/26 15:28 ID:???
>>165
学校の課題とかじゃないのか?(w
168nobodyさん:03/03/26 15:55 ID:???
んー、でも春休みだぞ?
169nobodyさん:03/03/26 16:59 ID:???
補講だろ(w
170nobodyさん:03/03/26 17:21 ID:SzbA3L14
if ($#past > $log_line) {

この$#pastって意味わかる?
#っていうのはそのあと全部無効にするんでしょ?
なにか特別な表現?
171nobodyさん:03/03/26 17:31 ID:???
>>170
Perl の 配列について調べてみればすぐわかる。
ぜひ自分で答えに辿りつかれたし。

検索キーワードは、Perl 配列 インデクス、かな?
172nobodyさん:03/03/26 17:45 ID:SzbA3L14
>>171
ありがと。
ぐぐってくる。
173163: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
となっています。

原因と対処をご指導ください。
宜しくお願い致します。
175nobodyさん:03/03/26 18:37 ID:???
>>174
パーミッションは?
ファイルの先頭に./(ドットスラッシュ)つけてる?
176座敷荒氏:03/03/26 18:51 ID:SqsuYLcB
パーミッションは-rwxrwxr-xとなっていて
一般ユーザー権限で試しています(言い方あってますか?)

>ファイルの先頭に./(ドットスラッシュ)つけてる?
つけていません。参考書に記載がないので。
これはどこに記述すればいいのですか?
#! /usr/bin/perl の先頭に記載して
./#! /usr/bin/perl
とすればよいのでしょうか?
177nobodyさん:03/03/26 18:52 ID:???
$ chmod u+x calc
$ ./calc
ってことだな。
つまり、Perl より先に Linux の勉強をしる、ということだ。
178座敷荒氏:03/03/26 18:56 ID:SqsuYLcB
あ、できました。
ありがとうございます。

言い訳になりますがRedHatも
こないだPerlのために用意したばかりで
勉強不足でした。

なぜこれでOKなのかは自分で勉強したいと思います。
本当にありがとうございました。精進致します。
179nobodyさん:03/03/26 19:16 ID:???
>>173
ifって重いの?
180nobodyさん:03/03/26 19:27 ID:???
>>179
少なくてもwebprogでifが重いとかいってるやつは、
短絡的で思い込みが激しくて相対的な思考ができない馬鹿。たいていA型
181nobodyさん:03/03/26 20:29 ID:???
ifが重い・・・分岐はパイプライン処理を阻害するらしいが、こういう分野でそんなこと気にしていたら
やっていられないよな。それにPerlならユーザの知らないところでたくさんの分岐を行っているはずだ。
182nobodyさん:03/03/26 21:09 ID:???
ifを使って処理が複雑になるなら、使わない方がいいだろうけど。

アホには妙な先入観があるんでしょう。困った。
183nobodyさん:03/03/26 21:15 ID:???
>>173
mapは戻り値を捨ててはいけないぞう。ぷぅ。

構造は、map BLOCK LIST、返り値は、LISTの各要素についての、
BLOCKの結果のリスト。
184nobodyさん:03/03/27 00:54 ID:8Ff5snZV
Perlの事を詳しく知りたいので勉強始めたのですが、正直どこ
から初めていいかよく分からなくなってきてしまいました。

MacOSXを仕事の関係で自宅でも使用しているのでperlは使え
る状態まで設定が終わり、Perlの解説本(とほほWWW入門)
を買ってきたのですが、理解が浅く、自分のやってみたい事
はあたまには浮かぶが、実際にperlで書けない状態です。

慣れるにはどのようにしていったらよいのでしょうか?
本当に困ってます。
馬鹿ですみません。
185nobodyさん:03/03/27 01:02 ID:aF0pcOGY
漏れも初心者です。
とほほWWW入門がどんなのか知らないけど
初めから読む。
本に書いてあるプログラムを実行する。
分からなかったらそれを書き換えて自分が納得するまで
いじる。ってのをしてます。
独習Perl読んでる。

186nobodyさん:03/03/27 01:17 ID:???
>>185
そうなんですよね。
どうしても仕事で使うので、いろいろ必要な所をかいつまんで
いるのですが、時間が足りなくもうなんかダメダメになりそう
です。マジで泣きながらキーボード打ち込んでます。

今は使えそうなフリーの素材を使って少し命令をいじって自分
のマシンでテストしています。

俺には向いてないのかなぁ。このままじゃあ、クビになるかもし
れない、でも、ここの皆さんはできている人が多いみたいだし。

生き残るなんてできないのかなぁ。

愚痴になってごめんなさい。
もうちょっと頑張ってみます。
187nobodyさん:03/03/27 01:23 ID:???
いい勉強法があるといいよね。
要するにその「いい勉強法」にたどり着けるかどうかが分かれ目なんだろうなと思う。。
188鯖仙人 ◆HwSabaHQjA :03/03/27 01:36 ID:???
>>186
ある程度のレベルに達してないとセキュリティ面で穴が空きそうだのう。
もしもの事があればおおごとじゃから諦めなされ。
だからと言ってフリーのものを少々b改造して著作権表示を
すり替えたりせんようにな。社会人としてのルールじゃ。

ここの板が過疎化している通り、webprogを自在に操れる人々は
ネット人口に対してはごく一部じゃ!まだ遅くはないぞ!
何事にも近道は無い。じっくり、まったり勉強なされ。
189鯖仙人 ◆HwSabaHQjA :03/03/27 01:42 ID:???
そうそう忘れておった。perlのセキュリティを学ぶには
技術評論社の「プログラミングによるセキュリティ強化ガイド」がまあまあいいぞえ。
自分の能力を向上させる為なら金は惜しむな。先人の偉大なる著作物を手に入れるのじゃ。
190nobodyさん :03/03/27 02:53 ID:???
というか・・・
とほほな人がイタタな人だから心情的にはお薦め出来ないってのはある。
それに、perlの参考書を買うのもいいのだけどその参考書は二次生成物だから
本の駄目なレベルまでわかるレベルになればマスターした事になると思われ
そいうことで、本としてお薦めは駱駝本になるのだけどね。

別に本を買わなくてもウェブ上で転がってる資料でも問題無いし、
別に本を買ったからといって覚えれる物でもない。
191141:03/03/27 14:57 ID:???
>>142->>145
ありがとうございます。
出来ました。
192173:03/03/27 18:19 ID:???
ひどいよ!みんな!

条件分岐させるのがいい場合もあるだろうけど、
最初から「これ!」て定義したいものには、if文とかより
もっと効率のいいやり方があるんじゃないかって思っただけだよ!
僕はO型でつ。
バカだけど、バカにされると一応悲しむだけの感情はあるんだぞ!

>>184
戻り値とか返り血とか何でつか
簡単な式でも略して書かれるとわからないレベルでつ
ひもとけないのでつ
ていうか、僕の所有する5冊のPERL本では簡略化されたものは出てこないので
順をおって書かれてないとわからない。わからないー

ほんとにお願いします。
いっこづつ解説してください。心からお願いします
193nobodyさん:03/03/27 18:23 ID:???
>>192
その話し方じゃ教えたくないと思うのはオレだけじゃないはず。
194nobodyさん:03/03/27 18:38 ID:???
>>193
禿同
195nobodyさん:03/03/27 19:04 ID:???
レス番くらい間違えないでください。
196nobodyさん:03/03/27 20:16 ID:???
>>192
Perl流の省略の仕方が理解できない分際で、
if文が重いとかほざくな。

足し算ができない奴に掛け算ができるわけがない。
自分が理解できてることだけでスクリプト組んでろ。
197nobodyさん:03/03/27 20:43 ID:???
>196

いいこというなぁ。

漏れも頑張るか・・・。
198nobodyさん :03/03/27 21:58 ID:???
というか、
map使うのが一番メモリー食うらしいですけどね・・・

>>192
まぁ、順序追ってその時その時で覚えた関数がどう使えるかというのを理解しつつ
やっていくとよいと思うけどね。

いっぺんに効率の良い処理を書こうと思ってもそれは無理だから一度ソース書いて
それがどうやれば見やすくなるかって考え方で逝くほうがいいと思う
199名無しさん@Meadow:03/03/27 22:06 ID:???
>>198
いいこと言うなぁ。
これで決まりや。
200nobodyさん:03/03/27 23:06 ID:AfQiNFrt
perlを使ってウエブのテキストエリアの部分に文字を
挿入する事ができるんでしょうか?
201nobodyさん :03/03/27 23:15 ID:???
>>200
SSIでないかい??
202nobodyさん:03/03/27 23:18 ID:???
<textarea>文字</textarea>
でいーじゃん
203nobodyさん:03/03/27 23:25 ID:???
>>201
うーんと、ちょっと違うかもしれません。

要は今見ているページのテキストエリアにperlのgetもしくは
postで任意の文字を入れる事がperlが動作するマシンから実行
できるのかなという事なんですが、説明がうまくできなくてご
めんなさい。
204nobodyさん:03/03/27 23:31 ID:???
?????
205nobodyさん:03/03/27 23:35 ID:???
>>204
うまく説明ができない・・・。

ブラウザからgetやpostで情報を受け取る事ができるなら、
ブラウザのテキストエリアに送る事もできるのでしょうか?
206nobodyさん:03/03/27 23:35 ID:???
>perlのgetもしくはpost

アホですか?
207nobodyさん :03/03/27 23:38 ID:???
>>205
よーわからんけどssiじゃないのそれ?
208nobodyさん:03/03/27 23:41 ID:???
>ブラウザのテキストエリアに送る

全然わかんない
209nobodyさん :03/03/28 00:07 ID:???
Javascriptのお仕事だな。
210nobodyさん:03/03/28 00:12 ID:???
>>206
すみません・・・。
どこがアホなんでしょうか?

教えてください
211nobodyさん:03/03/28 00:13 ID:???
>>205
は、基本的なHTTPプロトコルを学ぶべき。

HTML文書のフォームから送ると言うことは、FORMタグのアクションに指定されたページに飛ぶのと同じ。
212nobodyさん:03/03/28 00:16 ID:???
>>210
うまく説明できないなら、まず
言いたいことを整理するか、
やりたいことの具体例を示しなさい。

別にあせらんでもこのスレは逃げません。
213nobodyさん:03/03/28 00:21 ID:???
>>212
とりあえず思いついた例として
掲示板に書き込みをする際にブラウザを使った書き込みではなく
自分のマシンからperlにて書き込みができないのかなと。

こういう感じでよろしいのでしょうか?
214nobodyさん:03/03/28 00:25 ID:???
>>213
できます。
HTTPをしゃべるスクリプトを書きなさい。
以上。
215nobodyさん:03/03/28 00:36 ID:OXxoJAYf
>>214
ありがとうございます。

見よう見まねですが自分で作った掲示板に、自分で作った
perlで書き込みができるのかテストしてみます。

もしよろしければそのhttpをしゃべるスクリプトの例とい
うのがどのように探せばあるのか、教えていただけません
か?

よろしくお願いします。
2164:03/03/28 00:40 ID:JsShpJ/5
>>213
できます。
HTTPとSocketモジュールの使い方勉強したらすぐできる。
217nobodyさん:03/03/28 00:42 ID:td6NGscT
2184:03/03/28 00:43 ID:JsShpJ/5
219nobodyさん:03/03/28 00:50 ID:???
>>216
どうもありがとうございます。

長々と説明を続けてしまって申し訳ありません。
アホなので、許してください。

早く皆さんのように質問に答えられるようにスキル
を身につけてみます。

もしその前に挫折して聞きに来る事があるかと思い
ますが、よろしくお願いします。
220nobodyさん:03/03/28 00:51 ID:???
>>215
荒らしにつかわれることを懸念してか、
POST のサンプルスクリプトは、あまり見つからない。
# まあ、これは俺の検索が甘いだけかもしれんが

書き込むだけなら GET でも可能だし、これなら
Perl Socket HTTP あたりをキーワードにして検索すれば
いくらでも見つかる。
GET で HTTP での会話を知ってしまえば、POST だって簡単。

tcpdump に類するツールを所有しているなら、
それでWWWブラウザとHTTPサーバとの会話の様子を
覗いてみるのもお薦め。

>>218
oioi
221nobodyさん:03/03/28 01:08 ID:???
>>214
簡単なサンプルならlwpcookにもあるんじゃない?
perldoc汁
222211:03/03/28 01:10 ID:???
ごめん。まちがった。
s/214/215/
2234: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つけて、ヘッダと
ひとつ空行あけて送るデータを書けばいいだけです。
2244:03/03/28 01:32 ID:JsShpJ/5
どうでもいいが
HTTP プロトコル
と書くのは、
Perl言語
と書くのと同じだと思う。
225nobodyさん:03/03/28 01:33 ID:???
>>221
perldoc厨死ね
226nobodyさん:03/03/28 01:43 ID:???
LWP使え。
227nobodyさん:03/03/28 02:00 ID:OFR1eFyu
質問です。
ネット上のページを取得するのに、LWP::Simpleとwgetを使う方法があるとのことで、
それぞれで実際に取得するところまで漕ぎ着けました。
対象ファイルのサイズは20〜50kb程で、それぞれの実行時間はほぼ同じでした。
このスクリプトは共用鯖でCGIとして実行するので、負荷が気になります。
負荷の上ではどちらが良いのか、もしくは他の方法があるのか、お教えください。
228nobodyさん:03/03/28 02:05 ID:???
どうでもいいが
Perl言語
と書くのは、
チゲ鍋
と書くのと同じだと思う。
229nobodyさん:03/03/28 03:06 ID:???
>>228 へ?(色んな意味で)
230nobodyさん:03/03/28 03:46 ID:???
>>229
チゲ == 鍋
231nobodyさん:03/03/28 03:55 ID:???
どうでもいいが
Perl言語
と書くのは、
POP言語
と書くのと同じだと思う。
232nobodyさん:03/03/28 06:06 ID:???
早い話がどうでもいいスレ。
233nobodyさん:03/03/28 09:23 ID:???
ほんとすんませんが、お聞きしたいことがあります。
Perl5以上で記述された、「URL通知システム」どこにあるか知りませんか?
たとえば、あるページを見ている人が自分の携帯電話に、そこで指定されているURLをメールしたい。
そんなのなんですが、よく広告ページの携帯用出会い系サイトなんかで使われているやつです。
もし。公開しているところがあったら教えてください。
ほんとすんません・・・・・・・
234nobodyさん:03/03/28 09:30 ID:CxnPNSFm
>>233
こういうんじゃないのか。
http://r.gnavi.co.jp/Waiting/?id=g852000
235bloom: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;の数字をゼロにしたけど、うまくいきませんでした。
同じく数字を消してもみましたが、うまくいきませんでした。
どこをどういじれば良いのか分からないので、どうか教えては頂けないでしょうか。
237nobodyさん:03/03/28 10:10 ID:???
>>236
#15 を削除
#21 の「}」を削除
238236: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"; }
とでも書けば良いのでしょうか? それとも全然違う行に全然違う事を書けば良いのでしょうか?
何にしても初心者の私にはこれ以上は難しいでとても困っています。
どうか救いの手をお願いできないでしょうか?
239236:03/03/28 10:15 ID:???
237さん早速どうも有り難うございます。m(_ _)m
240nobodyさん:03/03/28 10:18 ID:???
>>236
CGI側ではブラウザを閉じたことを判別できないので、無理です。
JavaScriptを併用すれば可能かもしれない。が、これ以上はスレ違い。
241nobodyさん:03/03/28 10:18 ID:???
>>234
ありがとう御座います。
いいですねえ、こんなの。もっとシンプルに1っ子だけしか送れないやつでも良いんですけどね・
ええっと・・・・・そのですねえ・・・プログラムが置いてあるところが知りたいんですけど・・・・
すみませんが・・・・よろしくおねがいします・・・・・・
242nobodyさん:03/03/28 10:29 ID:???
>>241
スレ違い。
243nobodyさん:03/03/28 10:30 ID:???
ほんとだ!
244227:03/03/28 11:40 ID:???
スレ違いみたいなので「WebProg 初心者の質問」に移動します。
お邪魔しました。m(_ _)m
245236: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";でした。<(_ _)>
246nobodyさん:03/03/28 16:44 ID:I24HmqWV
たまに、html内に「%%HOGE%%」こんな記述を見るんですけど
これは一体なんの意味があるんでしょうか。
247kyo:03/03/28 17:25 ID:b4ccXG3w
BBSをperlで作っているのですが、レス機能の付け方が良く分かりません。
どこか分かりやすい解説が載っているサイト知りませんか?
248nobodyさん:03/03/28 17:29 ID:???
>>247
ログファイルに「スレ文」か「レス文」かを分けるなんらかの目印を入れる。
読み出しの時はその目印でレスかスレかの処理を分ける。以上。

他には書きようがない。
他人のBBSでも眺めれば?
249nobodyさん:03/03/28 18:02 ID:???
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でソートって感じに・・・

どのようにすればいいでしょうか?(説明へたですいません)
250nobodyさん:03/03/28 18:03 ID:???
あげ忘れましたすいません
251nobodyさん :03/03/28 18:45 ID:???
>>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";
}
252nobodyさん:03/03/28 18:52 ID:???
res有難うございます。
えっと、恥ずかしながら
@data= (
{fluit=>'apple',from=>'青森',price=>40},
{fluit=>'orenge',from=>'愛媛',price=>20},
{fluit=>'strawberry',from=>'茨城',price=>30}
);
これははじめて見たんで、何をしてるのか・・・調べてきます。
できれば弄るところが多くなると思うんで、そのままの構造でいきたいんですが、、、
2534:03/03/28 19:08 ID:JsShpJ/5
それは連想配列のリファレンスを配列として
扱っているのだと思います。違ってたらスマソ。
俺もこういうのちょっとガンバロ・・
254249:03/03/28 19:19 ID:???
}] } 0 ..$#data];

}} } 0 ..$#data];
こうですね。動作確認できました。

しかし、なにをやってるか調べてもわからないので、
どう組み込んだらいいのか・・・
この解説ページないですかねぇ
2554 ◆oIfBpVov3. :03/03/28 19:32 ID:JsShpJ/5
256nobodyさん:03/03/28 19:43 ID:???
>>255
有難うございます。勉強してきます。
257nobodyさん:03/03/28 20:35 ID:???
>>246
テンプレートファイルに特定の変数値を流し込むための目印みたいなもん。
s/%%HOGE%%/$hoge_value/;
で、変換しているとか。
258lanble:03/03/28 20:38 ID:iBaRMkHH
正規表記で日本語にマッチさせるにはどうすればいいですか?
text:<head><title>タイトルン</title></head>
があるばあい「タイトルン」だけに変更して表現するときはどうすれば
いいですか?あと
text:<head><title>titlen</title></head>
のtitlenにもマッチさせたいのですが、これらを正規表記一行で表現すると
どうゆうふうになるのですか?
259nobodyさん :03/03/28 20:51 ID:???
>>255
フォロー感謝。まぁ頑張ってくだされ
260nobodyさん:03/03/28 21:25 ID:???
>>258

http://www.din.or.jp/~ohzaki/regex.htm
これ読んでそれでもわからなかったら、
今度は正規表現のスレに行け。
261nobodyさん:03/03/29 00:45 ID:fHpTV+Jc
3年くらいperlをいじってなかったので、
初歩的な質問かもしれないですが・・・・・・・

パスワード制限するページで、

IDとパスワードでアクセス制限
(Basic認証でなく、<form>タグ内と<input tyle= text と passworsで)
して、ページを、
Apacheとperl5の環境でやりたいのですが、
どういう方法があるのでしょうか?

●<input type=hidden>で変数をやりとりする
●クッキーを使う

は知っているのですが、
これしか方法はないのでしょうか?
262nobodyさん: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
}
263nobodyさん:03/03/29 01:07 ID:???
>>262
HTMLの勉強からやり直して来い。
264nobodyさん:03/03/29 01:09 ID:???
>>261
セッションのキーはその何れかで残すしかない。
265nobodyさん: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}
266bloom:03/03/29 01:55 ID:i2vNq3FD
267nobodyさん:03/03/29 02:17 ID:???
>>265
なぜって、これ以外にもスクリプトあるんじゃないの?
単独のCGIじゃないでしょ
268nobodyさん:03/03/29 02:43 ID:wFiuyLe9
>>265
よく考えてから質問してくれ
269nobodyさん:03/03/29 05:52 ID:???
>>265
単純に$FORM{'frame'}のデコード処理がないからとか?
270nobodyさん:03/03/29 09:39 ID:???
前にも見たな。$FORM{} に自動的にフォーム内容が入ると思い込んでるソース。
271nobodyさん:03/03/29 13:11 ID:???
そういう楽がしたいんなら、PerlじゃなくてPHP使えってことだな。
後のことは知らんが。
272nobodyさん:03/03/29 13:35 ID:???
JavaにあるisSecua()メソッドのような、
通信がセキュアであることを判定するようなメソッドが欲しいと思い、
いろいろ環境変数などを探してみたのですが、ぜんぜん見付かりません。
どうやったら確実に判別できるのでしょうか。
もしかして、「https://から始まっていたらセキュア通信!」みたいにすればOKですか?
273nobodyさん:03/03/29 14:06 ID:???
>>272
isSecua() メソッドとは何をもって通信がセキュアであると判断するんだ?
あと、どこまでのセキュリティレベルを必要としてるんだ?自分で理解してるのか?

それに環境変数ごときで判断して良いなら SSL_* 変数をチェックすりゃ十分だろうし、
https:// から、なんてレベルなら SERVER_PORT でも見りゃいーじゃん。

Perl と関係ねーじゃん。よそ逝け。
274nobodyさん:03/03/29 15:06 ID:GyYYsUNO
今isSecuaメソッドをPerlで書いてるんだっちゃ。
そげなこといわんと、実装方法教えてくんろ。
275251:03/03/29 15:10 ID:???
>>272
perlにも汚染モードがあるけどどこまで使えるかはしらね・・・
つか、全部自分で責任もつのが本来のperlだし
276nobodyさん:03/03/29 19:16 ID:???
>>274 は、>>273 を読んでないのか?
何をもってセキュアだとするのか、定義を決めなければ実装もできんだろうが。
自分がやることやらないで他人に頼ろうとするな。
277nobodyさん:03/03/29 20:46 ID:rt7Ytb+z
文字コードをシフトJISに変換するのにjcode.plを使用して
$value = jcode::sjis($value);と記述しています。
同じことをEncodeモジュールで行うには
どういう風に書き換えたらいいのでしょうか。
一応グーグル検索して
http://www.cise.ufl.edu/depot/www/perl/pod/perljp.html
などを読んでみたのですが、よく分からなかったです;
すみません。
278nobodyさん:03/03/29 20:59 ID:NU31LA3c
>>227
>ネット上のページを取得するのに、LWP::Simpleとwgetを使う方法があるとのことで、
>それぞれで実際に取得するところまで漕ぎ着けました。

どうやるの??
279nobodyさん:03/03/29 21:11 ID:???
>>278
man wget

perldoc LWP::Simple

読め
280nobodyさん:03/03/29 22:17 ID:NU31LA3c
>>279
arigatou
281nobodyさん: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になってしまいます。
なんでだろう。
282nobodyさん:03/03/29 23:53 ID:???
>281
LWPが使えないから。

tu-ka,テストはローカルでやれ。
283nobodyさん:03/03/29 23:53 ID:???
>>281

まずローカル鯖でテストしてからやれや、ボケ。
284nobodyさん:03/03/29 23:56 ID:???
headerも無いな。

何でだろうも糞も無い。
285nobodyさん:03/03/30 00:01 ID:???
LWPが使えるかどうかってどうやって調べるの?
286nobodyさん:03/03/30 00:15 ID:???
使ってみる
287nobodyさん:03/03/30 00:15 ID:???
>>284
headerなんて必要ないだろ
288nobodyさん:03/03/30 00:15 ID:???
>>286
それだけかよw
289nobodyさん:03/03/30 00:21 ID:???
>>287

500エラーって事はHTTP経由だろ?なら要るだろうが。

>>285

#! /usr/local/bin/perl

print 'Content-Type: text/html', "\n\n";

eval {
require LWP::Simple;
};
if ( $! ) {
print $!
} else {
print 'OK'
}
290nobodyさん:03/03/30 00:25 ID:???
>>289
No such file or directoryこんなのでた。
291nobodyさん:03/03/30 00:54 ID:???
使えないといっても二つあるよな。
ないから使えないだけなのと、自分で置いても使えないのと。
292nobodyさん:03/03/30 02:38 ID:???
>>290
OKが出なかったんなら、エラーが出たってことだろ。
つまりないってことだ。少しくらい考えろ。
293nobodyさん:03/03/30 03:20 ID:DsnrZpx8
print "Location: http://192.168.1.00/index.html", "\n\n";
なんですけど、すごく遅くて困ってます。
他のマシンでやると速いんですが、自マシンでやると遅いです。
スペック的には一番速いんですが。なんででしょうか?
ご教示ください。お願いします。
294nobodyさん:03/03/30 03:40 ID:???
>>293
Perlとはなんもかんけーねぇじゃねーか!
問題の分類も切り分けもできんような奴はすんな!
スレ違い!
295nobodyさん:03/03/30 03:41 ID:???
>>292>>294
出てゆけ。
296nobodyさん:03/03/30 04:10 ID:???


春厨の季節でつね


297nobodyさん:03/03/30 04:11 ID:???


なんでも春のせいにする厨房の季節でつね


298nobodyさん:03/03/30 04:16 ID:???


「なんでも春のせいにする」と「特定の現象を春厨のせいにする」の違いが分からない厨の季節でつね。


299nobodyさん:03/03/30 04:45 ID:???
>>298
特定の現象ってなに?具体的に述べて。
300299:03/03/30 04:46 ID:???
聞き直す。
特定の現象とはどの現象を指しているの?
301nobodyさん: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からはちゃんと書き込めるんですけど…。
302nobodyさん:03/03/30 05:48 ID:pEUiOEbB
この頃、掲示板やそのた色々なcgiのソースを読み漁ってるんですが
結構巨大なcgiとかになってくるとサブルーチンからサブルーチンとか
ピョンピョン跳び回って、なかなか変数や配列の後を追えないと言うか
今、ココに格納されるべき変数は・・え〜っと何だっけ?アレ?
ってな具合になってしまいます。サブルーチンの引数の中にサブルーチンが
含まれててその引数にまたサブルーチンが・・見たいなことになるとマジで
混乱してしまいます。
何か良い方法はないでしょうか?
303nobodyさん:03/03/30 05:56 ID:???
エディターを変えてみ
304302:03/03/30 07:12 ID:???
以前、perlエディタスレを見て色々試してみて今はperl Edtiorってのを
使わせて貰ってます。変数エクスプローラーってのがあってサブルーチンや
各変数にピョンピョン飛べるのが凄く助かります。
305251:03/03/30 10:35 ID:???
>>302 構造化エディタを個人的には使ってるけど
sjisしか使えないのがネックだなぅ
306nobodyさん:03/03/30 11:31 ID:???
秀丸+尻。
307nobodyさん:03/03/30 11:40 ID:???
308nobodyさん:03/03/30 16:51 ID:???
perl初心者な者ですがIDについて質問です。

306 :nobodyさん :03/03/30 11:31 ID:[ コレ ]

こういう風に、毎回IPが一緒とは限らない実行側を
どのように判断して毎回同じIDを与えているのでしょうか?
判断材料としてはやっぱり IP、HOST、ブラウザなんかを読んで判定してるんでしょうか?
質問へぼくてすみません。
309nobodyさん:03/03/30 16:57 ID:???
IPと日付
310nobodyさん:03/03/30 17:34 ID:???
IPアドレスと日付と板ID
311nobodyさん:03/03/30 18:20 ID:???
>>308
Perlと何の関係が?

そのうち「Perl初心者な者ですがハヤシライスの作り方について質問です」なんていう
質問が来そうで鬱だ。
312nobodyさん:03/03/30 18:30 ID:???
>311
#! /usr/local/bin/perl

print "Content-Type: text/html\n\n";
print 'ハヤシライス';
exit;
313nobodyさん:03/03/30 18:36 ID:???
>>312
それなら

#! /usr/local/bin/perl

print "Content-Type: text/plain\n\n";
print 'ハヤシライス';
exit;

だろうよ。
314nobodyさん:03/03/30 20:04 ID:lN4HiIUc
perlのマニュアルを全文検索できるサイトはないでしょうか?
315nobodyさん: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;
316nobodyさん:03/03/30 20:46 ID:???
>>315
s/DATA/IN/g
317315:03/03/30 20:53 ID:???
>>316
ありゃ、おはずかしい・・・感謝です
318315: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 にロック/アンロックするには、どういう書式にすればいいのでしょう
319nobodyさん:03/03/30 21:34 ID:???
>>318
いや、仕組みを知るのが先だろう。
こちらのスレが参考になるかも。↓
http://pc2.2ch.net/test/read.cgi/php/1024795138/l50
320nobodyさん:03/03/30 22:14 ID:???
>>319
禿同

仕組みを理解せずにコピペで作ろうとするから、>>315みたいな単純ミスをする。
321nobodyさん:03/03/30 23:58 ID:???
>>314
http://search.cpan.jp/
ここなんかどうでしょ


で、私の質問ですが、
multipart/form-dataでデータを受け取って
CGI..PMでアップロードしようとしています。
で、
use CGI;
my $cgi = CGI->new;
こうした時点で/cgi-bin(実行path)にtmpファイルが作成されるのですが
これを回避することってできるんでしょうか?
あるいはせめてtmpファイル作成場所の指定をしたいわけです。
ご存知の方教えてください。

322nobodyさん:03/03/31 00:47 ID:???
>>321
$CGITempFile::TMPDIRECTORY = './your/lovely/dir';
323321:03/03/31 01:15 ID:???
>>322
それやってみましたがダメでした。

あと環境変数TMPDIRを見るようなので
値を設定しましたがダメでした。
http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm
-private_tempfiles

回避策としてFHをcloseしてやるとtmpファイルは消されました。
結局出力先指定は上手くいきませんでしたが・・。
324nobodyさん:03/03/31 02:28 ID:U3RJ6jN1
perlなるものに挑戦しようとおもっているのですが、Perl CGIを配布している方ってみんなUNIXなんですか?
UNIX環境で云々と書いているので、UNIXなんですかね。WindowsにActive Perlとhttpadじゃだめですか?
325nobodyさん:03/03/31 02:36 ID:???
試してからモノを言え。
326nobodyさん:03/03/31 02:48 ID:poa5fGTP
俺はWindowsにActivePerlとApacheだぞ。 気にするな
327nobodyさん:03/03/31 02:52 ID:???
>>324
挑戦って何に?
使うほう?作るほう?
328p0604-ip02sasajima.aichi.ocn.ne.jp:03/03/31 05:14 ID:E9hS93FY
guest guest
329nobodyさん:03/03/31 06:04 ID:???
自分のマシンがWindowsでもサーバマシンは殆どUNIXでしょ。
自分が初心者で、これからPerlをやっていこうとしてて、
使えるサーバスペースがWindowsしかないのなら、とりあえず
UNIXのサーバを借りた方が勉強楽だと思うよ。
330nobodyさん:03/03/31 06:19 ID:???
>>329
それはつまりサーバー上でテストしろという意味か?
331nobodyさん:03/03/31 06:24 ID:???
テストはローカルでおねげぇしますだ...
332nobodyさん:03/03/31 06:33 ID:???
専用サーバならOK?
333nobodyさん:03/03/31 07:03 ID:z41dsEAY
>>324
将来どこまでやる必要があるかによる。
素人が遊びでやるならWindows+AnHttpd+ActivePerlが簡単でいい。
情報も集めやすいし。

将来、顧客に提供するWebサイトを目標にするなら、すくなくとも
Windowsは避ける。定番のUnix+Apache+Perl だろうね。

敷居が低いからと言ってWindowsを採用すると、保守できないシステム
になり、無理やり保守しようとしてとんでもない人件費がかかったりします。
334nobodyさん:03/03/31 07:58 ID:???
いや、>>324 への回答は >>325 で必要十分だと思うぞ。
335nobodyさん:03/03/31 10:35 ID:???
336nobodyさん:03/03/31 11:21 ID:???
>>335
いや、違うけどまあいいぞ。
↓次どぞん。
337nobodyさん:03/03/31 14:00 ID:???
>>327
作るほうです。。
CGIの無料配布している方ってやっぱりUnixなんですかね?
338nobodyさん:03/03/31 14:16 ID:???
ソウデモナイヨ
Linuxとかの環境での動作確認はしてるだろうけど。
339nobodyさん:03/03/31 14:35 ID:9YoHT9pl
>>337
>>333 読んでないの?
340nobodyさん:03/03/31 15:37 ID:???
>>338
どの程度の確認でしょうか?無料HP(Unix)で動いたらOKぐらいでいいのかな?
341nobodyさん:03/03/31 15:55 ID:???
>>340
お前は誰だよ?元質問者か?
342nobodyさん:03/03/31 15:58 ID:???
>>341
違います。どの程度かなと思ってきいただけです
343nobodyさん:03/03/31 16:04 ID:???
>>340
動いたらOKとかいうより、Perlのバージョンに依存する部分があるか、
コマンドも使うならサーバによって使えないこともあるなど
書く前か書いてる最中にわかること。
344nobodyさん:03/03/31 16:14 ID:???
>>343
なるほどぉ。。。
ちなみにVine Linuxってやつでもいいんですか?あれならCD持ってるからインスコしてみようかなぁ、とおもうんだけど。
WinとLinuxのデュアルブートっていうのは問題ないんですか?
345nobodyさん:03/03/31 17:45 ID:???
>>344
スレ違いどころか板違い。とにかく、
 
 

      試  し  て  か  ら  モ  ノ  を  言  え。
 
 
 
346nobodyさん:03/03/31 17:56 ID:???
>>345
氏ね屑
347nobodyさん:03/03/31 18:17 ID:???
>>WinとLinuxのデュアルブートっていうのは問題ないんですか?
漠然とした不安をそのまま投げるなよー。

なんでもかんでも誰かに聞いて苦労をせずに済ませたいなんてのは
プログラマ向けな性分じゃない。
取りあえずそのユーザ側的思考から抜けれ。
348nobodyさん:03/03/31 18:45 ID:???
まぁ君はどうせ途中で投げ出すだろうから、
最初からやめとけってこった
349nobodyさん:03/03/31 18:59 ID:???
>>346
うっせボケ
350nobodyさん:03/03/31 19:02 ID:a8GlaiRt
疑問は、自分で解決するのが一番早い。普通は。
351nobodyさん:03/03/31 19:06 ID:???
Cafestaは、日本初のコミュニケーションポータルサイト
無料会員登録で、もれなく商品券が貰えるキャンペーン実施中!!
http://camellia16.fc2web.com/cafesta.html
352nobodyさん:03/03/31 19:09 ID:???
↓そろそろ、Perl の質問をしておくれでないかい?
353nobodyさん:03/03/31 19:20 ID:WQCBJdN9
特定のページ以外からの掲示板への直リンクを防ぐにはどうしたよいでしょうか?
354nobodyさん:03/03/31 19:24 ID:???
>>353
厳密には無理。
一応、Perl スクリプト内でできるレベルとしては、
環境変数 HTTP_REFERER を見て判断するという方法がある。

その他、.htaccess を利用する方法もある。
こちらの解は該当スレへ。

そもそも、検索かけりゃ一発で答が出ると思うが?
355nobodyさん:03/03/31 19:32 ID:???
>>354
それで直リンクは防げるのだろうか?
ジャンプしてくるのは防げるだろうが。
356nobodyさん:03/03/31 19:37 ID:???
ヨソからジャンプしてくるのは大抵リンクじゃないかな?
まぁこの手の質問って、こう返すしかなくない?
357nobodyさん:03/03/31 19:37 ID:a8GlaiRt
じゃあ、HTTP_REFERERが空っていうのも規制すれば。
358nobodyさん:03/03/31 19:38 ID:???
359353:03/03/31 20:04 ID:WQCBJdN9
どうも有り難うございます、助かりました。
360nobodyさん:03/03/31 20:19 ID:???
LWP::Simple;を 使うにはどういう風にサーバーの設定をすればいいですか?
361nobodyさん:03/03/31 20:33 ID:???
>353
「特定のページ」とやらが同一サイト内なら、有効期限付きのCOOKIEを使う手もあります。
しかし、Perlの話じゃなくなるので、相応しいスレを探してください。
362nobodyさん:03/03/31 20:34 ID:???
>360
サーバーの設定に関することは、UNIX板などで聞いた方がいいと思われます。
363T女の竹田:03/03/31 20:37 ID:???
>>360
まず、サーバの管理者にソケットが使えるかどうか聞いて。
使えないなら何やっても無駄。

使えるなら、もしルート権限があるなら普通にインストール、
ないなら自分の置ける場所にインストールして、スクリプトの方で
パスを指定すれば大丈夫。
364nobodyさん:03/03/31 20:52 ID:???
http://fh.aaacafe.ne.jp/cgiperl.html
ここのスペースに
http://dream.lib.net/room/cgi/e_upboard.html
これ置いたんですけど、これでアップした画像のURLを
2chなどの外部に貼って表示することが出来ません。
403が出ます。
どうすれば外部から表示出来るようになりますか。
365nobodyさん:03/03/31 21:13 ID:???
無理。
管理者に文句言え。
366nobodyさん:03/03/31 21:37 ID:???
>>365
タダで借りてる身分なら文句は言えんだろ
367nobodyさん:03/03/31 21:44 ID:rFaVLjrq
今探しているのですが、見つかりません。
Telnetモジュールを使用したTelnetで
ポートを変更するにはどうしたらいいですか?
368nobodyさん:03/03/31 22:28 ID:???
TelnetモジュールってNet::Telnet?

perldoc Net::Telnet

見れ
369nobodyさん:03/03/31 22:42 ID:rFaVLjrq
>>368
う〜ん見れません
370nobodyさん:03/03/31 22:43 ID:???
>>368
失礼しましたrootだから見れませんでした。
見てみます。 ありがとうございました。
371nobodyさん:03/04/01 00:15 ID:???
4月1日になりました。
これから24時間嘘が飛び交います。
372nobodyさん:03/04/01 00:21 ID:???
perlは僕が作りました
373nobodyさん:03/04/01 00:29 ID:???
>>372を作ったのは俺です。
374nobodyさん:03/04/01 00:31 ID:???
>>373を作ったのは私です。
375372:03/04/01 00:34 ID:???
PHPも僕が作りました。
実を言うとTCP/IPプロトコルを作ったのも僕です。
もちろんFTPもですよ
376nobodyさん:03/04/01 00:47 ID:???
ごめん。RFCね、アレ、全部嘘。
見なかった事にしといて。
377nobodyさん:03/04/01 01:40 ID:???
つーか、ひろゆき嘘が一番すげーなw
トップページに閉鎖しますだってよw
378nobodyさん:03/04/01 01:50 ID:???
今時閉鎖ネタは無いよねーと言われる中、
やるとはさすが・・・
379nobodyさん:03/04/01 02:19 ID:???
Apr 1ネタも出ないほど人いないのかこの板は、
と思ってたら発見

age
380nobodyさん:03/04/01 03:06 ID:???
あのぉ2chのidってどうやって作ってるんですかねぇ?
cryptとかpack関数とか関係あるのかなと思って調べてみたんですけど、
cryptはともかくpackって私には理解不能で・・・
2chのIDもどきの作り方、どなたか教えていただけないでしょうか?
381nobodyさん:03/04/01 03:09 ID:???
age忘れ
382nobodyさん:03/04/01 03:51 ID:???
383nobodyさん:03/04/01 05:18 ID:???
>>382
thxです
384nobodyさん:03/04/01 09:18 ID:???
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日ですけどマジ質問です。
385nobodyさん:03/04/01 09:50 ID:???
>>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};

わかた?
386nobodyさん:03/04/01 10:08 ID:???
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};
グホッ、やばいです、インダス文字に見えてきました。
しかも->の意味がわかってないし・・
教えて貰った情報を元にもう一回解説サイト回って消化できるようにしてきまつ。
わけわからんこと書いてるのにアドバイスありがとうございます。
387nobodyさん:03/04/01 10:16 ID:???
日付の99/01/22といった形式から
1970年1月1日からの秒数に変換してくれるツールありませんか?
388nobodyさん:03/04/01 10:44 ID:???
>>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;

389246:03/04/01 13:54 ID:2CNQXE4J
遅レスですが、どうして、「%%HOGE%%」%二つで囲むのでしょうか。
別に他の文字とかでもいいんですか?
慣習上の問題ってやつですか?
390nobodyさん:03/04/01 14:14 ID:???
CGI.pmを使ってファイルをアップロードするスクリプトを書いてみたのですけども
カレントディレクトリに CGItemp28729 など
一時ファイルが残ってしまい消えません
#アップロードするごとに増えていく

環境はWinXP+ActivePerl v5.8.0 built for MSWin32-x86-multi-thread
です。

初歩的なところでつまずいてると思いますが
一時ファイルを残さない方法教えてください。
391251:03/04/01 15:08 ID:???
>>390
関数はunlinkでできるけど安易に使うと全部消去しかねない諸刃の剣
そもそも、自分でスクリプトを書いてて何故ソースが理解出来とらんのだろうかと・・・
392251:03/04/01 15:11 ID:???
>>389
<!-- HOGE -->
で自分は括っとるけど、そんなものは作った人の勝手でしかない
393390:03/04/01 15:16 ID:???
>>391
いや実はUnixではきれいに消えてるんですが
知り合いにソース頂戴と言われて
あげたら環境がWindowsXPで
テンポラリファイルが消えないと文句言われました。

で自分でその環境を作ったらやはり消えない・・・
394390:03/04/01 15:19 ID:???
テンポラリディレクトリを指定して
スクリプト起動するごとにそこのディレクトリを
掃除するってことも考えたんですが
なぜ消えないのかの方が疑問になったんです。

んー なんででしょう・・・
395251:03/04/01 15:22 ID:???
>>394
ソースで問題無い(Cgiなんちゃらを出力してない)のならばwindows版apachの処理の問題じゃないですか?
396251:03/04/01 15:23 ID:???
>>395
もとい、httpdの問題
397390:03/04/01 15:55 ID:???
>>395
一応ANHTTPd Apache BJD試してみましたがどれも同じ結果に・・・
ついでに自分の書き方が悪いのかとおもって
他の方が配布しているスクリプトを使ってみても同じでした・・

うーん 気持ち悪い
398nobodyさん:03/04/01 16:02 ID:???
>>390
うだうだ言ってないで、テンポラリファイルを消している部分の
ソースコードをここに示してください。

また、余計な部分は示さないでください。
399390:03/04/01 16:06 ID:???
>>398
CGI.pm参照してください。
400nobodyさん:03/04/01 16:23 ID:???
同じく前CGI.pmでアップロードさせたらTempファイルが残っちゃったよ。
結局、僕は解決できなかったので諦めました。
4014 ◆6ykHaReEM2 :03/04/01 16:28 ID:2ihQy5Oo
opendir(DIR, './');
foreach (readdir(DIR)) {
/^CGItmp/ && unlink;
}
closedir(DIR);

これでだめだろうか?
4024 ◆6ykHaReEM2 :03/04/01 16:32 ID:2ihQy5Oo
あ、CGItempか,,
Upload終わって、プログラム終了前に↑してもだめなのですか?
4034 ◆6ykHaReEM2 :03/04/01 16:34 ID:2ihQy5Oo
実は、CGI.pm使ったUpLader作っているので気になる。
暇あればWindowsで試してみます。
404390:03/04/01 16:34 ID:???
>>402
それがいちばんよさそうですね
UPしたやつはロックかかってるのかわかりませんが消えません
以前にUPしたやつは消えました。

これって激しく既出の問題だったんでしょうか?
405nobodyさん:03/04/01 16:40 ID:???
同じくCGI.pmのアップロード機能でつまずいてるものなんですけど
一時ファイルって作成する場所って自分で指定できないんでしょうか?
406nobodyさん:03/04/01 16:44 ID:???
ホットメールでのメンバー登録を防止したいのですが
これだと特定のアドレスは阻止できてもhotmail全部は無理みたいです
どうすればいいんでしょうか?

if ($FORM{'EMAIL'} eq "****\@hotmail.com"){ push @err,'・このメールアドレスは使えません'; }
407390:03/04/01 16:44 ID:???
解決しました。すみません。

原因はファイルハンドルを閉じて無かったことでした。
$filename = $query->param('File');
この状態で <$filename>が存在してしまうので
close($filename);
の一行入れるだけで問題なく一時ファイルは消えるようになりました
くだらん質問してスマソ!!
408nobodyさん:03/04/01 16:48 ID:???
>>406
パターンマッチ
409nobodyさん:03/04/01 16:49 ID:zxB6PEfR
410406:03/04/01 16:51 ID:???
>>408
なんですか?
411nobodyさん:03/04/01 16:55 ID:???
if ($FORM{'EMAIL'} =~ /hotmail/){ push @err,'・このメールアドレスは使えません'; }
でいいかな?
412nobodyさん:03/04/01 17:07 ID:???
>>407
な、なんだってー(AA略
413406:03/04/01 17:25 ID:???
>>411
サンクスできました。
414nobodyさん:03/04/01 17:48 ID:???
ttp://www.age.jp/~lunar/index.cgi?read=./package/web_ftp_3_5_0.lzh
の中の ftpcontrol.pl を解読中なのですが、300行目付近の
($boundary) = $content_type =~ /boundary="([^"]+)"/; #";
の行がよくわかりません。左端の括弧が必要な理由と、
右端の #"; が何かよくわかりません。どなたかわかりますか?
415nobodyさん:03/04/01 18:18 ID:???
リストコンテキストを作り出すために、カッコをつけているんじゃないかな。

416nobodyさん:03/04/01 18:30 ID:???
#";
てのは、なんだかわからん。
普通に考えれば、# 以降は行末までコメントだけど・・・。
417414:03/04/01 18:40 ID:???
ありがとうございます。左端の括弧はリストコンテキストですね。
調べが足りませんでした。
しかし、右端の #"; は謎ですね。コメントにしか見えないんだけど、
何の意味をこめてコメントにしたのかわからないし、
タイプミスだとしても、タイプミスで「"」を入力するヤシがいるのかと問いたい。
418nobodyさん:03/04/01 18:58 ID:???
世の中には対応する括弧やクォートを強調表示したり、
そこへ飛んだりできるエディタが多く存在するのだよ。

そういうエディタで /boundary="([^"]+)"/ なんて行が
あると、クォートの数が揃わんで難儀するのだよ。
419nobodyさん:03/04/01 19:08 ID:???
>>418 なるほど!
420414:03/04/01 19:10 ID:???
>>418
なるほど!!

では、#"; のセミコロンも意味があるのだろうか・・・
421nobodyさん:03/04/01 19:11 ID:???
気分?
422bloom:03/04/01 19:13 ID:xVxahWvN
423nobodyさん: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に対して処理をしてるのに。
424423:03/04/01 23:09 ID:???
例えば、@templateを何度か使い回しする時、
配列の要素が変更されてると困っちゃうんです。
425nobodyさん:03/04/01 23:23 ID:???
>>423
思いっきり配列の要素を変更しようとしています。

) foreach $line (@template){
)  $line =~ s/aaa/AAA/;
)  $hoge = $hoge . $line;
) }

foreach ループ内では、$line は配列@templateの各要素にセットされます。
$line を変更すると、配列の要素が変更できる、ということです。
変更したくない場合は、一旦別な変数にコピーしてから、扱いましょう。

「コピーする」「セットする」という用語がみそです。
426nobodyさん:03/04/01 23:34 ID:???
久々に初心者らしい質問だったな
427nobodyさん:03/04/01 23:51 ID:???
ここまで全部嘘でした。
428nobodyさん: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日だな。(笑)
429nobodyさん:03/04/02 00:46 ID:???
>>428
何を訳わかんないこと一人で納得してんの?
430nobodyさん:03/04/02 01:09 ID:???
foreach の横に書いた変数はlocalが付いているものとして解釈される、ということ。
でも今の、foreachの中で$strが@arrの各要素のエイリアスになる、ということには関係ない。
431 :03/04/02 01:20 ID:???
モジュールを使わないでmailを送る方法って無いでしょうか?
432nobodyさん:03/04/02 01:22 ID:???
がんばれ
433nobodyさん:03/04/02 03:38 ID:???
>>431
モジュールって意味わかって言ってんのかなぁ?
434nobodyさん:03/04/02 04:29 ID:???
申し訳ないです、"->"の意味を教えて頂けないでしょうか?関数等なら検索すれば
直ぐに出てくるのですが記号等は検索しても何故か引っかからないのでお手上げ状態に
なってしまいます。
435nobodyさん:03/04/02 05:15 ID:???
矢印演算子 Perl で検索すれば出てくると思う
436nobodyさん:03/04/02 05:16 ID:???
>>434
「Perl 矢印演算子」でぐぐれ

437nobodyさん:03/04/02 08:30 ID:???
アロー演算子だろ。
438 :03/04/02 14:38 ID:sWPLndkw
質問です。

投票CGIの多重投票防止をクライアントのNICのMACアドレスを取得
することで実現できないかと考えたのですが、実現可能でしょうか?
また実現可能な場合、どのようなコードを書けばいいのでしょうか?

ご教授ください。
439nobodyさん:03/04/02 14:53 ID:???
すごいな。
440nobodyさん:03/04/02 14:57 ID:???
>>438
MACも偽装できるけどそれでもイィ?
441438:03/04/02 15:06 ID:sWPLndkw
>>440
それでもIPやクッキーよりもましだと思うので、方法があるのでしたら
ご教授ください。
442nobodyさん:03/04/02 15:09 ID:???
偽装の前に、そもそもMACアドレスって、どこまで知れ渡るの?
同じネットワーク内だけじゃ?
443nobodyさん:03/04/02 15:28 ID:???
春だなぁ〜(´∀`
444nobodyさん:03/04/02 15:35 ID:???
Net::PcapかNet::PcapUtilsでパケットつかまえて
NetPacket::ARPとか使えば出来そうだけど、
敷居が高すぎてやったことないね。

それよりもネットワーク系超ニガテだけどさ、
442さんの言うとおりイーサネットまででしょ。
多分つかまえられるのはてめーんとこのルータのMACアドレスまでだね。
他はIP+ポートのソケット単位でルーティングされてるんだろうから。
リモートのIPじゃだめなの?

よって、クッキーたべさせなさい。
445 :03/04/02 15:35 ID:sWPLndkw
>>442
クライアント側でipconfig実行してその値を取得できればいいんですけど
そのやり方がどうも分からなくて、Win32::OLE使えば出来そうなんですけど。

http://member.nifty.ne.jp/hippo2000/perltips/Win32/OLE.htm
446nobodyさん:03/04/02 15:37 ID:???
>>445
掲示板に書き込もうとした人に無理矢理ipconfigを実行させるのか?
447nobodyさん:03/04/02 15:39 ID:???
そんなことができるなら、とっくにみんなやっていると思うけど。
448 :03/04/02 15:39 ID:sWPLndkw
>>444
IPだと再ダイアルアップしたらだめだし、クッキーもその都度消されちゃったら
だめなんでMACアドレスならいいかなと。それにルーターまででも桔梗いいん
じゃないかと・・・
449446:03/04/02 15:39 ID:???
掲示板じゃなくて投票か。どうでもいいけど
450nobodyさん:03/04/02 15:43 ID:???
>>448
だから、てめーんとこのルータまでだって。
ルータ製品を変えない限り何万回でも何億回でも
同じMACアドレスしかつかまえられないでしょ。
そんなクッキーよりIPより無用なものがよかったら
NetPacket::ARP使いなさいってこった。
451nobodyさん:03/04/02 15:45 ID:???
それにipconfigをクライアントで実行させた値を取ってこれたら、
果てしなくガクブル系セキュリティホールだな。
しかも、OLEなんて全然関係ないし。
452nobodyさん:03/04/02 18:04 ID:4v5aHOPP
外部に作成したHTMLファイルから読み込んで
<!--here-->
みたいなコメントの部分をCGIで置き換えて出力する部分を作成しています(Perl)。

この、HTMLファイルを、CGIのディレクトリと違うディレクトリにいれたんですが、
これだと、HTMLが画像のリンクなどを含んでいた場合、困ったことになります。
HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。

ホームページの編集ソフトなどで作成したHTMLを、指定フォルダにアップする形にしたいので、
すべての画像パスを絶対パスにするとかそういう解決策は無しで、何かいい方法はないでしょうか?

一般的な解決策などがあるのでしょうか?
453nobodyさん:03/04/02 18:09 ID:???
>>452
まったく Perl と関係ねー
454nobodyさん:03/04/02 18:12 ID:???
君みたいな人はお金で買ったほうが早いよ
455nobodyさん:03/04/02 18:21 ID:???
> HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。

その相対パスの指定が間違っているだけではありませんか。
結果的に正しい相対パスになるように、書いておくしかないのではないでしょうか。
456nobodyさん:03/04/02 19:13 ID:???
正規表現で自動で置き換えるようにするとかさぁ

なんで<!--here-->は置き換えられてIMGタグは置き換えられないのかと・・・ry
457nobodyさん:03/04/02 20:21 ID:???
$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両方を文字で表したいのですがどうすればいいですか?
458nobodyさん:03/04/02 20:31 ID:???
説明下手が多いよな、手助けしたくても理解できんよ。
459nobodyさん:03/04/02 20:40 ID:???
>>458
ハゲドゥー
460457:03/04/02 20:43 ID:???
#!/usr/bin/perl

##############ファイル設定#################
$iptext = "ip.txt";
$open = "あ";
$close = "い";
###########################################

if ($ipdata == "close") {
print "$open\n";
}
else {
print "$close\n";
}

これでは表示されないのかなぁ?
461nobodyさん:03/04/02 21:04 ID:???
何を言ってるのかやりたいのか、さっぱりわからん??? 
462nobodyさん:03/04/02 21:08 ID:???
なんで

open IN, "<$iptext" or die "ERROR:ipファイルが開けません!";
$ipdata = <IN>;
close IN;

を消してんだよ。
463457:03/04/02 21:10 ID:???
あれ〜〜〜。。
これさ、imgタグで表示させるから、文字にしても意味ないか、、、
464nobodyさん:03/04/02 21:15 ID:???
独り言は脳内でやってくれや
465nobodyさん:03/04/02 21:19 ID:???
聞く前に一番最初に気づけ。
466457:03/04/02 22:19 ID:???
重ね重ねすいませんが、
今やろうとしているのは、

まずip.txtを読みにいって、IPがあれば、「公開」、空白だと「非公開」
(ip.txtの更新はNoDNSというフリーソフトでやってます)
というふうにして、HTMLに表示するCGIを作りたいのですが、どうでしょうか?
467nobodyさん:03/04/02 22:31 ID:???
>>466
うるさい
468457: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;
}
469457:03/04/02 22:51 ID:???
>>468
わざわざこんなに書いていただいたのに申し訳ありませぬが、
あらかじめいろいろ書いているindex.htmlに付け加える形にしたいのですが、、、
なんどもすいません
470nobodyさん:03/04/02 23:01 ID:yhPO3ktu
SSIを使でよびだすのはだめですか?
471457:03/04/02 23:03 ID:???
>>470
CGIがいいです、はい。
注文多くてごめんなさい。
あ、でも、使いそうなので教えてくれますか?
472nobodyさん:03/04/02 23:09 ID:yhPO3ktu

SSIでやるには、読み込みたい部分に<!--#exec cgi="よみこむCGIファイル" -->
でいいとおもいます。

CGIでは・・・やりかたがいまいちおもいつきません。index.htmlのフレームを
わければなんとかなりそうですが・・・
473457:03/04/02 23:19 ID:???
>>472
そうですかぁ。。。
付け加えるのなら、画像にしてIMGタグにするしかないんですかね
474nobodyさん:03/04/02 23:19 ID:yhPO3ktu
付け加えるって追加indexに追加書き込みするってことですか?
475457:03/04/02 23:24 ID:???
>>474
そういうことです。
476nobodyさん: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;
}
478nobodyさん:03/04/02 23:46 ID:???
普通はSSIだよな
479名無しさんパーフェクト:03/04/02 23:50 ID:RgSUli0E
indexを読み込んだときにそのプログラムを読み込むのではもう遅いのでは?
それならまた違うhtmlを編集して最後にそちらに飛ばした方が
480名無しさんパーフェクト:03/04/02 23:51 ID:RgSUli0E
あげてしまった吊ってくる
481名無しさんパーフェクト:03/04/02 23:53 ID:???
鬱・・・
482457:03/04/02 23:56 ID:???
すいません。ほんとに迷惑かけて。SSIで行くことにしました。。

自宅鯖は<!--#exec cgi="よみこむCGIファイル" -->です。
ってして、あとどうすればいいですか?
CGIファイルはどれにすればいいんですか?
ほんと何も知らないですいません。。
483nobodyさん:03/04/02 23:57 ID:yhPO3ktu
これでだめならSSIかframeで分割して読み込んでください。
484nobodyさん:03/04/03 00:06 ID:os6gOz9a
>>468
のファイル名をserchip.cgiだとして
それをSSIでindex.htmlに組み込むとすると
組み込みたい場所に
<!--#exec cgi="serchip.cgi"-->
てなかんじでいいとおもいます。
485457:03/04/03 00:20 ID:???
できないなぁ。トクトクはSSIOKなはずなのに、、、
486nobodyさん:03/04/03 00:40 ID:???
>>485
何をどうやってできないのか、はっきり言え。
そうでなければただの独り言だ。独り言を公開の場に垂れ流すな。
487457: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}/)
が違ってるとしかおもえないんですが、、どうでしょう?
488nobodyさん:03/04/03 01:00 ID:???
>>487
ソースも読めない奴がいじろうとするな
489457:03/04/03 01:03 ID:???
>>488
コンテンツタイプとかのは、
自宅のAN Httpdだと筒抜けですが、トクトクだと、ちゃんとBODYだけ表示されます。。。
490457: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の文まちがってますかね?
491nobodyさん:03/04/03 01:07 ID:???
>476
百合親切だな
492nobodyさん:03/04/03 01:10 ID:???
SSIの呼び出し方に決まりごとなかったか?
ちゃんと設定方法とか読んだのかよ、
つか漏れ的には if(/close/){ が非常に気になるわけだが・・・。
493457: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です。。。
494457:03/04/03 01:25 ID:???
トクトクでは、SSIを動作させるにはファイルの拡張子を .shtml にしなければいけません。
 .htaccess もトクトクでは動作しませんのでこれは変更不可能です。
 また、トップページは index.htm , index.html の形式しか許されていませんので、トップページにSSIを利用することはできません。
( ゚Д゚)ポカーン・・・・・
逝ってきまつ
495nobodyさん:03/04/03 01:26 ID:???
>>493
そのコード自体が目的不明に見えるんだが
$ex++みたいにカウントアップして何か意味あるのか?
496457:03/04/03 01:28 ID:???
>>495
これはほかの方が教えてくれたやつです。。。
index.shtmlにしたらデキターヨ。。
みなさんスレよごしてごめんなさい。
497nobodyさん:03/04/03 01:33 ID:???
>495
whileが最後まで回る所とかな。
498nobodyさん:03/04/03 01:33 ID:???
>>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";

共通化できる所はまとめなさい。
499457:03/04/03 01:44 ID:???
>>498
すいません。トクトクでは、shtmlでないといけなかったみたいです。。。
でも、このCGI直すところいっぱいありますか?
500nobodyさん:03/04/03 01:44 ID:???
そもそも目的がはっきりしてないんだよな。
>>466の「まずip.txtを読みにいって、IPがあれば、」って、
ファイルにはどれだけのデータがあるのか?
IPある無しの答えは1個なのか複数かもはっきりしてないし
501nobodyさん:03/04/03 01:46 ID:???
txtのフォーマットもわからないしな
502nobodyさん:03/04/03 02:20 ID:???
>434じゃないんですけど、
perl色々勉強してて、「->」につまづいて、もう全然わけわからなくて、
http://www.rfs.jp/sitebuilder/perl/04/06.html
↑ここが一番詳しいかなとおもうんですけど、ここ見ても意味不明で・・・
だんだんやる気なくしてたんですけど、ちょっと教えていただけませんか?

まず、「矢印演算子を使わなければならない理由」、
あるいは、別に使わなければならないわけでもないなら、
「矢印演算子を使うことでどのようなメリットがあるのか」を
できれば、例をだして、「こういう風なことをしたいときにこうする」
または、「こういう風にするときにこうした方がこういうメリットがある」
という感じで教えていただけないでしょうか?

次に
http://www.rfs.jp/sitebuilder/perl/04/06.html
こことかで出てくる、「無名の配列」「無名のハッシュ」・・・
の「無名」ってのはどういう状態を指してるんでしょうか?

あと、そんなことよりこのサイトで勉強しろよってのがあれば、
貼っていただけると自分で勉強してきます
503nobodyさん:03/04/03 03:19 ID:???
無名の名ってのは、変数名のことじゃないかなぁ。

@arr = (1,2,3,4,5);

ってときは、arr っていう名前が、この配列についてる。
504nobodyさん:03/04/03 03:53 ID:???
>>502
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_20.html
どうしてもアローを使わなければならないケースは少ないだろう。
505nobodyさん:03/04/03 05:20 ID:???
んーホント難しい・・・

>無名の名ってのは、変数名のことじゃないかなぁ。
そういうことだと思うんですけど、じゃあ、これが無名ってのは、どういう状態なんでしょう?
まだ、宣言されてない変数ってことなんでしょうかねぇ?

>どうしてもアローを使わなければならないケースは少ないだろう。
でも人のソースを解読したいときに激しく不便、ってかできないんです
教えていただいたurl・・・難しい。明日改めて勉強しに行ってきます
506nobodyさん: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";だ。
ハッシュのときは、矢印演算子使うた方が分かりやすいからよく使われる。
507nobodyさん: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";
508nobodyさん:03/04/03 08:06 ID:Nji/7HYX
まだか。まだ分からんのか。
(...)ってのはリスト構造だ。[...]ってのは配列だ。{...}ってのは
ハッシュだ。いいか?だから、
$ar=['baka', 'aho', 'bokenasu'];
$hash={'baka', 'kuso', 'aho', 'manko', 'bokenasu', 'shikko'};
って書くと直接無名配列、無名ハッシュができる。
$ar->[1]とか$hash->{'baka'}ってアクセスするっきゃ内。
509nobodyさん:03/04/03 08:09 ID:Nji/7HYX
おい、分かったって言ってくれ。
もう出かけるぞ。
510nobodyさん:03/04/03 10:14 ID:???
こういう無名ハッシュを考える。$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}でアクセスできる。
511nobodyさん:03/04/03 10:24 ID:???
無名っていう物は、元の英語だと、Anonymousになってて、匿名って読み替えてもいい。

%hash = (a => 1, b => 2);
$hash = {a => 1, b => 2};
この2つの状態を比べると、データは同じでも、上の方は、%hashっていう名前が
付いているのに対して、下は、データのアドレスが$hashに入ってる。

つまり、1つの変数にメモリ上のデータが対応している状態を、普通の状態。
変数に対応していないデータの事を、無名だ。という。
512nobodyさん:03/04/03 10:28 ID:???
この2つは、実際に持っている情報は同じでも、…

5行目を修正。。
513nobodyさん:03/04/03 10:31 ID:???
矢印のまとめ。

$str = 'hoge';
$ref->{a}[0]->($str)->$str->$str($str->$str);
514名無しさん@Meadow:03/04/03 11:46 ID:694fbPsK
>>510 - >>513
うざい
515nobodyさん:03/04/03 12:13 ID:???
$this->[514]
はぁ?
516251: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;

517251: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思考プログラムはまたルールが違うのでそれは別の話に・・・
518251:03/04/03 12:36 ID:???
%ayaya1 = %{$ayaya3};

だったすまね・・・
519457: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の部分がおかしいって出るので、ぜんぜんわからないので、
↓にかえました。
520457: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がないっていうのは文法上だめですか?
521502:03/04/03 13:52 ID:???
みなさんすいませんでした。こんなに解答していただいてたのに
質問しっぱなしで寝まくってました。

で、今ざっと皆さんのレス読み返してるんですが、
>>517さんの一行目でなんとなくメリットがわかりました。
つまり、一旦新たな配列に値をコピーしてからサブルーチンなんかにわたすより、
値の入ってるアドレスを渡した方が、効率的ってことですね?

で、矢印演算子はそれらの代入や参照のときに使うものだと

今からもう一度皆さんに書いていただいたのを読み直してみます。
本当に有難うございます。多分理解できると思います
522nobodyさん:03/04/03 13:53 ID:???
むちゃくちゃだな。
523457:03/04/03 13:54 ID:???
すいません。>>519>>520は脳内あぼーんしちゃってください。
出直します
524nobodyさん:03/04/03 13:57 ID:???
>>520
いいかげんにしろや。同意が欲しいなら言ってやる。
それでオッケー!完璧です!
525nobodyさん:03/04/03 14:07 ID:???
>>523
仕様をはっきりさせないから。
ip.txtって複数のアドレスが入ってるの?その場合はデリミタは?
それとも一つあるか、空のファイルのどちらか?
あるいはアドレス以外の何かも含まれているの?
526nobodyさん:03/04/03 14:45 ID:???
まーSSIじゃなくてもindex.htmlに文字列埋め込むことは出来るわけで。

とか、まぜっかえしてみる。
527nobodyさん:03/04/03 15:29 ID:???
>>526
それはナニ?
ハンドラいじるの?
528nobodyさん:03/04/03 15:33 ID:kftTqlDW
529nobodyさん:03/04/03 15:56 ID:jWA2mxiH
530nobodyさん:03/04/03 16:06 ID:???
そういえばCGIスクリプトを外部JavaScriptファイル(?)として読み込み、document.writeで書き出すテキストカウンターがあったな。
531CGIで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
532nobodyさん:03/04/03 16:10 ID:+bF3BpEY
わかりません〜

0chのスクリプトをDLして掲示板を精製したけどその掲示板にアクセスするには何処にアクセスすればいいのですか〜?

(他のサイトではindex.htmlでアクセスしてたが
533nobodyさん:03/04/03 16:11 ID:???
リンク先見ていないけど、多分コードの問題じゃなくて、サーバーの設定の問題だろ。
自分のコンピュータでやればうまくゆくと思う。
534533:03/04/03 16:12 ID:???
>>531へのレス。
535nobodyさん:03/04/03 16:12 ID:???
>>532
スレ違い。
536nobodyさん:03/04/03 16:13 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の内容が出てくる。
537nobodyさん:03/04/03 16:35 ID:sUO6GuNu
次のような場合の動作は、1通りではないと言うことでしょうか。

${$hoge} = 'abc';

538531 CGIでwww上のhtmlソースを取得:03/04/03 16:37 ID:507cBmxs
>>533

それが..
他人が作ったCGIはちゃんとこの動作を
してるのに自分のは動かないんです...

トクトクサーバのOSはLinuxなのでWINDOWSやUNIXサーバ用に
書かれたコードは動かないんでしょうか..
539nobodyさん:03/04/03 16:41 ID:jWA2mxiH
540nobodyさん:03/04/03 16:44 ID:???
>>538
socketが使えないからだろう
541nobodyさん:03/04/03 16:45 ID:???
>>537
意味がわからん
何を聞きたいの?
542537:03/04/03 16:54 ID:sUO6GuNu
すみません。書き直します。

${$hoge} = 'abc';

このような代入の動作は、

$hogeの中身の文字列と同じ名前をもつスカラ変数に 'abc' という文字列を代入する。
$hogeの中身であるスカラへのリファレンスが指している変数に、'abc' という文字列を代入する。

のどちらかが、場合場合で行われる、ということでしょうか。


543457:03/04/03 16:56 ID:???
>>525
ip.txtには公開状態にしたいときに、1つのIPアドレスが書き込まれています。
閉鎖時は「close」という単語が書かれています。(空ファイルはなんか不安なもので)
それで、一から自分で書き直したのがこれです。
544457: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は絶対いるのでしょうか?
545531 CGIでwww上のhtmlソースを取得:03/04/03 16:59 ID:507cBmxs
>>540

いえ、socketは使えるんです。

http://www.vector.co.jp/soft/unix/net/se220625.html
これを設置したらちゃんと動きますから..
(HP一括ダウンロードCGIです)

このCGIのソースを参考にさせてもらおうとも
思ったのですがあまりに複雑なコードなので,,,
546 ◆WI1n/FSUiE :03/04/03 17:07 ID:???
Perlの最新版って5ですか?
それとも6ですか?
547457: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を使ってたのが気になりまして。。。
548 ◆hMJAPH9PWA :03/04/03 17:19 ID:???
>>542
そう、前者はシンボリックリファレンス、後者はハードリファレンスと呼ばれているね。
前者はstrictプラグマで禁止することができる(というか、通常はstrictにしているべき)
549nobodyさん:03/04/03 17:20 ID:???
同一サーバー以外は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;
  }
}
550251:03/04/03 17:21 ID:???
>>542
$hoge = \'abc';

${$hoge} = 'abc';

とは同じ意味。コレでわかるかな?
551nobodyさん:03/04/03 17:24 ID:???
>>544
仕様があやふやだから回答するほうも迷うんだよ。
whileを使ったのはファイルを最後まで読み込むためだろう。
ファイル中のどこにIPアドレスが入ってるかわからない質問だったから。

>なんとなく理解できるんですが、whileの中にifを入れないとできないのがよくわかりません。
whileのループ内でIPアドレスがあるかどうかの判定しないでどうするっての?

>if(<FILE> =/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
ファイルハンドルについて勉強しなさい。
552nobodyさん:03/04/03 17:29 ID:???
>>457
とりあえず、whileの意味とか調べてきてから質問しろや
人なめんのもいい加減にしろ
553nobodyさん: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;

と言う風にしたいのですが上のようになるのはなんでですか?
554nobodyさん:03/04/03 17:38 ID:???
$POINT{($name)[0]}形式でポイントをカウントしているのですが
foreach (sort {$POINT{$b} <=> $POINT{$a}} keys %POINT)
でポイントの大きい順にソートできるのはわかるのですが
$name順にソートするにはどうしたらいいでしょうか?
5554: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ってなんすか?
556457: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}/")が代入演算子でするのでしょうか。
テキストのデータが*.*.*.*だった場合の処理だから比較演算子ではないんでしょうか?
557nobodyさん:03/04/03 17:51 ID:???
>>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;
5584: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/;

こんな感じにしたらどうだろうか?
559nobodyさん:03/04/03 17:54 ID:???
>>556
いい加減にしろや
なんで今度は配列になってんだよ
>>557でできるからもう来るな!
560457:03/04/03 17:56 ID:???
>>559
http://www.kent-web.com/perl/chap6.html
ここに@*という配列変数にセットするって書いていたので。。。
561bloom:03/04/03 18:00 ID:iUh0kMHD
562531 CGIでwww上のhtmlソースを取得:03/04/03 18:01 ID:507cBmxs
答えて下さる方がもういらっしゃらないようなので
また自力で頑張ろうと思います。m(__)m
563nobodyさん:03/04/03 18:02 ID:???
>>560
配列ってのは複数のデータを格納するもの。
IPアドレスかcloseという語のどっちかなんでしょ?
それならスカラ変数でいいの。
564457:03/04/03 18:03 ID:???
>>559
すいません。あと2つだけお願いします。
$data =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
これですが、「~ 」はどういった意味なんでしょうか?これがないとできなかったんですが、重要なものですか?
それと、なんで「==」ではだめなんでしょうか?
565nobodyさん:03/04/03 18:03 ID:???
>>549の相手をしてほすぃ
566457:03/04/03 18:03 ID:???
>>563
なるほど、、、ありがとうございました
567nobodyさん:03/04/03 18:04 ID:???
>>564
正規表現にあてはめる、って解釈が一番簡単かも
568nobodyさん:03/04/03 18:05 ID:???
>>562
>>531に書いてある方法を使うためには条件があるのはわかるよね?
君の環境も何もわからなきゃ誰もわからないの
569nobodyさん:03/04/03 18:06 ID:???
>>564
パターンマッチ で調べれ
570553:03/04/03 18:08 ID:os6gOz9a
>>558
すいません。それで試しても結果は変わりません。
ファイルから読み込まずにやるとうまくいくのですが・・・
571457:03/04/03 18:08 ID:???
>>569
あ、ホントですね。本にありました。
パターン結合演算子「=~」ですか、理解しました。
どうもありがとうございました。
572531 CGIでwww上のhtmlソースを取得:03/04/03 18:10 ID:507cBmxs
>>568

おっしゃる通り説明不足でした、申し訳無い..
勉強して出直してきます。m(__;)m
573nobodyさん:03/04/03 18:12 ID:addlh6nt
574nobodyさん:03/04/03 18:23 ID:???
>>564
めちゃくちゃにも程がある
配列も知らん香具師に何ができるんだ?
それにパターンマッチ云々知らなかったとしても
>これですが、「~ 」はどういった意味なんでしょうか?これがないとできなかったんですが、重要なものですか?
↑この発言はないだろ。
それぞれ一文字一文字にちゃんと意味があるに決まってるだろ?

聞く前にネットなり本なりで少しは調べろ
特に配列なんてのは大概一番最初の方ででてくることだ
その認識は改めたほうがいいよ。
576馬糞はんばーぐJr.:03/04/03 18:52 ID:???
>>575

誰に言ってるんだおみゃーは
577531 CGIでwww上のhtmlソースを取得:03/04/03 18:58 ID:507cBmxs
>>573

わ.. そのCGIをローカルサーバと無料レンタルサーバで
試してみたところどちらでもちゃんと動きました。(汗
ソースもシンプルなのでとても参考になります。

このCGIを参考に自分のプログラムが動かなかった原因も
調べてみます、感謝っす!m(_ _;)m
578nobodyさん:03/04/03 19:04 ID:???
>>553
553のスクリプトをWinXP+ActivePerlの環境で実行したら
i="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
となったので、そのスクリプトで問題ないのでは?
579nobodyさん:03/04/03 19:06 ID:???
>>555
何だろ、俺も知りたい

UN*X の time(1) なら
user ... 実行に要した時間
sys ... システムのオーバーヘッドに要した時間
だけども。同じかな?
580 ◆WI1n/FSUiE :03/04/03 21:45 ID:???

Perlの最新版って5ですか?

それとも6ですか?

581nobodyさん :03/04/03 22:00 ID:???
>>580
おたくなぁ、同じこと何回もかいてるんじゃねぇよ
現在使える分は5.8
6は使うならば自分でperlをコンパイルせねばならんのだからおたくのレベルにはかんけーねーよ
582nobodyさん:03/04/03 22:07 ID:???
>>580
ttp://www.perl.com/
ここへ行って一生最新バージョンのチェックをし続けて下さい。
583nobodyさん:03/04/03 23:31 ID:LZizHVyk
掲示板などで半角カナを使いたいのですが使用すると文字化けしたり
全角カナに強制的に変換されたりします。どうやって表示させればよいのでしょうか?
584nobodyさん:03/04/03 23:38 ID:???
強制的に変換したり、文字化けさせたりしなければいい。
585nobodyさん:03/04/04 00:38 ID:???
>>583
kentとか借り物つかってんの?
586nobodyさん:03/04/04 00:43 ID:MGOn1k3A
587nobodyさん:03/04/04 00:48 ID:???
配布スクリプト改造の話題はこちらで

【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
588nobodyさん:03/04/04 00:50 ID:???
>>587
スマソ。よく見てませんでした。
589nobodyさん:03/04/04 01:21 ID:???
UserAgentを書き換えるにはどうすればいいんですか?
590nobodyさん:03/04/04 01:41 ID:???
>>589
Perlとは関係ありません
591nobodyさん:03/04/04 01:47 ID:???
>>590
Perlでもできるだろ・・・
592nobodyさん:03/04/04 01:52 ID:CT5BhxQd
ページの再送信回避の方法ってありますか、
できればGETにしたくないのですが。
593nobodyさん:03/04/04 01:59 ID:???
>592
完全な方法はない。
保存データとの比較が最も安全ではあるが、間に別のデータが挟まれば結局無意味。

無難な方法はLocation。
594nobodyさん:03/04/04 01:59 ID:???
Locationするとか前回のと照らし合わせて同じだったらエラーにするとか
595nobodyさん:03/04/04 01:59 ID:???
>>589
UserAgentの文字列を別の文字列に書き換えればいい
596nobodyさん:03/04/04 02:00 ID:???
>>595
597nobodyさん:03/04/04 02:00 ID:???
>>592

話が見えない。
598nobodyさん:03/04/04 02:01 ID:CT5BhxQd
>>593
ありがとう。locationで飛ばしてみます。
599nobodyさん:03/04/04 02:04 ID:CT5BhxQd
>>592=598ですが、うまくいきました。thx
600brain:03/04/04 02:28 ID:???
eBrain21.comは、インターネットユーザーがホームページを
掲載するにあたって必要なサーバースペースを有料レンタルしています。
お客様に快適なサーバーを提供するためにさまざまなホームページの目的に応じて、
単なるホームページスペースだけではなく、動画やゲームまたは個人放送はもちろん、
そのツールとしてCGI、PHP、SSI、SQLデータベースなどあらゆるサーバースペースを提供しております。

http://www.ebrain21.com/

[email protected]
601nobodyさん:03/04/04 04:54 ID:i3RHe7j/
質問させてください。
アパッチの1.3.27でActivePerlを使っていて、OSはXPです。
自宅サーバを使って、HPを作っているのですがカウンタが動かないんです。
掲示板は動いているので、CGIはちゃんと使えていると思ったのですが
なぜかカウンタだけ「×」がでたまま動いてないんです。
KENT WEBさんの夢カウンタを使用していて、設定や記述は何度も見直した
のですが、チェックモードでCGIまでのURLを打ち込んでみてもCGIファイルがその
まま開いてしまうのです。
すみませんが、何か心あたりがあえば教えてください。

ちなみに、前もHPを作ったことがあるのですが(同じパソコンで)その時
はちゃんと動きました。そのときは、知り合いに同じ質問をしてフォルダ
オプションから関連付けをしたら動いたような記憶があるのですが、OSを
再セットアップしたのでまた同じ症状になってしまっています。前聞いた
人間は「忘れた」とだけ言って相手にしてくれません(涙
検索しているのですが、なかなか見つかりません。すみませんが、
よろしくお願いしますです。
602nobodyさん:03/04/04 05:08 ID:???
>>601
>CGIファイルがそのまま開いてしまうのです。
どういう意味?ソースが表示されてしまうっていうこと?
603601:03/04/04 07:20 ID:i3RHe7j/
そうです。CGIファイルをメモ帳で開いた時のものが出るんです。
604nobodyさん:03/04/04 07:32 ID:???
>>601
スレ違いだっつーの。
ここでCGIの質問するな。
605601:03/04/04 07:36 ID:i3RHe7j/
それは大変失礼しました。
初心者なので、perlと関係があると思ってました。
別板行きます。
606nobodyさん:03/04/04 08:12 ID:jZjztjzX
perlの最初に

use Win32::API;

と、書かれているのですが、これを読み込んだ瞬間にperl.exeのウインドウが閉じてしまいます
どう対処したらよいでしょうか?
607nobodyさん:03/04/04 09:00 ID:???
>>605
それ以前にXPで鯖公開したらライセンス違反にならないか?
608nobodyさん:03/04/04 09:11 ID:???
独り言だけど、
>>605 を読んで、初心者とはそう言うものなのかと初めて知った、春の日の朝。
609nobodyさん:03/04/04 09:12 ID:fwRQKvSx
KENT氏のaskaBBSの、$flagはどういう役割を果たしてるんでつか?
610bloom:03/04/04 09:46 ID:ZGDQypNs
611nobodyさん:03/04/04 09:48 ID:???
出た、bloom
そろそろ赤字でIP晒して欲しいな。
612nobodyさん:03/04/04 11:02 ID:lpjcObWV
データと、CSV形式で保存したいと思ってます。
で、CSV形式つっても、アプリによって微妙に差があるじゃないですか?

そこで、自分はエクセル用のCSVにしたいと思ってるんですが、
その際の仕様はどーすればいいんでしょうか?

●値は,で区切る
●値の中に"があるときは""と入力
●改行はそのまま改行を入れる。
●数字以外はセルの値を""でくくる

・・・でOK?
613nobodyさん:03/04/04 11:07 ID:???
perlと関係ねー
614nobodyさん:03/04/04 11:37 ID:T4cPGriS
keys 関数
 keys関数は、ハッシュ変数のすべてのキーをリスト値として返します。
@key = keys( %hash );
 キーの格納には乱数を使った手法が使われるため、ハッシュ全体を出力する場合、その順番は保証されません。ですから、@key には %hash のキーが順序を無視して格納されます。

順番通りに格納すればいいのに、どうしてこういう仕様になってるんですか?
perl作ってる人は何を考えてるんですか?
615nobodyさん:03/04/04 11:37 ID:???
>>612

>>2
> [お薦め]
>  ・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
616615:03/04/04 11:39 ID:???
間違えた>>3だ。

>>614

その「perl作ってる人」に聞け
617nobodyさん:03/04/04 11:46 ID:???
>>614
ハッシュだからに決まってるだろ。
618nobodyさん:03/04/04 12:12 ID:???
>>614
メモリ効率や実行速度を優先させたから。
619nobodyさん:03/04/04 13:05 ID:???
>>609スルーかよ
620nobodyさん:03/04/04 13:12 ID:???
>619 なんでKENT氏のaskaBBSなんてものをわざわざ探して調べてやらにゃならんのだ
621nobodyさん:03/04/04 13:16 ID:???
(´・ω・`)…
622nobodyさん:03/04/04 13:28 ID:???
>>620
それがこの板の住人の仕事であり、使命でもあるから。
623nobodyさん:03/04/04 13:29 ID:Oo/SV5Mj
getpw... getgr...という組みこみ関数のことなんですが、/etc/passwd, /etc/group
のパスを指定することができない(みたい)ので、テストで非常に難儀します。
サンプルのpasswd,groupファイルを読ませる方法はないのでしょうか。仕方なく
Unix::ConfigFileを使っているのですが、重いです。非常に便利で、なおかつどこで
も使える組みこみ関数なだけに惜しい。
624251:03/04/04 13:49 ID:???
>>606
Win32::APIが入ってないんじゃないの?

>>612
http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values
http://www.din.or.jp/~ohzaki/perl.htm#CSVfromValues

>>614
配列みたいに、キーにはa>bみたいな上下関係無いもん・・・
何をもっての順番なのか意味不明・・・
625nobodyさん :03/04/04 13:59 ID:???
>>614
>キーの格納には乱数を使った手法が使われるため、
って笑われぞ。ちゃんと順番には出てくる。
メモリーの格納順であって、キーの順番になっとらんだけだつーの(w
626nobodyさん:03/04/04 14:11 ID:???
>>607
え?ほんとうですか?
627nobodyさん:03/04/04 14:37 ID:???
>>626
IISで公開したら違反になるかも。
628nobodyさん:03/04/04 14:43 ID:???
>>627
IISってなに?
俺はXP+Active Perl+AN httpdで公開してるけど、、
マズいのかなぁ。
629nobodyさん:03/04/04 14:47 ID:???
630nobodyさん:03/04/04 14:48 ID:n4Opp+jH
ログイン・ログオンなどについて熱く語ってるサイトあったら教えてください。
ヤフーのログイン・ログオンはどういう仕組みなのかな?
631nobodyさん:03/04/04 14:57 ID:???
>>630
そりゃ Perl と全く関係無いとは言わないけれど、
そもそも Perl スレに書き込む話題か?
632nobodyさん:03/04/04 15:00 ID:???
>>628スルーでつか?
633nobodyさん:03/04/04 15:07 ID:???
>>632 なんで>>628氏がライセンス違反になるかなんてわざわざ探して調べてやらにゃならんのだ
634nobodyさん:03/04/04 18:42 ID:???
>628
Win板のXPスレで聞いてこい。
635nobodyさん:03/04/04 18:47 ID:jyfKo/rm
>>632
スルーでつが?それが何か?
636606:03/04/04 19:09 ID:???
>>624

試しにperl.exeを起動して、最初の一行目に
use Win32::API;
と、入力してリターンを押すとウインドウが閉じてしまってエラーメッセージすらも見れません

win32::apiが入ってない場合はどのようにすればいいのでしょうか?
よろしくお願いします(´Д⊂)
637nobodyさん:03/04/04 19:16 ID:???
>試しにperl.exeを起動して
>ウインドウが

この時点で俺はお手上げだなぁ。
とりあえず、その perl.exe とやらはどこから入手したのさ?
638606:03/04/04 19:33 ID:???
>>637

ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.msi

のセットに入っている奴です
639nobodyさん:03/04/04 19:41 ID:???
>>606
っつーか、perl.exeのウインドウ って何?
640nobodyさん:03/04/04 20:50 ID:???
たぶん、>>606 はコマンドプロンプトを知らんのでしょう。
perl.exeを*ダブルクリックで*起動して、perlがstdin待ちになったところへ
use Win32::API;と入れて、すく終了してウィンドウが閉じたと。漏れはUNIX派なので
ここらへんよく分からんが、WindowsだとCtrl-d押さなくても終了になるんかな。

コマンドプロンプトを知らん人が、Win32::APIなど使えるわけありません。あきらめ
た方が時間の節約になりますYO。
641nobodyさん:03/04/04 20:54 ID:???
皆わかってて、からかってるんだってば。

優しい人発見。 >>640
642nobodyさん:03/04/04 21:11 ID:???
>>641
なんだそうか。ワリィワリィ。
643606:03/04/04 21:22 ID:???
とりあえず、ある***.plってのを動かしたいんですが
一種類だけ動かないんで聞いてみました

644nobodyさん:03/04/04 21:28 ID:OlDxyviA
ページが変わっても変数や配列を保持しておくことができますか?
例えばあるページで使用した$test1=10を次のページでも
form変数やurl変数で送らずに使用したいです。
可能でしょうか?教えてくださいまし。
645nobodyさん:03/04/04 21:29 ID:???
>>643

>>640
> たぶん、>>606 はコマンドプロンプトを知らんのでしょう。
についてはどうかね?
646nobodyさん:03/04/04 21:30 ID:???
>644
ファイルに保存しる。
647nobodyさん:03/04/04 21:30 ID:???
>>644
ファイルに記録しておく
648nobodyさん:03/04/04 21:32 ID:???
>>644
ファイルに書き出しておく
649nobodyさん:03/04/04 21:33 ID:???
>>646-648
言い方はいろいろだけど、やってることは同じなのねん。
650nobodyさん:03/04/04 21:36 ID:???
>>644
データをプーリングしておくためのサーバを起動しておく。
で、現ページでPUTして次ページでGETする。
651nobodyさん :03/04/04 21:47 ID:???
>>640
レベルはそんな所であろうな・・・
一応Un?xで動かないとか訳解らん事言ってるんじゃないのな・・・

ppm install win32-api

とコマンドプロンプトに打ち込めばモジュールはインスコ出来るけど
ttp://member.nifty.ne.jp/hippo2000/perltips/module_install.htm
>606はココ読んで勉強しなさい
652606:03/04/04 22:05 ID:???
>>651

解決しました
time-hiresとhttp-liteは入れたんですが、一つ足りなかったようですね
なんか勉強不足で訳分からない事言ってたと思いますが
ありがとうございます
653nobodyさん:03/04/05 01:50 ID:???
自作CGIを評価してくれるサイト知りませぬか?
654nobodyさん:03/04/05 03:01 ID:???
>>653
俺が評価してやる。貼れ。
655nobodyさん:03/04/05 03:40 ID:???
漏れも自作CGIを評価してくれるスレが欲しいな
せっかくだから653が立ててよ
ていうかこのスレでガンガン貼っていってもいい?
一応初心者ってことで質問とは限ってないみたいだし
656nobodyさん:03/04/05 04:00 ID:???
ソース貼るなら
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html
で専用スレ立てる方がいいぞ。
半角空白とかそのまま貼れるし。
657nobodyさん:03/04/05 04:14 ID:???
iisで鯖公開したら違反ってマジで?
なんでそうなるのよ?
じゃあiisってなにするためにあるの?
658nobodyさん:03/04/05 05:12 ID:???
>>657
製品の価格を高くするためでは?
659nobodyさん:03/04/05 05:13 ID:???
配列@dataには[0-9],\n,\tとスペースが含まれてます。
それを確かめるためのif文はどう書けばいいのでしょうか?
要するに、
if (配列@dataに、[0-9],\n,\tとスペース以外が使われている){
&error;
}
この( )の中の記述です。
やっぱforeach等でまわさないとダメっすか?
660nobodyさん:03/04/05 05:25 ID:???
>>659
if (join('', @data) !~ /^[0-9\n\t ]+$/){
&error;
}
661659: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を みんなに評価してもらうレスだよ
663nobodyさん:03/04/05 11:59 ID:???
>>661
>きゃははははは! (もう笑うしかない。。。 自爆)
                            ~~~~~~
664nobodyさん:03/04/05 12:13 ID:???
>>655
独立したスレの方がいいと思う。。。ここではPerl以外はスレ違いになるし。
665nobodyさん:03/04/05 12:21 ID:???
というわけで立ててくる。
666nobodyさん:03/04/05 12:45 ID:???
>>665
>>656に関しても頼む。
667653でつ:03/04/05 14:07 ID:t4dpk1aS
ここに春には長過ぎまつ

掲示板を作ったのでつが、細かい部分から全体の流れまでを評価してくれるサイトを知りたかったのでつが・・・
668nobodyさん:03/04/05 14:08 ID:???
>>667
せっかく専用スレを立てたんだから活用してくれよ。
http://pc2.2ch.net/test/read.cgi/php/1049514428/
669nobodyさん:03/04/05 14:51 ID:???
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);
670nobodyさん:03/04/05 15:31 ID:???
errorが何をする関数か分からん。その中でexitしてたら結局同じ。
openとcloseをどう並べ変えようが無理じゃないかな。
DAT書き込みが失敗したらLOG書き込みを「自分で」削除することが必要。
671nobodyさん:03/04/05 15:43 ID:???
>>670
&errorの中でexitします
んで、質問はopenで失敗したらだったんですが、
たしかに書き込みで失敗したら一緒ですよね

でも例えば$logfileのmax行数が決まってて、
書き込み処理のなかでmaxを超えてたら古いのを削除とかしてると、、、

こういう複数ファイルの処理の時ってどうするべきなんですかねぇ?
みなさん気にせず書いてるものなんですか?
672nobodyさん:03/04/05 16:01 ID:???
正式なファイル名で中途半端な物を作るのは良くない。
完全な物を作ってからリネームするのが普通。
673デフォルトの名無しさん:03/04/05 16:03 ID:E+nPGg0Q
>>669

>↑こんなときにdatfileを開くところでエラーが出たとき、
それより、書き込むには、
open (LOG,>$logfile) ってしなきゃだめだよ。
open (LOG,$logfile) で書き込めてるなんておかしいよ。
慎重に質問しれ。
674669:03/04/05 16:22 ID:???
>>672
なるほど。テンポラリーを作っといてリネームするんですね
勉強になりました。ありがとうございます。
>>673
すいません。読み込みのところからコピペしたんで忘れてました。
675nobodyさん:03/04/05 17:40 ID:EfZ+i867
コンビネーション{nCr}の計算をしたいんですが結果がおかしいんです。
多分オーバーフローしてるんだと思うんですけどいい方法無いですか?
676nobodyさん:03/04/05 17:46 ID:???
まず原因を突き止めなさい。闇雲に動いても意味無い。
677nobodyさん:03/04/05 18:04 ID:???
>>675
BigIntでも使えば。
678nobodyさん:03/04/05 18:06 ID:MPfOwriq
>>677
どーもっす。調べてみます。
679675:03/04/05 18:11 ID:MPfOwriq
>>677
ダメでした。
今やりたいのは十進で60桁程度の演算なんですけど
そういう計算したいときにみなさんはどうやってやるんでしょうか?
680nobodyさん:03/04/05 18:15 ID:???
>>679
そろばん
681nobodyさん:03/04/05 18:31 ID:???
>>679
だから本当にオーバーフローのせいなのか?計算式間違ってるとか
682nobodyさん:03/04/05 18:52 ID:???
>>681
forの中身が間違ってました。
スレ汚し申し訳ないです。
683669: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でエラー出たら一緒じゃないですか?
684nobodyさん:03/04/05 19:11 ID:???
>>683
リネーム失敗なら、テンポラリを削除して処理を終了でいいでしょ。
読み書きは正常なのに……とかセコいこと考えないで、完全エラー無し以外は
すべて異常終了扱いにしたほうがいい。
685nobodyさん:03/04/05 19:13 ID:???
1つ目のrenameが成功して2つ目のrenameが失敗すると困りませんか
686nobodyさん:03/04/05 19:15 ID:???
1,2,3,10,22
という配列があって sortすると
1,10,2,22,3となってしまいます。
これを1,2,3,10,22のように実際の大きさ順に
ソートするにはどうすればいいのでしょうか?
687nobodyさん:03/04/05 19:18 ID:???
sort {$a <=> $b}
688nobodyさん:03/04/05 19:20 ID:???
renameは失敗しないことにする。
689nobodyさん:03/04/05 19:27 ID:???
>>688
それでは最終的に元ファイルが更新される保証がない。

690nobodyさん:03/04/05 19:31 ID:???
>>689
「元ファイルが更新される保証」はいらないだろ。
「$logfileと$datfileの整合性が保たれる保証」が必要。
691669: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);
↑こうして追加してたんですけど、
一度テンポラリファイルを作ってリネームとなると、
全て読み込んでから新しいのを足したものを上書き
しないといけなくなりますよね?
処理の重さは変わらないですか?
692nobodyさん:03/04/05 20:08 ID:???
もちろん重くなる。
でも、やらなきゃならないんなら、しょうがない。
693nobodyさん:03/04/05 20:16 ID:???
>>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

むちゃくちゃだけど、こんなんはどうですか?
694Perlですが:03/04/05 20:17 ID:qMi3a/lA
ファイルをアップロードするシステムを構築していますがわからないことだらけです。
index.cgiのFORMデータをsubmit.cgiに引き渡して処理させたいのですが、どうやればいいのでしょうか?
親切なアドバイス待ってます。
695nobodyさん:03/04/05 20:22 ID:???
696あぼーん:03/04/05 20:36 ID:???
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://saitama.gasuki.com/mona/
697669:03/04/05 20:41 ID:???
>>693
わざわざ有難うございます。
ちょっとわからない事だらけなんで調べてきます。
698Perlですが:03/04/05 20:41 ID:qMi3a/lA
>>695
それではなくて他に方法はありませんか?
699nobodyさん:03/04/05 20:55 ID:???
>親切なアドバイス待ってます。
なんかムカつく。

submit.cgiでおこなう処理をindex.cgiの中から呼べばいいだろ
わざわざ"引き渡す"意味がわからん
700nobodyさん:03/04/05 21:14 ID:???
>>693
if ($pointer != 0)
の条件判断は不要な気がする。
701nobodyさん:03/04/05 21:19 ID:???
ファイルポインタ?
702nobodyさん:03/04/05 21:48 ID:???
>>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の整合性を保つためのもっといい方法があるのだろう・・・
703nobodyさん:03/04/05 21:51 ID:???
>>699
>>親切なアドバイス待ってます。
>なんかムカつく。
>>694は、あまりにもアレな質問して叩かれたことがあるに1000クックブック
704nobodyさん:03/04/05 22:14 ID:???
>>702
tell(LOG);で0を返すんですが・・・
705nobodyさん:03/04/05 22:18 ID:???
>>704
「>>」でopenすれば、ファイルの末尾の位置を返すよ。
706nobodyさん:03/04/05 22:28 ID:???
>>705
$pointer = tell (LOG);

windowsじゃtell使えないんでしょうか?
なぜか0を返すんです。
ちゃんとその後printしたものは追加書き込みになってるんですけどねぇ
707705: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になるのかなぁ。わかんねぇ。
708nobodyさん:03/04/05 22:42 ID:???
$ 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
709nobodyさん:03/04/05 22:51 ID:???
あ、他がおかしいんですね。お騒がせして申し訳ないです。
調べてきます。
710 :03/04/05 23:10 ID:sLGWgkab
PerlでGUID取得する方法ないっすかね?
711nobodyさん:03/04/05 23:11 ID:RuMeXkuC
ハッシュの値で並び替えを行いキーと値を表示したいのですがどうすればいいでしょうか
712nobodyさん:03/04/05 23:27 ID:???
sort {$hash->{$a} cmp $hash->{$b}} keys(%hash)
713間違えた:03/04/05 23:28 ID:???
sort {$hash{$a} cmp $hash{$b}} keys(%hash);
714nobodyさん:03/04/05 23:30 ID:RuMeXkuC
>>713
ありがとうございます.できました!
715nobodyさん:03/04/06 00:32 ID:httIMQcy
クッキーがあるかどうか確認する方法を教えてください。
716 :03/04/06 00:43 ID:88ZLH8qE
>>715
$ENV{'HTTP_COOKIE'}に値がはいっていれば在り、無ければ無し
717nobodyさん:03/04/06 00:53 ID:/U6PDdMC
>>716サソ
それは自分のCGIから吐き出されたクッキーなんですか?
718 :03/04/06 01:00 ID:88ZLH8qE
>>717
それはクッキーの設定次第w
http://www.futomi.com/lecture/cookie/index.html

自分とこのクッキーかどうか確認したい場合は、クッキーの内容を確認してw
http://www.futomi.com/subroutine/getcookie.html
719nobodyさん:03/04/06 02:34 ID:ONKJQ6B1
PerlでUserAgentを書き換えるにはどうすればいいんですか?
720nobodyさん:03/04/06 02:37 ID:???
>>719
「何の」UserAgentを書き換えたいのか?
721間違えた:03/04/06 02:58 ID:???
$ENV{'HTTP_USER_AGENT'} = "もじら Version 2.3";
でいいだろ。
722nobodyさん: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' は内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
こうなります。
723nobodyさん:03/04/06 03:11 ID:???

まず

C:\Documents and Settings\***>perl   -v

と打ってみろ。それでも失敗したら

C:\Documents and Settings\***>PATH

の結果を貼れ

>>721の名前欄無視して)
724nobodyさん:03/04/06 03:11 ID:???
>>722
PATHが通っていないのでは?
725nobodyさん:03/04/06 03:14 ID:???
>>723
有難うございます。いけました>perl -v
でもなぜですか?
726nobodyさん:03/04/06 03:22 ID:???
ってゆうか、perl -v って打つのが普通なんですね。
この前見たページ確認しにいってきたらスペース入ってました。
すいませんでした
727nobodyさん: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と解析されるようにしたいです。

728nobodyさん:03/04/06 04:01 ID:???
>>727
はyahooがアクセス解析してると仮定してます。
729nobodyさん :03/04/06 04:02 ID:???
my $ua = LWP::UserAgent->new;
$ua->agent(Saitama');

perldocなり、cpan也でもうちょっと調べるべきであるかな
730nobodyさん:03/04/06 08:03 ID:xn7ICdMG
CGIを設置しているのですが
.cgiのファイルをいじっていて、その中にメールアドレスを
書こうとしたらエラーになります。

どうも@を書くとエラーになるようですが
cgiの中に@を記入したい場合どうしたらよいのでしょうか?
731nobodyさん:03/04/06 08:09 ID:???
ダブルクォートでくくられた文字列の中にメールアドレスを
書こうとしているのだと想像します。

その場合、@ が配列変数として認識されてしまっているので、
@ の直前に \ をつけて書くことをお勧めします。

あるいは、変数が展開されないシングルクォートで、文字列
をくくるという方法もあります。

今後は、エラーが出たときは、エラーメッセージをここに
貼り付けてご質問されることをお勧めします。
732nobodyさん:03/04/06 08:09 ID:???
$email = '[email protected]';
$email = "foo\@example.com";
$email = q([email protected]):
733あぼーん:03/04/06 08:37 ID:???
     ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´∀`)/<先生!こんなのがありました!
 _ / /   /   \___________
\⊂ノ ̄ ̄ ̄ ̄\
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/saitama/
734nobodyさん:03/04/06 08:41 ID:???
packageってC++のnamespaceみたいなもの?
735あぼーん:03/04/06 08:42 ID:???
736nobodyさん:03/04/06 11:52 ID:xQ2onnJ6
perlで指定したサーバーが稼動しているか倒れているか調べる関数か何かありますか?
自鯖構築に利用したいのですが、独自ドメインからWebサーバーに飛ばして、
そこで、perlが処理するのですが、

if ($自鯖稼動状態 == 1) {
  print "Location: $ZISABAurl\n\n";
} else {
  print "Loaction: $WEBSABAurl\n\n"
}

みたいにしたいのですが。
737bloom:03/04/06 12:25 ID:Ne2teiuv
738あぼーん:03/04/06 12:39 ID:???
   ______________
 /:\.____\
 |: ̄\(∩´∀`) \  <先生!こんなのがありました!
 |:在  |: ̄ ̄ U ̄:|
http://saitama.gasuki.com/aomori/
739あぼーん:03/04/06 12:43 ID:???
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/koumuin/
740邪穂:03/04/06 13:36 ID:xn7ICdMG
>>731-732
(´皿`;)了解しました。どうもありがとうです。
741nobodyさん:03/04/06 18:25 ID:???
Perlについての質問箱 4箱目
http://pc2.2ch.net/test/read.cgi/tech/1048519394/l50
742nobodyさん:03/04/07 04:20 ID:???
>>741
厨が迷い込んでくるから貼らないでくれよ…
743nobodyさん:03/04/07 10:56 ID:???
>>742
プッ
744nobodyさん:03/04/07 12:23 ID:???
早いな。
745nobodyさん:03/04/07 21:42 ID:???
春休みが終わった途端に加速していたスレが止まりましたね。
746nobodyさん:03/04/08 05:31 ID:???
花見で忙しいんだ罠
747nobodyさん:03/04/08 07:17 ID:???
外部に置いた設定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";

という感じにしても駄目でした。
748nobodyさん:03/04/08 07:27 ID:???
>>747
直接の回答じゃないけど、スカラー変数の名前をtxtファイルで
指定しとくのはやめたほうがいいんじゃないかな。
ハッシュでやりましょう。
749747:03/04/08 07:41 ID:???
>>748
いや、本当はやりたくないんですが、既存のFileを再利用しつつ
新規のprogramを作れというデムパな指令がおりてきまして・・・

なにやらNTT謹製のcgiがこの方法を使っているとかで、既存のFileを
出来るだけいじらずにProgram側で処理しなくちゃならんという事に
なったので困っている次第なのです。

#やっぱ'$'消して連想配列に突っ込むってのが一番安全な方法かなぁ。
750nobodyさん:03/04/08 07:52 ID:???
require "param.txt";
じゃだめなの?
751nobodyさん:03/04/08 07:56 ID:???
requireが駄目なら、
perl -e '$a="param1"; $$a="value"; print $param1;'
っていう方法もあるよ。
適当に書くと
foreach(@buf){
 my ($var,$val) = split(/=/,$_);
 $$var = $val;
};

print $param1;

(合ってるかな?)
752nobodyさん:03/04/08 08:03 ID:???
ちょっとだけちゃんと書いてみた。スカラーだけ。その他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";
753747:03/04/08 08:11 ID:???
>>750
えぇと、元になるparam.txtが複数(別名で)有って、呼び出される時の
パラメータ(formの内容次第)で読み替える様にしなくちゃならんので
requireは使用不可と判断しました。

>>751
なるほど、「可変変数」という手が有ったのですね。
あとは改行と「'」消しだけで問題無く(根本的解決では無いが)出来そう
です。

ありがとうございますです。
754747:03/04/08 08:17 ID:???
>>752
あ、入れ違いで、、、
意図した通りに動作しました。
ありがとうございます。
755nobodyさん:03/04/08 08:53 ID:???
>>753
%form = フォーム;
require $form{'whichfile'};
じゃだめなの?
756747:03/04/08 11:02 ID:???
>>755
whichfileが存在しない場合ってエラーになりませんでしたっけ?
・・・という事を考えて敢てFile読み込みの方向で考えていたんですが。
757nobodyさん:03/04/08 11:05 ID:KoNa94bz
掲示板作ってます。
記事の削除機能、修正機能を加えたいと思っています。
記事ナンバーとパスワードを入力し、該当の記事を引き出す事には成功しましたが、
そこからのログファイルの操作?がよく分かりません。
よろしければご教授下さい。お願いします。。
758nobodyさん:03/04/08 11:11 ID:???
>>757
それだけでどうやって答えろって(ry

該当レスをテキストエリアにでも表示させて編集後に再書込み
該当レスを削除してログを前につめるか削除メッセージで代替して再書込み

そんなとこじゃないの
759757:03/04/08 11:33 ID:sQEXk45G
>758

すいません、、ありがとうございます。
760nobodyさん:03/04/08 11:50 ID:???
>>756
-f で確認したらいいだろ?
761nobodyさん:03/04/08 17:58 ID:???
中にファイルが入ってようが無かろうが関係なしに
ディレクトリを削除ってことはできないですかね?
rmdirじゃあ、中に入ってると消してくれないんで
762nobodyさん:03/04/08 18:14 ID:???
>>761
Linux だったら
rm -rf /
763nobodyさん:03/04/08 19:07 ID:???
今日、STDOUTをtieしてContent-Lengthを出すっていうのを
思いついたんだけど、同じ事考えた人っている?
764nobodyさん:03/04/08 19:08 ID:???
>>762
れすどうもです。
これは何でしょう?コマンドかなんかでしたっけ?
んーやっぱりディレクトリの中調べて、全部消してrmdirにしようかな
765nobodyさん:03/04/08 19:17 ID:???
766nobodyさん:03/04/08 19:35 ID:???
$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";
ってやってます。
もっと簡単にできる(書ける)方法を伝授くださいませ。
767nobodyさん:03/04/08 19:46 ID:???
>>766
ハッシュにすれば?
768nobodyさん:03/04/08 19:50 ID:???
for ($i = 0; $i <= 10; $i++) {
$data{$i} = "$i番目の要素";
}
for ($i = 0; $i <= 10; $i++) {
print "$data{$i}\n";
}
こんな感じね。
769nobodyさん:03/04/08 20:12 ID:???
>>766-768
んなことせんでいい。

foreach (0..10) {
  print ${"data$_"};
}
770nobodyさん:03/04/08 20:28 ID:???
>>769
わかってるが
$data1〜$data10 っていうのはみると気持ち悪いんだYO!
771766でつ:03/04/08 20:28 ID:???
>>769
すっきりでつ!
改行が入ってなかったんでちょっと悩みました。
772766でつ:03/04/08 20:29 ID:???
>>770
何で〜?
773nobodyさん:03/04/08 20:44 ID:???
アホっぽいから。
774nobodyさん:03/04/08 21:11 ID:???
ぎゃあああああああああああああああああああああああああああああああああああああ
775nobodyさん:03/04/08 21:12 ID:???
ごめん・・・
本当にあった怖い話実況スレと間違えた・・・
776nobodyさん:03/04/08 21:49 ID:???
ワロタ
777nobodyさん:03/04/08 23:02 ID:???
禿藁
778 ◆hMJAPH9PWA :03/04/08 23:29 ID:???
>>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;
779nobodyさん: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 で安定したプログラム作るとき、
こういうのもやめたほうがよい?
780251:03/04/09 01:41 ID:???
シンボリックリファレンスは使わぬほうがいいんだけどなぅ・・・
せめて配列を覚えよーよ・・・
781nobodyさん:03/04/09 05:00 ID:7s8viccH
>>779
evalの実行結果が残ると思っているならんなことはない
というか、oオプション使ったマッチングで結果が残らないようにわざとevalでくくったりする
evalの中はコンパイルされないのよ。単なる文字列だから。だから実行中にランタイムエラーを拾える。

未定義値の参照は、mod_perlでも問題ないよ。(たしか)
ただ、未定義の領域にアクセスするなんてperlだから許されることで、
お勧めはしない。
(個人的には-wオプションでランタイムで出る警告気にしてたらperl使う意味無いと思うけど。)
782nobodyさん:03/04/09 05:36 ID:???
>>779
evalは>>781の通りで、mod_perlでの問題はないはず。
蛇足だがグローバル変数のほうを気にしたほうが。

-wでのwarnは、漏れは気にしてしまうほうだが
配列の添字を直接指定して使うことがあまりない。
必要なときはdefinedや要素数で念のためチェックする。
783 ◆hMJAPH9PWA :03/04/09 11:32 ID:???
-wの警告は気にするな。
本当にその警告が出ても問題ない場合は、no warnings 'warnings-category';として一時的に警告を無効にすればいいんだし。
784nobodyさん:03/04/09 13:23 ID:azVD19ZG
lanにあたっているグローバルアドレスを、取得するにはどのような方法が
あるでしょうか?
外のサーバにアドレスを吐き出すプログラムを置いて、チェックする方法以外を
教えてください。
785nobodyさん:03/04/09 13:26 ID:1sAaMz5U
質問です。cgiでC言語のように
バイナリーファイルを読み込もうと思うのですが、
どうも変数に何も入らないみたいです。

open(IN, 'test.bin');
binmode(IN);
sysread(IN, $buf, 64);
close(IN);

何がいけないのでしょうか?
786nobodyさん:03/04/09 13:41 ID:???
>>785
そのC言語のようにってどういう意味?
787785:03/04/09 13:48 ID:1sAaMz5U
>>786
自分はC長いことやってて、perlは初心者なんですが、
perlだとテキストを行単位で読み込むことは簡単ですが、
バイナリーをバイト単位で読み込む方法がよくわからない。
というか、どうやってもうまくいかない。
Cだとstdioでもioでもバイナリー読み込みは簡単に出来るのに
perlにはそういう機能が無いのかなと思って。
788nobodyさん:03/04/09 13:54 ID:???
>>787
Perlならreadでできるはず。
Cをやっていたのならfreadは知っているよね?あれと同じようなもの。
789nobodyさん:03/04/09 14:04 ID:???
>>785
何がいけないんだろね。
とりあえず俺の環境ではそのソースで動いたよ。
syswrite で変数の中身出して目で比較したんだけども。
790nobodyさん:03/04/09 14:06 ID:???
>>785
一行目を見逃してた。

>cgiで
いきなりCGI?ローカルではちゃんと動いたってことか?
791785:03/04/09 14:08 ID:1sAaMz5U
大変申し訳無い。
まったく別の部分が原因でデータがうまく取得できてなかったみたい。
つまんない質問でスレを汚してしまってすみませんでした。ペコーリ
792nobodyさん: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関数で上手くいかないものなのでしょうか?
ご教授をお願いします!
793nobodyさん:03/04/09 18:34 ID:???
どうしてそこで push が出てくるのか良くわかんない。
794nobodyさん:03/04/09 18:35 ID:???
pushよりspliceの方がいいと思うが。
795nobodyさん:03/04/09 18:40 ID:???
>push関数で上手くいかないものなのでしょうか?
自分なりに使う関数を思いついてるのに、何故実行に移さぬのですか。
GOサインもらわんとコード書けんわけでもないでそ。
796nobodyさん:03/04/09 18:45 ID:???
>>795
pushを使えばうまくゆくと思いやってみたが、うまくゆかなかったということだろ。
797792: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の方がベストなんでしょうか?
798nobodyさん:03/04/09 18:52 ID:???
>>797
\nも入れりゃいいじゃん
799792:03/04/09 18:56 ID:FE+VX2Y9
>>798
入れ替えるところだけを変えるので、
そこは\nを入れているのですが…
800nobodyさん:03/04/09 19:00 ID:???
ソース晒そうよ
801nobodyさん:03/04/09 19:02 ID:???
>>800>>792 に向かって言ってるんだよな?
だったら同意見。

つか、まっさきにソースさらすべきだろ。
802nobodyさん:03/04/09 19:08 ID:???
よーしパパ、1000行あるソースを全部貼っちゃうぞ〜
803nobodyさん:03/04/09 19:27 ID:2liy07Cv
大人の出逢いから ピュアな出逢いまで・・・。
素敵な お相手が貴方を待っています!
もちろん 女性は完全無料です!
http://www.sweet.st
804nobodyさん:03/04/09 19:32 ID:???
>802

やっちゃぇ〜ぱぱぁん♪
805nobodyさん:03/04/10 02:09 ID:???
foreach(@lines) {
 chop;
 my ($no,$aisatu,date) = split(/<>/);
    ・
    ・
    ・
 push(@new,$_\n)
}
806nobodyさん:03/04/10 04:43 ID:???
↑つーかめちゃくちゃだわ。ごめん
807nobodyさん:03/04/10 05:27 ID:???
foreach $key ( keys( %hash ) ) {
}
こうすると、キーを文字コード順で並び替え、
処理することができるんですが、
数字順?で並び替えて処理するのは可能でしょうか?
可能なら方法など教えていただけないでしょうか?

つまり上のなら
122 , 13 , 1778 , 2
と並ぶとおもいますが、
2 . 13 . 122 . 1778
でソートして処理したいってことです。
808251:03/04/10 05:43 ID:???
>>807
それは無理ですね。
只、ハッシュのkeyを配列に入れなおすなりしてその結果を
ソートの種値にもってくのは可能です
809nobodyさん:03/04/10 05:53 ID:???
>>807
>こうすると、キーを文字コード順で並び替え、

残念。そのままでは並び替えはされません。
文字コード順に並び替えるには、sort をつけるだけでok。

foreach $key (sort keys %hash) {
}

数字順にするには、sortに条件式を指定してやります。

foreach $key (sort { $a <=> $b } keys %hash) {
}
810806:03/04/10 05:58 ID:???
>>808
そうですか・・・
そうやって配列に入れてる説明をしてるサイトがあったんで、
もしかしたら、無理なのかなぁと思いながらも質問してみました。
有難うございました
811nobodyさん:03/04/10 06:00 ID:???
>>809
あぁごめんなさい
sort書いたつもりで、書いてないところコピペしてしまってました。

てか、えっ?
foreach $key (sort { $a <=> $b } keys %hash) {
}
これいけるんですか?確認してきます
812nobodyさん:03/04/10 06:06 ID:???
下のやついけました。
有難うございました。
813あぼーん:03/04/10 06:16 ID:???
814佐々木健介:03/04/10 06:16 ID:???
     ______
    /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /    -  - |
  ||| (5      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃─┃|  < こんなサイトを見つけた
|| | | |  \ ┃  ┃/    \  正直、スマンカッタ
| || | |    ̄         \_________
http://saitama.gasuki.com/kensuke/
815かおりん祭り:03/04/10 06:16 ID:???
http://www.saitama.gasuki.com/kaorin/
       こんなのございま−す♪
       ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        〜oノハヽo〜
  ,.-''"¨ ̄●`' ‐(^▽^)
 (,,●i,,,i,,,,,,,,i,,,,●),,)⊂ )
    )  (    || |   
    ( ^▽^)  (_(__)
~~~~~  ̄ ̄ ~~~~~    ~~~~~
816nobodyさん:03/04/10 06:18 ID:???
それ流行ってんの?
817nobodyさん:03/04/10 11:49 ID:???
変数で変数名を決めてるのですが、微妙に複雑化してきた所でエラーになりました。

${"data$form{name$no}"}{'age'}

これなんですが、
どうもエラーの原因は「$form{name$no}」これっぽい。
でも、ダブルクウォートの中にダブルクウォートなんて書けないし、どうしたら良いでしょうか?
818nobodyさん:03/04/10 12:13 ID:???
>>817
> ${"data$form{name$no}"}{'age'}
${'data'. $form{'name'. $no}}{'age'}
とか。

でもそれ、基本的なところから見直したほうがいいのでは・・・。
819nobodyさん: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;
}
}
----
宜しくお願いします。
820nobodyさん:03/04/10 12:24 ID:???
>>819
そんな部分のコードだけ見たってわかるわけないだろ
いじったのならオリジナルに戻せばいい
821nobodyさん:03/04/10 12:25 ID:???
>>819
ここでCGIの質問すんなハゲ。
822鮮民:03/04/10 13:29 ID:oo4Xo2Ys
>>817
$data = {
 01 => {
  neme => 'name',
  age => 'age',
 },
};
$data->{$form{'no'}}->{'age'};
こんな感じにしてみたら?
823817:03/04/10 13:31 ID:???
>>818
どうもです。変数名の中で演算子も使えるとは知りませんで…。

>でもそれ、基本的なところから見直したほうがいいのでは・・・。
出来るだけコンパクトになるよう考えてこれなんですよ…お恥ずかしい限り。
824817:03/04/10 13:39 ID:???
>>822
時間差で気付きませんで。
リファレンスですね。ちゃんと勉強してみようかな。

今までなんとなく避けてたし…。
825nobodyさん: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の方でうまいぐあいに文字コードを変換(?)してメールするようにしたいんですが・・・
なにか方法とか参考になるサイトなどありましたらアドバイスよろしくです
826nobodyさん:03/04/10 13:55 ID:???
まず、実際にメールを送信する前に、
テキストファイルに落とす等ちゃんとテストしてくれ。

んで、文字コードの件は、Jcode.pm か jcode.pl で。
あと charset に iso-8859-1 を指定したい理由が不明なのだが?
827nobodyさん:03/04/10 14:05 ID:5ksdsSWS
>>826
一応、実際にメールを送信する前に
フォームに入力された文章の確認画面があるんですが
ここでは正常に日本語が表示されてるようです。
(吐き出されたHTMLのソースを見ると日本語が「???」などとなってる)

メールのヘッダに指定するcharsetは何を指定すればいいのか
分かんないのでHTMLの方とあわせただけです・・・
一応、メールの送信前にはPerl内で
&jcode'convert(*msg, 'jis');
などとはしているんですが、受信したoutlookの方では、そのまんま
日本語の部分が「???」などとなってしまう状態です・・・

jcodeでどんな変換が必要でメールのヘッダに
何のcharsetを指定すべきなんでしょうか・・
828825:03/04/10 14:08 ID:5ksdsSWS
あれ、なんか???になっちゃいましたが
「???」の部分は
「&#12354;&#12354;&#12354;」てな感じです。
829nobodyさん:03/04/10 14:11 ID:???
ぎゃあっ!!

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
>>830>>817さんへです。
832鮮民:03/04/10 14:32 ID:oo4Xo2Ys
間違い発見
@fields = qw(num name age tel);
$fields = [qw(num name age tel)];
意味は無いけどレファレンス。
833あぼーん:03/04/10 14:43 ID:???
あぼーん
834825: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;のまんまのようで・・・
835nobodyさん:03/04/10 14:55 ID:???
いったい、どんなコード書いてるんだ???
836nobodyさん:03/04/10 15:00 ID:???
丸ごとtextにしてUPしたほうが早い
837nobodyさん:03/04/10 15:02 ID:???
いや、書いてるコードは想像できるよ。
単にそのまま sendmail に渡してるだけでしょ。

> そのまんま &#12354;&#12354;&#12354;
当たり前じゃん。
ちなみに「あああ」って書いたんでしょ?>>834
838nobodyさん:03/04/10 15:35 ID:???
>825
> <HEAD>内でcharset=iso-8859-1を指定して書かれた
> HTMLのフォームから日本語で文章を打ち込んでメールを送信したいんですが
ブラウザによってはページの文字コードを無視して送信するものもあるので、
こういったやりかたはあまり推奨されない。
きちんと文字コードを取得してから変換すべし。
839825:03/04/10 15:37 ID:5ksdsSWS
>837
はい、「あああ」です。

かいつまんで
http://rivernet.cool.ne.jp/upload/img/200304101536_test.lzh
にテストファイルあげてみました。
HTMLは変更せずにtest.cgiの中だけでなんたら変換して
メール送信してoutlookにて正常に日本語をよみたいんですが・・
840825:03/04/10 15:39 ID:5ksdsSWS
あ、test.cgi中のメールの送信先が
[email protected]になってますので、ほんとにテストするときは変更お願いします
841nobodyさん:03/04/10 16:00 ID:???
>>837
そこまで書いてなぜ正解を書いてあげないの〜?

>>834
>フォームから受け取った文字が、すでに
>&#12354;&#12354;&#12354;のような形ですので

HTMLの ?数字; 表記法を参照のこと。

これを正しい文字コードにそのまま変換できるモジュールあるのかな?
?数字;を抜き出して一文字ずつjisに変換するしかない?
842841:03/04/10 16:01 ID:???
しまった化けた。もう一度。

>>834
>フォームから受け取った文字が、すでに
>&#12354;&#12354;&#12354;のような形ですので

HTMLの &#数字; の表記法を参照のこと。

これを正しい文字コードにそのまま変換できるモジュールあるのかな?
&#数字;を抜き出して一文字ずつjisに変換するしかない?
843nobodyさん:03/04/10 16:14 ID:???
>>841

837ですが、

1. 数値文字参照から charset=iso-2022-jp に適合するように変換する
  効果的な方法を私も知らない
2. <FORM> のページが charset=iso-8859-1 という時点で
  努力する方向が間違ってる気がする
3. 既にPerlの領域じゃない気がする

以上です。
844841:03/04/10 16:29 ID:???
>>843
どうしてこうなるのか不思議に思ってたんだが、
フォームのページの問題を読み忘れていたようだ…。

というわけで>>825よ。
フォームのページのcharsetを日本語にしてみてくれ。
そもそもの問題はここにあると思われ。
845nobodyさん:03/04/10 18:09 ID:???
リンクなしが主流になる中、
ユーザーも規約が緩いサイトに流れるけど
多少規約が厳しくても(無論常識内)ファンが絶たないサイトみると
やっぱ実力なのかなぁ、、、とちょっと憧れる。
846nobodyさん:03/04/10 18:11 ID:???
ごめん、、素材スレと誤爆〜・・・・
847nobodyさん:03/04/10 18:46 ID:???
配列なら$#をつかって配列の個数を知ることができましたが、
ハッシュだとややこしいことしないと、
いくつ入ってるかを知ることはできないのでしょうか?
848nobodyさん:03/04/10 18:48 ID:???
849nobodyさん:03/04/10 18:55 ID:???
>>847
$num = keys %hush;
スカラーコンテキストでkeys関数を使う。
850nobodyさん:03/04/10 18:56 ID:???
scalar keys %hash
851nobodyさん:03/04/10 18:56 ID:???
>>849
hushじゃなくてhashでしょ。
852nobodyさん:03/04/10 18:58 ID:???
えっと、だめもとで、
ハッシュで$#これやってみたら、
期待してたとおりの動作が得られました。
いろんなサイトで探したんですけど、
見つからなかったんで質問させていただいたんですが・・・

それと、皆さん全然違うの書いてくださってますよねぇ?
$#使っちゃだめなんでしょうか?
853849:03/04/10 18:59 ID:???
逝ってきます
854nobodyさん:03/04/10 19:00 ID:???
あ、うそですすいません。
勘違いしてました
855847,852,854:03/04/10 19:02 ID:???
すいません。>>852は勘違いでした
>>849さんのでいけました。
ありがdです
856nobodyさん:03/04/10 19:25 ID:???
ふぅ
857nobodyさん:03/04/11 03:32 ID:Ngj0Yn4X
某所スレで聞いたらスルーされてしまったのでこちらで再度
質問させてください。

http://sabbath-jam.com/top/det/det_1.html
↑の掲示板使ってるんですが、改造して、新規投稿があったときに
自分のケイタイにお知らせメールが届くようにしたいんです。
もし可能なら、組み込むscriptを教えていただけないでしょうか?
858nobodyさん:03/04/11 03:36 ID:???
(´-`).。oO(某スレはまったく見当違いだからスルーは当然だな・・・)
(´-`).。oO(ここでもスレ違いとスルーされるだろうな・・・)
859nobodyさん:03/04/11 03:41 ID:Ngj0Yn4X
>>858
(´-`).。oO(適切な場所に誘導してください。。)
860nobodyさん:03/04/11 03:45 ID:???
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/l50
861nobodyさん:03/04/11 03:52 ID:Ngj0Yn4X
>>860
神!サンクスでつ
862nobodyさん:03/04/11 04:03 ID:e9H5z3qo
ハッシュの中に配列のデータを入れたいのですが、
何か良い方法ありますでしょうか。
863nobodyさん:03/04/11 04:19 ID:???
>>862
%hash = @array;
864nobodyさん:03/04/11 04:22 ID:e9H5z3qo
>>863
言い方悪くてごめんなさい。
私が描いているイメージは
$hash{key} = @array;
こんな感じです。

もしもできればご教授願いします。
865251:03/04/11 04:22 ID:???
>>863
%hash = \@array;
でそ・・・
866251:03/04/11 04:23 ID:???
>>865
嘘かいてもうた
867251:03/04/11 04:27 ID:???
>>864
$hash{key} = \@array;

で呼び出しは
$hash{key}->[0];
とかね・・・
868nobodyさん:03/04/11 15:33 ID:???
??????????????-??????! ??????? '????-
?????'??????????????????.????
???????! ??????????????????
869nobodyさん:03/04/11 17:12 ID:+804Cr9x
すんません、ある文字列から頭2バイトだけ取り除いたものが欲しいのですが
my $a = 'abcdef';#欲しいのは$a='cdef'。
substr($a, 0, 2);
print $a;

結果
'abcdef'

となってしまいます…

何か良い方法ありますか?
870nobodyさん:03/04/11 17:18 ID:???
$a = substr($a, 0, 2);
871nobodyさん:03/04/11 17:20 ID:???
872869:03/04/11 18:18 ID:+804Cr9x
>>870
すいません、勘違いするような書き方でしたね。
欲しいのは2バイト取り除いた後の残りの文字列なんです。

この場合はcdefが欲しいのですがabしか取れないんです…
873nobodyさん:03/04/11 18:23 ID:???
>872
向こうのスレで答えもらってるじゃん。
874nobodyさん:03/04/11 18:27 ID:???
マルチに答えるバカがいるスレはここです
875869:03/04/11 18:39 ID:+804Cr9x
向こうでこっちに誘導されたのでカキコんだのですが、皆さんに迷惑を掛けてしまった
ようですね。

どうもスイマセンでした。
876nobodyさん:03/04/11 18:47 ID:???
誘導した奴が悪いということか
877869:03/04/11 19:29 ID:+804Cr9x
>876
いえ、「こちらに行きます」と明記しなかった私が悪いです。
本当に申し訳なかったです。
878nobodyさん:03/04/11 19:48 ID:???
>877
向こうで言われた事をそのまま書くだけか?
自分で考える脳は?

そんな考え方しかできないから、適切なスレに誘導してくれた人に対して
お礼も言えないんだよ。
879nobodyさん:03/04/11 20:17 ID:???
>878
ほっとけよ、生理が伝染るぞ
880869:03/04/11 20:36 ID:+804Cr9x
>>878
なんか会社で怒られてるような気分になりました。
よくこんな感じで怒られるんですよ。

自分はトロいのでやれと言われたことしか中々できないの
ですがもっと自分の頭で考えられるように頑張ります。
本当にすいませんでした。
そしてありがとうございました。
881nobodyさん:03/04/11 20:42 ID:nKHFlgQT
>>880
独り言ヤメレ
882nobodyさん:03/04/11 21:29 ID:???
そうやってみんなでせめんなよ
醜いアヒルの子でも見れ
883nobodyさん:03/04/11 21:33 ID:???
甘やかすだけでは何も前に進まない。
がんすけも分かっているはず。
884nobodyさん:03/04/11 21:34 ID:???
>>869
ガンガレ
885訂正(鬱だ:03/04/11 21:34 ID:???
×がんすけ
○ガァ助
886nobodyさん:03/04/11 22:51 ID:???
× スレ自体を間違えました
○ 板自体を間違えました
887訂正(鬱だ:03/04/11 23:31 ID:???
>>886
良く分かったねw訂正ありがd
888nobodyさん:03/04/12 01:59 ID:Wz2xojvl
基本なんですけどよくわからないので、ファイルを開く時のモードのことで質問があります。
読み書き両用でファイルを開く時、

open (DATA,"+<./data.dat");
open (DATA,"+>./data.dat");

この両者にはどういう違いがあるのでしょうか。
自分でやってみたところ前者は「>>(末尾に追加)」で、後者は「>(読み込んだ時点でファイルが空に)」と同じようでした。
「読み書き両用」の正しい使い方を教えて欲しいです。
889nobodyさん:03/04/12 02:13 ID:???
現在のファイルの内容を残すか長さ0に切りつめるかの違い。
890nobodyさん:03/04/12 02:20 ID:???
>>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;
891nobodyさん:03/04/12 03:02 ID:???
俺ならこう書くな
while (defined(my $article = <LOG>)) {
  next if $article =~ /^\Q$delno\E\t/;
  push @newlog, $article;
}
892nobodyさん:03/04/12 03:29 ID:???
アバウトじゃね?
893nobodyさん:03/04/12 03:37 ID:???
こんばんわ、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には式だけあって数字がなくなってしまう気がしますが
どこから数字をもってきているのでしょうか?

きっとすごい簡単なことなんでしょうけど、教えていただければ幸いです。
よろしくおねがいします。
894nobodyさん:03/04/12 03:42 ID:???
>>893
はあ?
forの$wとsub kの$wは別ものだよ。
895251: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である必要が無い為・・・


896nobodyさん:03/04/12 03:48 ID:???
>>894さん
それはsub kの$wはプライベート変数になっているからですよね?
8行目の$w=$d*$d;で2乗していますけど、そこの$dに入る数字は
どこから持ってきているのでしょうか?

よろしければ教えてください。
おねがいします。
897nobodyさん:03/04/12 03:50 ID:???
>>895さん ありがとうございます!
とても分かりやすい説明で理解することができました!
898nobodyさん:03/04/12 05:49 ID:???
>>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()が正解)
899251:03/04/12 06:00 ID:???
>>898
なるほど、両方ともリストコンテクストか・・・
微妙な所だけど、補足ありがと
900nobodyさん:03/04/12 06:05 ID:???
回りくどい説明だな…。
901888:03/04/12 10:35 ID:???
>>889-891
ありがとうございました。
「読み込みと書きこみを1回のopenでしたい」とまさにその通りでした。
truncate関数なんてものがあったんですね。勉強になりました。
おかげさまで無事解決。
902nobodyさん:03/04/12 11:56 ID:9LVB7yXu
$_ while (<LOG>);

$article while (defined(my $article = <LOG>));
にしている意味は何のためですか?
903nobodyさん:03/04/12 12:58 ID:???
>>902
変数を明示的にするため。
というのが一般的な理由…だと思う。
904nobodyさん:03/04/12 15:47 ID:???
>>901
truncateは使えない鯖があるからevalの忘れるなよ
905nobodyさん:03/04/12 17:18 ID:???
クラスの中の関数を外から呼べないようにする方法はありますか?
906nobodyさん:03/04/12 17:55 ID:???
どうしようもない質問があります。

#!/usr/local/bin/perl

my $test = '表示成功';
&test();
exit;

sub test {
print "Content-type: text/html\n\n";
print "$test";
}
__END__

このスクリプトを実行すると、出力が「表示成功」になります。
何故my宣言したのにこのような事が出来るのでしょうか?
907nobodyさん:03/04/12 18:12 ID:???
>>906
> 何故my宣言したのにこのような事が出来るのでしょうか?
あなたが自宅の部屋に立てたテントの中も
「あなたの自宅の中」だからです。
908はしのえみ好きー:03/04/12 18:15 ID:???
>>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;
909nobodyさん:03/04/12 18:29 ID:???
>907
アンタ説明うまいな、惚れそうだ!(´д`*
910nobodyさん:03/04/12 18:50 ID:???
>>907-908
分かりやすいお答え有難う御座います!
ちゃんと理解&納得出来ました。
911nobodyさん:03/04/12 18:59 ID:???
>>902
<LOG> が 0 とか "" とか返したらループから抜けちゃう。
defined でチェックすればファイル末尾に達するまで確実に真値が返る。
912nobodyさん:03/04/12 19:20 ID:???
>>911
ちょっと気になったので試してみたが、while (defined(my $hoge = <FH>))
while (<FH>) どちらでも "", 0 は出力されたぞ。
913nobodyさん:03/04/12 19:40 ID:???
>>912
漏れもやってみたが、0のみの行があってもループ抜けないよね。
おかしいとおもたよ。
914nobodyさん:03/04/12 19:50 ID:???
というか、、、
0の行→0\n
空白の行→\n
なわけで、偽にはならんわな。
915nobodyさん:03/04/12 20:02 ID:???
>>914
0とだけ書いたファイルでも同じだった。
916はしのえみ好きー:03/04/12 20:14 ID:???
\x00だけのファイルはどうよ?バイナリだが。
917nobodyさん:03/04/12 20:53 ID:???
>>912-916
ごめん、while <> の場合は EOF までちゃんとループしてくれるね。
while(defined($var = pop @array)) { ... } てなのが頭にあったのよ。

>>914
$/ の中身が改行とは限らない。
あんまり意味はないけど $/ = \1; で1 byte 単位とか。
918nobodyさん:03/04/12 21:38 ID:???
>>904
使えない関数がある時evalするべきと聞きますが、そうすると致命的エラーは発生しないものの
当然evalされた関数は実行されないんですよね?
flockとか実行されないとかなりまずいと思うのですがどうなんでしょうか。
evalしたらあとは祈るしかないんですか?

それと使えない関数があるというのはどういうことなんでしょうか。
Perlのバージョンが古いということですか?それともサーバサイドの設定によるものなんですか?
サーバのことは全くと言っていいほど無知なのでわかりません。
だいたい全体の何割ぐらいのサーバが使えないようになっているんでしょうか。
あやしい関数は使うなということなんですかね。
919nobodyさん:03/04/12 22:20 ID:???
evalの是非とは関係なく、>>918はエラー処理しない人の気がする。
920nobodyさん:03/04/12 22:25 ID:???
>>918
代替となるロック処理をするのは当然。
evalはエラーを出さなくするための関数じゃないんだから。

truncateとかflockはOSに依存した関数なので、OSがその機能を実装して
いなければ使えない。
921nobodyさん:03/04/13 00:10 ID:???
私も >>915 さんのように、バイナリで無理やり数字のゼロだけを含む
ファイルでやってみたのですが、やはり!? while のループの中に入って
行きました。

while ($line = <FILE>) { ...

と書いたので、読み込まれた文字ゼロ (0x30) だけが $line に代入され、
そのゼロがそのまま while の条件式の値となって、偽と判断されるはず
だと思うのですが、私は何か勘違いをしているのでしょうか。
922はしのえみ好きー:03/04/13 00:20 ID:???
>>921
>バイナリで無理やり数字のゼロ
>文字ゼロ (0x30)
???
923nobodyさん:03/04/13 00:39 ID:???
>>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
924はしのえみ好きー:03/04/13 00:54 ID:???
>>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

入ってる。
925はしのえみ好きー:03/04/13 00:55 ID:???
>>921
おっと、説明不足だったが、
>バイナリで無理やり数字のゼロ
の意味が分からないってことだよ。
0x30を書くんだったら普通にテキストエディタで"0"って書けばいいんじゃん。
926nobodyさん:03/04/13 01:13 ID:???
>>921
どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。
行入力演算子が undef 返すのは EOF に達した時だけだから、
ファイルは全部読まれるみたい。

統一感の無さは Perl らしいけど、便利と言えば便利。
927nobodyさん:03/04/13 01:15 ID:???
凄く間抜な質問だと思いますが、あえて聞いてください
\0x00とかのコードはどう知ればいいんでしょうか。
どこか一覧表とかあるのかな…。
あと、ずっと気になっていた、画像を生成する際の数字の配列は
みなさんどうやって計算?しているのでしょうか。
928nobodyさん:03/04/13 01:18 ID:???
画像を生成する数字って何?
929nobodyさん:03/04/13 01:23 ID:???
>928
ダミー画像などでよく見かける、テキストだけで生成してるやつです。
別に、画像を読み込んで出力すれば良いんだけど
どうやるのか気になってたもので。
930nobodyさん:03/04/13 01:48 ID:???
お絵かきソフトで作って バイナリエディタで覗いてみたら?
色数落としていくとそれになるよ。
931nobodyさん:03/04/13 02:07 ID:???
なるほど、ありがとうー
早速明日試してみる事にします。
今日は眠いのでもう寝ます…。
932はしのえみ好きー:03/04/13 02:18 ID:???
>>927
>\0x00とかのコードはどう知ればいいんでしょうか。
>どこか一覧表とかあるのかな…。
http://www.psl.ne.jp/perl/pdojo00b.html
933nobodyさん:03/04/13 08:46 ID:P9fP4Q1N
934nobodyさん:03/04/13 14:30 ID:???
結局 >>926 からすると、
>>890
while (defined(my $article = <LOG>)) {...
の書き方は助長なのか?
935nobodyさん:03/04/13 14:45 ID:???
>>934
冗長ですな。
でも、私も厳密に考えたら defined を使って書いていたと思う。

>>926

「どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。 」

というのはわかったのだけど、なんとなく釈然としない。
マニュアルのどの部分に、そのことが書いてあるんだろう・・・。
936nobodyさん:03/04/13 14:55 ID:???
937nobodyさん:03/04/13 15:00 ID:???
>>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') { ... }
938nobodyさん:03/04/13 16:39 ID:???
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 $_; ... }
939nobodyさん:03/04/13 16:40 ID:???
↓↓↓↓↓↓↓↓↓↓  いい加減な訳  ↓↓↓↓↓↓↓↓↓↓↓

while (my $line = <STDIN>) { print $line }

これらのループ構造では、(自動的であれ、明示的であれ)指定された値は
defined されてるか否かテストされます。definedされてるか否かのテストをすると、
次の行を伴わない "", "0" のような、Perlでは 偽 として扱われる文字列が
行中にあったときの問題を避けることができます。
もし、おまいが本当にそれらの値("", "0")でループを終了させるのなら、
明示的に次のようにしる:

while (($_ = <STDIN>) ne '0') { ... }
while (<STDIN>) { last unless $_; ... }

↑↑↑↑↑↑↑  いい加減な訳、ここまで  ↑↑↑↑↑↑↑↑↑

ということは、
「どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。 」
は正しいのか?間違ってるのか?

誰か正確に訳してください。
940926: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 か否かで判断、そうでない場合は真偽値で判断」だね。
ドキュメント読んでないけど、挙動を見る限りは。
941nobodyさん:03/04/13 22:40 ID:???
#!/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文を省いたときは正常に実行できました。
942nobodyさん:03/04/13 22:42 ID:???
agentのif文も、KENTさんのスクリプトをコピペすると正常なのに、
自分で同じものを書くと、;}の近くがおかしいとでます。
さらに、コピペではelsifはひっかからなかったのに、自分で書くと、
elsifというのはおかしいとか注意されます。もうサッパリです。
943nobodyさん:03/04/13 22:44 ID:???
訂正しておきます。
$referer2 = $ENV{'HTTP_REFERER'}
if ($referer2 =~/\w/){$referer = "$referer2";}
else{$referer = 'Direct Access';}
です。
944nobodyさん:03/04/13 22:44 ID:???
>>942
嘘つき。同じもの書いたら同じ動作になるに決まってんだろ
945nobodyさん:03/04/13 22:47 ID:???
>>944
そうなんですけど、自分で書くと、;}のところや、elsifがひっかかります。
チャックプログラムもKENTさんのところのやつです。
なんでですか?秀丸を使ってるんですけど、なにか関係ありますか?
946nobodyさん:03/04/13 22:50 ID:???
$referer2 = $ENV{'HTTP_REFERER'} ←ここにセミコロンが無いのは気のせいか?
ほんとに同じ物を書いたのか?
947nobodyさん:03/04/13 22:54 ID:???
>>946
あ、ほんとだ。できました。ありがとうございます。
どうやら=文書くときにセミコロンを忘れる癖がついていたようで前にもこのようなことがなったんですね。。。
スレ汚しすいませんでした。
948nobodyさん:03/04/13 23:18 ID:pEN/2OPI
以前この板で管理人のひろゆき氏よりもエラそうな一言
このスレに2度とくるな!
と書かれた者ですが質問しても良いですか?
949nobodyさん:03/04/13 23:19 ID:???
>>948
もしここで私が「ダメだ」と言ったら
ひろゆきさんに問い合わせるつもりですか?
それともいちいち2ch系サイトに
「あなたのサイトをひろゆきさんにチクリます」
とメールを出したり書き込んだりするつもりですか?
950nobodyさん:03/04/13 23:21 ID:???
2度と来るなと言われたってことはかなりうざい香具師なんだろ?質問はしないでくれ。
951nobodyさん:03/04/13 23:23 ID:???
2ちゃんで叩かれるのはそれなりの理由がある事が多い。
>ひろゆき氏よりもエラそうな一言
などと反省の色が見えないことを考えると二度と書き込まないほうがよかれ。
952nobodyさん:03/04/13 23:27 ID:???
庭の石をひっくり返したら、
だんご虫が群がってるよね。
あれみたい・・・。 このスレ。
953nobodyさん:03/04/13 23:29 ID:???
>>952=>>948 書き込むなっつってんだろ?
954nobodyさん:03/04/13 23:30 ID:???
949=950=951=952
自演
955nobodyさん:03/04/13 23:41 ID:pEN/2OPI
>>953
953番さんここの管理人ですか?
956nobodyさん:03/04/13 23:41 ID:???
結城さんのところに、
「<tt>while (defined($line = <FILE>)) { ... }</tt> でdefinedがない場合、ファイル末にある改行なしの"0"が正しく取得できるかどうかの調査。

というのがありました。
http://www.hyuki.com/pb/pbmldig.html
957nobodyさん:03/04/13 23:54 ID:???
>>955
そう思うのなら書けば良かれ。
958937:03/04/13 23:54 ID:???
>>955=>>952=>>948
もういいよ。うざいバカだな。

>>956
なるほど。新しい版になると回避するようになってるってことか。
しかし MacJPerl 5.2.0r4 はわけわからんな。何が影響してるんだろうか。
やっぱ>>937-938の通りだな。心配だったらチェックしろってことか。
まあ俺の周りでは5.6以降しかないから大丈夫だろうな。
情報ありがd
959948:03/04/13 23:56 ID:???
952は流れを変えようとしているけど違いますよ。
955はもろそうですけど。
960nobodyさん:03/04/13 23:59 ID:???
次スレまだ?
>>948
質問があればしろよ。
961948:03/04/14 00:10 ID:???
なんか、荒らしちゃったみたいなので又にします。
失礼しました。
962nobodyさん:03/04/14 01:18 ID:oETCFM9h
例えば55555555という数字があってそれを55.5Mというようにするにはどうしたらいいんでしょうか?
963nobodyさん:03/04/14 01:22 ID:???
55555555という文字列から、テキトーに3文字持ってきて、ならべる。
最後の文字の直前に、ピリオドを突っ込む。

以下独り言。

バイト数をメガバイトや、キロバイトという単位で表示したいのなら、
1024で割れば、キロバイトになる。
さらに1024で割ればメガバイトになる。

コンピュータの世界の数字ではないのなら、1024の代わりに1000を使う。
964nobodyさん:03/04/14 01:36 ID:???
>>963
どうもありがとうござます。
数字÷1024÷1024をなんで浮かばなかったんだろう・・
965nobodyさん:03/04/14 02:30 ID:???
>>937
948がうざがられたらどうするんだ!?
お前責任取れよ!
>>964
さらに1024で割ってギガバイト
966nobodyさん:03/04/14 03:13 ID:???
>>965
馬鹿なことはせずに落ち着けよ。
967nobodyさん:03/04/14 04:08 ID:???
${"domo"} = "ども";
use strictだと怒られてしまいます。
何故でしょうか…。
968はしのえみ好きー:03/04/14 05:13 ID:???
変数名は何?
969nobodyさん:03/04/14 05:44 ID:???
>>967

use strict;

と書くと、

use strict 'refs';

と、書いてあるときと同じ制限(シンボリックリファレンスの禁止)が効いてくるからじゃないかな。
970はしのえみ好きー:03/04/14 06:28 ID:???
うわっ恥ずかしー。てっきりハッシュかと思ってた(鬱氏
971nobodyさん:03/04/14 09:30 ID:???
存在するかどうか不明なのですが...

処理を行う文字列内に2バイト文字が含まれている場合、処理を中断させたいのですが
Perl でコレに適した関数が存在しますでしょうか?

関数が存在しない場合、この様な処理を行いたい場合どのような考え方を行えばよいでしょうか?
972nobodyさん:03/04/14 10:03 ID:???
EUC_JP なら、2バイト文字のどっちのバイトもトップビットが立ってるです。
973nobodyさん:03/04/14 10:57 ID:???
>>972
それを利用して正規表現でマッチングすれば実現できそうですね!
因みに、コード S-JIS の場合は同じ様な方法で処理可能でしょうか?
974nobodyさん:03/04/14 12:44 ID:???
>>973

http://tohoho.wakusei.ne.jp/wwwkanji.htm
まず、ここ↑だけでなく、とほほさんのページWWW入門を端から端までざっと読まれたし。

あと、「2バイト文字」 「判定」 とかでぐぐられたし。
975nobodyさん:03/04/14 13:21 ID:???
>>974
うお!
杜甫々様にこんな項目があったなんて...
こちらの項目内をじっくり調べて見る事にします!

感謝です ^^
976nobodyさん:03/04/14 14:53 ID:???
my $hoge='aaa' if($hoge);
と書くと変数が空になる場合とそのまま表示される場合があるのはなぜですか?
977nobodyさん:03/04/14 15:06 ID:???
冷やすことしか思い浮かばずに人を簡単に邪魔者にする、
言いたい事だけだを言って逃げるような人間は必要ない。
978nobodyさん:03/04/14 15:15 ID:???
>>976
どういう処理を期待している?
979nobodyさん:03/04/14 15:19 ID:???
直前の質問に回答もせず(できず)に
言いたい事だけだを言って逃げるような人間は必要ない。
980nobodyさん:03/04/14 16:40 ID:???
煽りデビューしてまだ間もないのかな
981251:03/04/14 16:42 ID:???
>>976
どう動くかわかった物じゃないな・・・
982nobodyさん:03/04/14 23:20 ID:Fu0phwZ6
zisure
983nobodyさん:03/04/14 23:30 ID:???
オイ糞ども
答えられねーくせに常駐してんなよ
984nobodyさん:03/04/14 23:32 ID:???
>>983
すまんがあんた誰?
985nobodyさん:03/04/15 00:06 ID:???
>>984
俺だよ俺。
986はしのえみ好きー:03/04/15 00:34 ID:???
>>985
ああ、君か。
987nobodyさん:03/04/15 01:11 ID:GCPlWzzF
今携帯なんですが、ついさっきPCでアップした環境変数をすべて生で表示するCGIを設置したんですが動きません。
http://f9.aaacafe.ne.jp/~raiha/printenv.cgi
誰かこれと同じようなCGIをくんで、どこかにUPしてもらえないでしょうか?
本っ当にすいません、携帯なんで。。。
988はしのえみ好きー:03/04/15 01:13 ID:???
>>987
実行権がついてないよ。多分。
989nobodyさん:03/04/15 01:22 ID:iui3dkW8
自分で書いたCGIの場合自分でパーミッションは考えるんですよね?
あと、この場合のパーミッションはどうしたらよいか教えて下さい。

もしよろしければ、UPしてもらいたいんですが。。。だめですか?
990はしのえみ好きー:03/04/15 01:35 ID:???
>>989
別にコードに書くわけじゃないよ。http://fh.aaacafe.ne.jp/ ここで聞いて来い。と思ったがろくな説明書いてないな。
ftpでUpしてるならchmodしろ。FTPクライアントによってやり方は違うからそれに関しての質問はスレ違い。
991はしのえみ好きー:03/04/15 01:35 ID:???
誤:FTPクライアントによってやり方は違うからそれに関しての質問はスレ違い。
正:FTPクライアントによってやり方は違うが、それに関しての質問はスレ違い。
992nobodyさん:03/04/15 03:05 ID:???
$a = 10;
$b = 3;
$c = $a / $b;
だと $c = 3.3333〜になってしまいますし
int($a / $b) だと $c = 3になってしまいます
少数第2位でそろえるためにはどうすればいいんでしょうか?
一応
$c = (int($a * 100)/$b)/100; っていうのも考えて見たんですが
もっとスマートにやる方法ないでしょうか
表示するわけではないのでprintf()は使えません。
993nobodyさん:03/04/15 03:09 ID:???
>>976
どんな意図があるか分かりませんが、
せめて
use strict;
してください。
994nobodyさん:03/04/15 03:12 ID:???
>>992
そんなあなたに sprintf
995nobodyさん:03/04/15 03:14 ID:???
>>994
サンクス 助かったYO。
sprintfでフォーマット決めて変数に代入できるんだね。
996nobodyさん:03/04/15 07:22 ID:HrV7+0uT
じすれは?
997nobodyさん:03/04/15 10:14 ID:???
ああ、次が立ってなかったんだな
じゃあ、立ててくるから待ってて
998nobodyさん:03/04/15 10:17 ID:???
次スレ

Perl 初心者コーナー Part22
http://pc2.2ch.net/test/read.cgi/php/1050369328/l50
999nobodyさん:03/04/15 13:57 ID:???
1000nobodyさん:03/04/15 13:58 ID:???
__END__
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。