Perlコーディング初心者質問スレ Part 38

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

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
2nobodyさん:04/10/07 23:28:34 ID:???

関連スレ
CGI: Common Gateway Interface part 11
http://pc5.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc5.2ch.net/test/read.cgi/php/1030209573/
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/
【 スクリプト改造依頼スレ 】(丸投げ) part2
http://pc5.2ch.net/test/read.cgi/php/1092304968/
△▲ WebProg 初心者の質問 Part10 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1095633323/
【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/
★負荷軽減対策委員会(Perl、PHP)★
http://pc5.2ch.net/test/read.cgi/php/1034645635/
【Perl】掲示板を使ろう!
http://pc5.2ch.net/test/read.cgi/php/988890976/
Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
CGIに依存しないPerlの話題一般/Part2
http://pc5.2ch.net/test/read.cgi/php/1030548610/
3nobodyさん:04/10/07 23:29:28 ID:???
4nobodyさん:04/10/07 23:30:33 ID:???
5nobodyさん:04/10/07 23:33:11 ID:???
ム板Perlスレより

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://perldoc.com
perldoc.jp: http://perldoc.jp
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
6nobodyさん:04/10/07 23:34:58 ID:???
補足

コーディング 【coding】

プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
(e-Wordsより)

自分の質問がPerlに関することなのか、
それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、
質問して下さい。
7nobodyさん:04/10/07 23:39:18 ID:???
だれも言わないから言っとく。

>>1 乙かれー
8nobodyさん:04/10/07 23:39:26 ID:???
前スレ1氏より

http://www.geocities.co.jp/SiliconValley/5656/
http://www.hyuki.com/writing/techask.html

これはMLでの作法ですが、BBSでの質問にも当てはまると思います。
例え匿名でも、回線の向こうに居るのはあなたと同じただの人ですよ。
9nobodyさん:04/10/07 23:40:21 ID:???
あと何かないかな。

WikipediaのPerlの項目
http://ja.wikipedia.org/wiki/Perl
10nobodyさん:04/10/07 23:44:13 ID:???
前スレの>>1は文章自体は別に構わないと思うけど、前スレ>>987の意見を考慮して
以前の>>1に戻しました。

11nobodyさん:04/10/08 00:27:11 ID:???
>>1乙。シャラポア マンセー
12nobodyさん:04/10/08 00:40:34 ID:LN3yr29s
人によってコードの書き方は色々だと思うのですが、
一般的に美しいとされるコードの書き方はどのような書き方ですか?
参考になるようなソースがあればお教えください。
13nobodyさん:04/10/08 01:16:04 ID:???
1412:04/10/08 02:14:31 ID:LN3yr29s
どうもありがとうございます。
しかしながら、見た目の美しさではなく、
コードを後から読む人にとって、
直感的に、わかりやすいコードという意味で、美しいといいました。
誤解を招く言い方でスイマセンでした。
15nobodyさん:04/10/08 03:17:19 ID:???
>>14
perlstyle にはそういう意味で美しくする為の Tips も載っているだろ?

より具体的に知りたければ、自分の書いたコードをコードレビュー系の
ML なりスレなりに投下してごらん。偏った意見が聞けて面白いよ。
http://pc5.2ch.net/test/read.cgi/php/1049514428/
1612:04/10/08 03:46:07 ID:LN3yr29s
スレに投下作戦で行こうと思います。
参考になりました。どうもありがとう。
17nobodyさん:04/10/08 03:58:51 ID:???
>>1
スレ建て乙

>>14
>コードを後から読む人にとって
それだったら、コーディング標準に従ったコード >>13のURL参照
独自ルールだとどうしても*自分にとって*美しいコードになってしまうことがあるので

質問の意図からすると、
設計の簡潔さ、適切なサンプルコード/ドキュメント(POD)を重視した方がいいんじゃないかな
場合によってはコードを読まずにすませられることもあるよ。
18nobodyさん:04/10/08 09:25:10 ID:D4NtGdWq
文字列の中に関数を直接展開するにはどうすればいいのでしょうか?
シェルスクリプトでいうところの↓みたいなことがしたいんですが
echo "current dir is `pwd`"
以前このスレで教えてもらったのですがやり方を忘れてしまいました
ログもググってみたんですが見つかりませんでした
19nobodyさん:04/10/08 11:14:19 ID:???
print "current dir is " .`pwd`;

これが高速だし読みやすいのでお勧めだが…
(printに関して言えば、ピリオドよりコンマの方が良いが)

print "current dir is ${\`pwd`}";
print "current dir is ${\do{ `pwd` }";
print "current dir is @{[ `pwd` ]}";

ま、こんな感じで。
20nobodyさん:04/10/08 14:50:00 ID:???
モジュールを使うことがオブジェクト指向ということになるんでしょうか?
21nobodyさん:04/10/08 15:16:43 ID:???
>>20
全然違います。
モジュールとオブジェクト指向に直接関連はありません。
22nobodyさん:04/10/08 16:02:04 ID:SvnbdnXk
プログラム実行中にperlでエラーメッセージを
別ウィンドウを使って表示することは可能でしょうか。
javascriptを使えばできるようなのですが、
perlのみでは無理なのでしょうか?
スレ違いなら申し訳ないです。

2312:04/10/08 16:09:32 ID:HUGW4EIR
>17
どうもありがとうございます。

>>コードを後から読む人にとって

>設計の簡潔さ、適切なサンプルコード/ドキュメント(POD)を重視した方がいいんじゃないかな
>場合によってはコードを読まずにすませられることもあるよ。

ところで、PODとは、コメントのことでしょうか?
コメントだとしても、コードを読まずに済ませられるとは考えにくいので
違う気もします。宜しけれご教授ください。
24nobodyさん:04/10/08 16:28:01 ID:???
25nobodyさん:04/10/08 16:39:18 ID:3yz40YUb
sendmailでメール送るときにccとかってどう書けばいいですか?


open MAIL ,"| /usr/sbin/sendmail -t";
print MAIL "From: ".'"ほげほげ" <[email protected]>'."\n";
print MAIL "To: ".''."\n";
print MAIL "Cc: ".'<[email protected]> <[email protected]>'."\n";
print MAIL "Bcc: ".''."\n";
print MAIL "Subject: ".""."\n";
print MAIL "\n";
print MAIL "test";
close MAIL;

みたいにしても動作しませんでした。
もちろん普通にtoだけいれたら動作します。
どなたかお願いします。
26nobodyさん:04/10/08 17:35:29 ID:???
スパムに使われそうだから、回答しないわ
27nobodyさん:04/10/08 17:47:14 ID:???
>>23
> ところで、PODとは、コメントのことでしょうか?
> コメントだとしても、コードを読まずに済ませられるとは考えにくいので

PODは、コメントと言うよりは、ドキュメントと言った方が適切かもしれない。

Perlの標準モジュールの多くは慣習的に、
モジュールの説明、そのモジュールの使い方(実際に動く最小限のコード)
関数/メソッドのリファレンス、... などを含んでいるので
たとえば、◯◯をしたいといったとき、
PODにそのサンプルが載っていれば内部実装のコードを読む必要はない。
(デバッグで必要になる時までは...)
2812:04/10/08 18:01:20 ID:HUGW4EIR
>24 >27
どうもありがとう。色々コード&POD読んでみます。
精進します。ありがとう。
2925:04/10/08 18:25:06 ID:3yz40YUb
>>26
spamに使うならID出しませんよ。

どなたか>>25の回答をお願いしますm(__)m
30nobodyさん:04/10/08 18:26:49 ID:???
>>26
ソンナコトイッタラナンデモソウジャナイカw

ウイルス作成に使われそうだから、このスレ閉じるか?
31nobodyさん:04/10/08 18:38:42 ID:???
>>25
open MAIL ,"| /usr/sbin/sendmail -t";
print MAIL "From: ほげほげ <[email protected]>\n";
print MAIL "To: \n";
print MAIL "Cc: <[email protected]>,<[email protected]>\n";
print MAIL "Bcc: \n";
print MAIL "Subject: スレ違い\n";
print MAIL "\n";
print MAIL "Ccでアドレス列記はperlには関係することではない";
close MAIL;
32nobodyさん:04/10/08 19:01:26 ID:???
IDなんて飾りですよ
33350235005336290:04/10/09 17:26:34 ID:???
節穴とどっちが個人特定性が高いだろうか
34nobodyさん:04/10/09 18:07:02 ID:???
>>33
その節穴ってどうなってんの?

個人特定性は節穴の方が高いでしょ。ID衝突は時々見かける。
35nobodyさん:04/10/09 19:46:27 ID:r3ZvWrWV
ログが100行を越した場合最後の1行を残してあとのログが消えるようにしているのですが
ログが10行を越したときに1行だけ残してあとのログが消えるようにするのとどっちが負荷が低いのでしょう_?
つまり、頻繁にログを1行にするのと、100行ものログを読みこむのと、どちらが負荷がかかるんでしょう。
36nobodyさん:04/10/09 19:51:25 ID:???
>>35
自 分 で 試 し ま し ょ う 。

use べんちまーく;
37初心者です。:04/10/09 20:26:36 ID:fCvsZBf9
フリーの掲示板の設置が上手く出来たのですが、スクリプトの改造で
以下の戻り先URLの設定でターゲットの設定は出来ないのでしょうか?
_topに戻りたいのですが、戻れません。

# 戻り先URL
$home = 'http://xxxxx.com/index.html';

誰か教えて下さいませ。大変困ってます。<(_ _)>
38nobodyさん:04/10/09 20:29:04 ID:???
39nobodyさん:04/10/09 21:00:25 ID:LGUhwPv/
IISでActive Perl入れてやってますが
SMTPを使ってのメール送信で送れてはいますが
OEでの受信で宛先の部分が
undisclosed-recipients になってしまいます。
送信元は正常に表示されているのですが。
どこを修正すればよいでしょうか?
お願いします。

use Net::SMTP;
$smtp = Net::SMTP->new('***.***.ne.jp'); #SMTPサーバ
$smtp->mail([email protected]); #送信元
$smtp->to(to@[email protected]); #宛先
$smtp->data();
$smtp->datasend("Subject:メール\n"); #件名
$smtp->datasend("メール本文");
$smtp->dataend();
$smtp->quit;
4039:04/10/09 21:03:05 ID:LGUhwPv/
間違いました
× $smtp->to(to@[email protected]); #宛先

○ $smtp->to([email protected]); #宛先
4139:04/10/09 21:04:23 ID:LGUhwPv/
ご存知の方、お願いします。
42nobodyさん:04/10/09 21:13:32 ID:???
>>39
$smtp->datasend("To: ・・・\n); はどうした?
宛先がないだろうが
43nobodyさん:04/10/09 21:21:16 ID:???
>>39
> $smtp->mail([email protected]); #送信元
$smtp->mail('[email protected]'); # MAIL FROM

> $smtp->to(to@[email protected]); #宛先
$smtp->to('[email protected]'); # RCPT TO

> $smtp->datasend("Subject:メール\n"); #件名
> $smtp->datasend("メール本文");
$smtp->datasend("To: 39 <to\@example.jp>\n"); # To: ヘッダ
$smtp->datasend("Subject: メール\n");
$smtp->datasend("\n");
$smtp->datasend("メール本文");
44nobodyさん:04/10/09 21:24:19 ID:???
>>39
君はRFC2822を勉強したまえ。このままでは腐ったメッセージ垂れ流しそうな悪寒。
45nobodyさん:04/10/09 21:46:43 ID:LGUhwPv/
>>42
返信ありがとうございます。

$smtp->mail([email protected]);  のすぐ下に
$smtp->datasend("To: [email protected]\n"); を
追加してみたけど駄目でした。
どこがまずいのでしょうか?
46nobodyさん:04/10/09 21:48:33 ID:LGUhwPv/
>>43
ありがとうございます。
やってみます。
47nobodyさん:04/10/10 00:20:52 ID:mkQG3wAc
ある関数内からスコープ外にある無名ハッシュの値を
操作したいのですがうまくいきません

my $p = { data => 1 };

&abc($p);
print "$p->{data}\n";

sub abc {
my $p = shift;
$p->{data} = 2;
}

↑のようにやってみたのですがなぜかダメでした
再帰処理がしたいので関数内から直接変数の値をいじることはできません
48nobodyさん:04/10/10 00:32:57 ID:???
>>47
そのコードは問題なく動くので別の所がおかしいのだろう。
use strict; や -w オプション、デバッガで地道に調べてくれ。
49nobodyさん:04/10/10 00:48:31 ID:???
blessしたあとにインスタンス変数に代入してもいいんですか?
50nobodyさん:04/10/10 02:42:47 ID:???
オブジェクト指向な考えだと掲示板でいう
書き込みとか削除とかをifで分けていく部分はどういう風にしたらいいんですか?
51nobodyさん:04/10/10 03:08:11 ID:???
わけわかめ
52nobodyさん:04/10/10 03:10:22 ID:???
if ($mode eq 'write') {
    &write;
} elsif ($mode eq 'delete') {
    &delete;
}

こんな感じのt所です。
53nobodyさん:04/10/10 03:11:28 ID:???
54nobodyさん:04/10/10 03:14:22 ID:???
>>53
デザインパターンなんて言葉を知らなかった
さんくすべるーまっち
55nobodyさん:04/10/10 03:18:58 ID:vb66WTKp
$AoA[$i] = [@array] という配列のリファレンスを配列に入れる処理が
@{$AoA[$i]} = @array で代用できるという事がよく分かりません。

@{$AoA[$i]} = @array と言うのはどういうことですか?
@($AoA[$i]) = @array との違いを教えてください。
56(1/2):04/10/10 04:56:32 ID:???
>>55
普通の配列変数を書く時の @array って書き方。コレ、本当は @{array} の
{ } を省略したものなんだよ。@{ と } で挟まれたホニャララを配列として扱い
ますよ、って意味で、ホニャララが 裸のワード だったら普通の配列変数と
して扱われるんだ。

@{array} = (0,2,4,8); # array という名前の配列変数

ホニャララはリファレンスでも構わなくて、配列に対してできる操作は
同じようにできちゃう。配列の要素を見る時は ${ ホニャララ }[ 添え字 ]
って構文になるよ。

$a_ref = [1,3,5,7]; # 名無しのリストリファレンス

print @{array};  push @{array}, 10; ${array}[0] = 12;
print @{$a_ref}; push @{$a_ref}, 9; ${$a_ref}[0] = 11;

そして当然、代入も。

@{array} = (0,2,4,8);
@{$a_ref} = (1,3,5,7);

文法的に間違えようのない場所なら、この { } は省略できるんだ。

print @array;
print @$a_ref;
57(2/2):04/10/10 05:01:32 ID:???
続き。

Perl の変数は予め宣言しなくても使えるよね。この振る舞いと同じように、
未定義な「場所」をムリヤリ配列として使おうとすると、本当にそういう事に
しちゃうんだ。その「場所」がスカラー値しか収められない「場所」なら、
それ自体はスカラー値であるリストリファレンスが収まるってわけさ。

@{AoA} = (); # 空っぽの配列

# スカラー値を収められる入れ物に、リストリファレンスを作って入れる
${AoA}[0] = [0,2,4,8];

# ${AoA}[1] は配列だと勝手に決めて、代入しちゃう!
@{${AoA}[1]} = (1,3,5,7);

気をつけなきゃいけないのは、未定義でもリファレンスでもない「場所」を
ムリヤリ配列として使おうとした時。perl はこういう時、下の例なら $foo の
値、つまり hoge って名前の配列変数を勝手に使っちゃうんだ。

$foo = 'hoge'; # ただの文字列
@hoge = (2,4,6,8);
@{$foo} = (0,1,2,3);
print @hoge; # 0123

この危険な機能の名前はシンボリックリファレンス。 use strict 'refs'; と
唱えておく事で禁止できるよ。
58nobodyさん:04/10/10 14:32:49 ID:bziwCOA4
メールアドレスの@から右のドメインを取得するには
どのような関数がありますでしょうか?

例えば、[email protected]の aaa.ne.jpだけを取得したいんです。
ご存知の方お願いします。
59nobodyさん:04/10/10 14:58:33 ID:???
>>58
index
60nobodyさん:04/10/10 15:21:22 ID:bziwCOA4
>>59
indexは検索文字が対象文字列に存在するかのだと思いましたが
どのようにすればよいんでしょうか?
61nobodyさん:04/10/10 16:18:08 ID:???
>>60
my $addr_spec = '[email protected]';

# http://tohoho.wakusei.ne.jp/wwwperl2.htm#index
# http://tohoho.wakusei.ne.jp/wwwperl2.htm#substr
my $domain = substr $addr_spec, index($addr_spec, '@') + 1;

# http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlre.html
($domain) = $addr_spec =~ /([^@]+)\z/;
6255:04/10/10 19:15:24 ID:vb66WTKp
>56 >57
ありがとうございました。

つまり

$a_ref = [0,2,4,6];

などと記述があった後に

@{$a_ref} = (1,3,5,7); 

と書かれていたら

$a_ref = [1,3,5,7]; と読替えて良いと言うことでしょうか?
6339:04/10/10 20:18:00 ID:bziwCOA4
>>61
できました。
ありがとうございました。
64大文字小文字混在をアルファベット順にソートしたい:04/10/10 21:23:27 ID:0NABqG2B
ID(大文字小文字混在の半角英数)と得点を格納したハッシュ%dataがあります。
これを得点の高い順に並べ、さらに同じ得点同士ではアルファベット順に並べて
IDを取り出したいと思います。そこで以下のようにしました。

%data= ('aaa' => 90, 'bbb' => 80, 'CCC' => 80, 'DDD' => 70,);
@id_array = sort { $data{$b} <=> $data{$a} or $a cmp $b} keys %data;

しかし、これでは同じ得点の人が
大文字のアルファベット順→小文字のアルファベット順になってしまいました。
(上の例ではaaa, CCC, bbb, DDD,の順になる)

アルファベットの順(aaa, bbb, CCC, DDDの順)に並べ替える方法はありますか?
65nobodyさん:04/10/10 21:35:49 ID:???
>>64
自分で sort の中に何が書けるかわかってないんじゃない?

まぁいいや。
sort { $data{$b} <=> $data{$a} or lc($a) cmp lc($b) }
とか、大文字と小文字を無くすようなことをしてやれば、全て正解でしょうに。
6664:04/10/10 22:02:50 ID:0NABqG2B
>>65
できました。

文字コード自体が大文字アルファベット→小文字アルファベットの順に
なってるので、仕様だと思ってあきらめていました。

ありがとうございます。・゚・(ノД`)・゚・。
67nobodyさん:04/10/11 00:30:18 ID:???
>>62
いや、だいぶ違う。

@$a_ref = (...)は新しいリファレンスを作らないし、tieやblessなどの影響はそのまま。
$a_ref = []は新しいリファレンスを作る。

特に後者にする必要がなければ、前者の方法を使った方がいい。
6862:04/10/11 01:38:46 ID:21NinhME
>>67
わかりました。あの後、ラクダ読んでなんとなく
感覚が掴めました。ありがとうございました。
69nobodyさん:04/10/11 17:04:09 ID:???
みんなクッキーに日本語入れる時、16進数に直してますか?
漏れは直さないでそのまま使えてるんだけどなんで一般的に直す必要があるのでしょうか?
70nobodyさん:04/10/11 17:30:37 ID:???
71nobodyさん:04/10/12 00:56:44 ID:J8ZBB7PX
perlに限らず一般的なプログラミングの話になっちゃうかもしれないけど・・・
掲示板のCGIを作ってる最中なんだけど、
(1)全ての書き込みを一つのログファイルにする
(2)書き込み毎にログファイルをつくる
ログが1000件あると仮定して10件を表示する場合、どちらの方がリソース食うだろう?
(1)の場合、処理手順は少ないが余計なデータを大量に読み込む。
(2)の場合、opendir、readdirでファイル名を読み込み、かつ各々のファイルを読み込むので、
処理は繁雑になるが余計なデータをメモリ上に展開しない。
はやりシステムとのやり取りが多くなる(2)の方がコスト高いのだろうか?
72nobodyさん:04/10/12 00:59:02 ID:???
73nobodyさん :04/10/12 01:04:57 ID:???
ルーチンにもよるが・・・

儂のケースでは、データーが300件ぐらいで使ってたフリー鯖でゴルァされたのでsql導入した。
74nobodyさん:04/10/12 01:05:44 ID:???
>>71
俺は(1)を選ぶ。システムコールが少ない方が好きなので。
しかしログがでかくなると厄介なのも確か。
75nobodyさん :04/10/12 01:29:03 ID:???
あと、データーが固定長なら1ファイルにして
seekで位置決めしてread,writeってのもあり。
76nobodyさん:04/10/12 01:35:04 ID:???
>>73-75
レスありがとうございます。とりあえず、一般的(と思われる)(1)の方法でやってみます。
データは可変長ですが、固定長にしてoffsetで狙い撃ちもアリですね。ちょっと工夫してみます。
>>73
すいません。そのスレ知りませんでした。
77nobodyさん:04/10/12 01:52:29 ID:???
低額でsql使えるところを探すのが、後々のこと考えても楽になると思うな。
78nobodyさん:04/10/12 10:44:09 ID:???
質問です、
open IN,$dat.dat
@var[50..60]=<IN>
これは$dat.datを全部読んでいるんですか?それとも60行目で処理が終了しますか?
79nobodyさん:04/10/12 11:21:32 ID:???
キミは@varの中身を覗いた上でその発言をしているのかね?
80nobodyさん:04/10/12 11:27:40 ID:???
>>78
読むことは読むけど、速いことは速いんじゃない?
今のCPUで読み込みファイルの大きさで遅いってことは、普通の取り扱う範囲の
テキストファイル(1M以下程度)だとあり得ない希ガス。

Perlが一番遅いのって、「値のコピー」周辺だと思うんだけどネェ。
(特にリスト系)

まぁ、ファイルの大小と、スライス有・無でベンチとってみれヴぁ?
81nobodyさん:04/10/12 11:47:38 ID:???
>Perlが一番遅いのって、「値のコピー」周辺だと思うんだけどネェ。
前スレにファイルの扱いの方が遅いと書いてあった希ガス
よほどたいそうなモン作らない限りは誤差の範囲だろ
82nobodyさん:04/10/12 11:59:34 ID:???
http://2ch2.net/imenu/
これの作り方教えて下さい
83nobodyさん:04/10/12 12:11:37 ID:???
CGIでやるんなら、パラメータで作るのが手っ取り早いっしょ
84nobodyさん:04/10/12 15:01:19 ID:???
use benchmarkで計測した結果があるのですが、
出力結果の見方がわかりません。
テンプレにはベンチマーク関連の資料が見当たらないのですが、
見方などが載っているサイトをご存知の方いませんか?
85nobodyさん:04/10/12 16:54:23 ID:???
>>84
>>3
http://perldoc.com/perl5.8.4/lib/Benchmark.html
http://pc5.2ch.net/test/read.cgi/php/997829243/

出力のどの部分が分からんのか具体的に示した方がいいよ。
86nobodyさん:04/10/13 12:37:35 ID:SrofvYG0
Q:0〜6の数字をそれぞれ$p1 〜 $p7に代入したい
ただし、$p1 〜 $p7はそれぞれ違う数字になるように代入したい
と思い、こんなコードを考えたのですが
 
8786:04/10/13 12:38:00 ID:SrofvYG0
$p1 = int(rand 7);
 $p2 = int(rand 7);
 while($p1 == $p2){
 $p2 = int(rand 7);
 }
 $p3 = int(rand 7);
 while($p1 == $p3 or $p2 == $p3){
 $p3 = int(rand 7);
 }
 $p4 = int(rand 7);
 while($p1 == $p4 or $p2 == $p4 or $p3 == $p4){
 $p4 = int(rand 7);
 }
 $p5 = int(rand 7);
 while($p1 == $p5 or $p2 == $p5 or $p3 == $p5 or $p4 == $p5){
 $p5 = int(rand 7);
 }
 $p6 = int(rand 7);
 while($p1 == $p6 or $p2 == $p6 or $p3 == $p6 or $p4 == $p6 or $p5 == $p6){
 $p6 = int(rand 7);
 }
 $p7 = int(rand 7);
 while($p1 == $p7 or $p2 == $p7 or $p3 == $p7 or $p4 == $p7 or $p5 == $p7 or $p6 == $p7){
 $p7 = int(rand 7);
 }
8886:04/10/13 12:38:40 ID:SrofvYG0
見れば見るほど頭悪そうな感じがします。。。7くらいならいいけど
p1〜p100までに1〜100までの数字をそれぞれ違う数字が入るようにするなんてするとひどいコードになる事に・・・
うまくループ構文使えばもっと簡単なコードになる気がするのですが
私では作れませんでした・・・どなたかご存知でしたら教えていただけますでしょうか。
(ちなみになぜこんな事をやりだしたかというと、特定個数の全てのアイコンを毎回順序をランダムで表示したいと考えたからです)

連続カキコすいません。(改行エラーでたので)
89nobodyさん:04/10/13 12:41:40 ID:???
質問です。BBSのログを読み出す際に、URLがある場合にはリンクを貼ろうと思っています。
例えば、普通にリンクを貼るだけならできるのですが、
自サイトへはinner、他サイトへはouterというスタイルを適用したいと思っています。

ログの例:(MyIDを含むのが自サイトとします)
http://localhost/MyID/<BR>http://www.2ch.net/

出したい出力結果(HTML上):
<A href="http://localhost/MyID/"class="inner">http://localhost/MyID/</A><BR><A href="http://www.2ch.net/" class="outer">http://www.2ch.net/</A>

sub link { # 引数に渡すのはログ全体
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+MyID[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="inner">$2<\/A>/g;
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="outer">$2<\/A>/g;
}

こう記述すると、前者も後者も全てouterになってしまいます。

if ($_[0] =~ /MyID/) {
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+MyID[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="inner">$2<\/A>/g;
} else {
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" class="outer">$2<\/A>/g;
}

こうすると、今度は自サイトへのリンクは貼られるのですが、他サイトへのリンクは貼られなくなってしまいます。
上記の出したい出力結果を出すには、どのように記述したらよいのでしょうか。
90nobodyさん:04/10/13 13:24:29 ID:???
>>86
数値を配列に入れてから
その配列をランダマイズすれば?
9186:04/10/13 13:33:52 ID:SrofvYG0
>>90
配列ってランダマイズできるんですか・・・。
知りませんでした汗
ありがとうございました。探してやってみます。
92nobodyさん:04/10/13 13:44:56 ID:???
>>86

@array=();
for ($count = 0; $count < 7; $count++) {
push(@array,$count);
}
&shuffle( \@array );

sub shuffle {
my $array = shift;
my $i;
for ($i = @$array; --$i; ) {
my $j = int rand ($i+1);
next if $i == $j;
@$array[$i,$j] = @$array[$j,$i];
}
}

&shuffleを呼び出す前と、呼び出した後で@arrayの中身を見てみよう。
93nobodyさん:04/10/13 13:55:48 ID:???
>>89
\大杉
94nobodyさん :04/10/13 15:22:33 ID:???
>>86
@outにランダムな数値を出力。

@in = (1 ..100);
@out = ();
srand;
foreach (@in) {
  my $r = int rand (@in + 1);
  push(@out, $in[$r]);
  $out[$r] = $_;
}
95nobodyさん:04/10/13 15:30:25 ID:???
>>94
それ、値が入らない場合もあるし、
同じ値が入りまくってるじゃん。
>>86の要件を満たしてないぞ。
96nobodyさん:04/10/13 15:48:10 ID:???
>>86

srand(time());
%hash = map {$_ => rand()} 0 .. 6;
@array = map $_, sort {$hash{$a} <=> $hash{$b}} keys(%hash);
print "@array\n";
97nobodyさん:04/10/13 16:04:53 ID:???
いろいろ書いてみるのも楽しいのだが、オレは堕落したので
List::Utilのshuffle使うな
98nobodyさん:04/10/13 16:07:16 ID:???
俺は5.6だから使えないYO!!
モジュールに頼りっきりになるのもアレだが、でも使えるものは使っていきたいよね。
99nobodyさん:04/10/13 16:11:23 ID:???
(12 15 17 20 50)のような配列があったとして
↑の配列の中から18に一番近い数字を取り出すみたいなのはどうしたらいいでしょうか?
100nobodyさん :04/10/13 16:20:30 ID:???
>>99
$seed =18;
$tmp = $seed;
@data = (12,15,20,50);
for(@data){
  my $diff = abs($_ - $seed);
  $min = $_ if($diff <= $tmp);
}
print $min;

こんなんでどない?
10199:04/10/13 16:24:16 ID:???
ミスった。

$seed =18;
$tmp = $seed;
@data = (12,15,20,50);
for(@data){
  my $diff = abs($_ - $seed);
  if($diff <= $tmp){
    $min = $_;
    $tmp = $diff;
  }
}
print $min;
102nobodyさん:04/10/13 16:27:05 ID:???
もし、数値の配列がクソ長いのであれば、
abs($_ - $seed);が0の時はlastで抜けちまった方が良さげ
103nobodyさん:04/10/13 16:32:45 ID:???
thx!!!
104nobodyさん:04/10/13 16:37:15 ID:???
オレはList::Utilラブなので、

reduce {abs($a-$seed)<abs($b-$seed)?$a:$b} @data
10586:04/10/13 18:17:10 ID:???
いろんなコードを書いていただいてありがとうございました。
書いていただいた全てのコードが勉強になりました。
一つ一つ検証して試してみたいと思います。
106nobodyさん:04/10/14 00:02:36 ID:pD0/ztzC
連想配列の配列数を得るにはどうすればいいのでしょうか?
forなどで一個一個数えていくしかないのでしょうか?
107nobodyさん:04/10/14 00:12:11 ID:???
>>106
$a = scalar keys %HASH;
10889:04/10/14 00:15:43 ID:???
どなたかわかる人いらっしゃらないでしょうか;
それともこういうのは理論上無理なんですかね・・・
109nobodyさん:04/10/14 00:33:02 ID:???
@data = ('A,2,黄緑',
         'C,3,青紫',
         'B,4,赤',
         'C,6,青',
         'A,7,緑',
         'A,9,紫',
         'B,10,黄');
こんな感じである配列の先頭にあるa,b,cの数を数えて

連想配列に
%count = (A,3,
             B,1,
             C,2);
こんな感じに持って行くにはどうしたら良いんでしょう?
110nobodyさん:04/10/14 00:46:44 ID:???
(りんご、みかん、りんご、ぶどう、みかん、すいか、りんご)
という配列のなかから一番多いものだけを取り出すってのはどうしたらいいですか?
この中だとりんごに当たりますね。
111nobodyさん:04/10/14 00:49:57 ID:???
ここは丸投げスレか
112nobodyさん:04/10/14 00:52:58 ID:???
>>111
答えられない人はお帰りください^^
113nobodyさん:04/10/14 01:31:30 ID:???
>>108
まずurlにマッチングさせてからinnerかouterか判定させれば?
urlの正規表現についてはググればすぐに出てくるので。
あと、エスケープする必要があるものとそうでないもの調べてくれ。
114nobodyさん:04/10/14 02:27:52 ID:???
>>110
ここはアルゴリズムを質問するスレではない。
「こういうアルゴリズムを考えたので Perl で実装したいんですが
どうコーディングしたら良いですか?」
という質問形式にして出直してきたまえ。

例えば、いったん各々の個数を全部数え上げるというアルゴリズムで行くなら、
ハッシュをインクリメントしていって、数え終った後でソートする、というのが素直だろうな。
115nobodyさん:04/10/14 05:34:49 ID:???
前に114と同じことを書いたら叩かれたのを思い出した
116nobodyさん:04/10/14 06:51:34 ID:ETIFZxwk
【目的】
Net::SSH::Perlを使ってサーバに入り、任意のメールアドレスに対してメール
を送信するスクリプトを作る。

【スクリプト】
#!/usr/bin/perl -w
use Net::SSH::Perl;
$host = "www.test.net";
$user = "hogehoge";
$pass = "2ch_test";
$cmd = "mail hoge\@hoge.ne.jp";
$body = "www.test.net is ok\n";
$ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
$ssh->cmd($cmd);
$ssh->cmd($body);

【説明】
スクリプトを実行したとき、指定したサーバにログインすることはできるので
すが、それ以上処理が進まず、メール送信もされません。ただ、スクリプトを
実行させてキーボードから文字を入力してCtrl-Cで処理を中断するとメールは
配信されます。
[mona@localhosst mona]% ./test.pl<Enter>
これはテストです。<Enter>
Ctrl-C

【教えて欲しいこと】
$bodyの内容を自動的に標準入力に代入し、メールを送信する。
加えて、サーバからの切断も自動的に行ってくれる。
以上の二点を解決したいです。
よろしくお願いします。
117nobodyさん:04/10/14 08:14:10 ID:???
@a = "ァー";

for(@a){
@b = split / | /; #全角or半角スペースで切る
}

for(@b){
print;
}

というコードを実行すると何故か

と表示されます。これはどういうことでしょうか?
$aの「ァー」の部分を色々変えてみましたが、
こうなるのは「ァー」と「ぁー」です。
どなたか分る方いたら教えてください。
118nobodyさん:04/10/14 08:36:03 ID:eMIY0T+H
http://www.dp.j-phone.com/dp/tool_dl/web/useragent.php
の表はユーザーエージェントの解説なのですが、表の一番下にあるような
「J-PHONE/4.0/J-SH51/SN*********」という文字列で、
SN以降を削除し他の部分だけを残したいんです。その場合の正規表現は
どう書けばいいのでしょうか?
$abc =~ s/(.+)[SN](.+)/$1/; だとダメでした。どなたかお力添えをお願いします。
119nobodyさん:04/10/14 10:24:52 ID:???
>>118
$abc =~ s/SN.*//;
120nobodyさん:04/10/14 10:36:01 ID:???
>>117
たぶんソースをeucで書いてるだろうから、

use encoding 'euc-jp';

を頭に追加すれば直ると思うが。

unicode機能を有効にしないperlでは日本語の2バイトコードは
1つの文字としては扱えず、1バイトずつバラバラのバイト列と
なってしまう。

"ァー" = "\xa5\xa1\xa1\xbc"
/ | / = /\xa1\xa1| /

なので、ァーの部分は真中の\xa1\xa1の部分を区切りとして
splitされてしまい、\xa5\xbcが出力される。これは「ゼ」。

同様に「ぁー」のときは「ぜ」になってるはず。



121nobodyさん:04/10/14 10:38:58 ID:???
>>117
http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP
ここから下を読むことを勧める。
122118:04/10/14 10:39:49 ID:eMIY0T+H
>>119
レスありがとうございます。
でもそれではうまく行きませんでした。
SN以降が削除されずにそのまま出力されているようです。
123118:04/10/14 10:43:11 ID:eMIY0T+H
失礼、うまくいきました!
感謝感謝です。ありがとう。
124117:04/10/14 12:36:50 ID:???
>>120
ありがとうございます!
完璧な説明大変感謝してます。
125117:04/10/14 12:42:18 ID:???
感謝した先から申し訳ないのですが、
コードはEUCで書いてるのですが
扱ってるデータがS-JISだったりします。
use encoding 'euc-jp';
したら、データが化けてしまいます。
そういう場合
:コードの文字コードと 扱ってるデータの文字コードが違う場合:
どう対処したらよいのでしょうか?
126nobodyさん:04/10/14 12:43:53 ID:???
127117:04/10/14 13:13:06 ID:???
>>126
コーディング、の定義を教えて下さい(・_・)(._.)
128nobodyさん:04/10/14 13:45:02 ID:???
>>127
最低限の検索ぐらいはやった上で質問しなきゃ。
コーディングでググれば?

検索わからない?
http://pc6.2ch.net/pcqa/
129117:04/10/14 13:59:16 ID:???
>>127
は僕じゃないです。
変な質問して、荒らしてしまって申し訳ないです。
130nobodyさん:04/10/14 14:04:44 ID:???
>>125
ここがわかりやすかった

ttp://namazu.org/~tsuchiya/perl/perl-5.8.html
131117:04/10/14 14:05:05 ID:???
自己レスです。

http://www.din.or.jp/~ohzaki/perl.htm#JP_Trans

にそのまんま答えが書いてありました。
お騒がせいたしました。
132nobodyさん:04/10/14 17:55:56 ID:8JHhLpH4
my($takesi,@takesi);



my *takesi;

と同じと考えてよろしいでしょうか?
133nobodyさん:04/10/14 18:02:41 ID:???
久しぶりだなこのスレ
コーディング 【coding】

プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
(e-Wordsより)

>>126は何故に>>125に対してこれを読めって言ったの?
文字コード問題は設計とは関係ないってか?そんなアホな事はないよな。
そもそもよほどのことでない限りコーディングと無関係にはなれないんだがな。

例えば俺の話とかなwww完全にすれ違いってやつだ。
まあお前ら少しは言葉の勉強もしろよ。
134nobodyさん:04/10/14 18:03:09 ID:???
>>132
違うよん。
135nobodyさん:04/10/14 18:04:58 ID:???
>>134
そうだったのですか。
あやうく欲張るところでした。
ありがとうございました。
136nobodyさん:04/10/14 23:56:21 ID:mdncFzXx
$abc = shift;

この shift ってどういう意味なんでしょうか?
関数ですか?
137nobodyさん:04/10/15 00:34:17 ID:???
$b = "こん"
$c = "にちわ" 
変数$aに$bと$cを結合したもの、つまり
"こんにちわ"を代入するには
$a = $b.$c
で大丈夫でしょうか?
138nobodyさん:04/10/15 00:39:03 ID:???
便乗質問。
>>137と似てるんですが、
$b = "co"
$c = "jp"
の場合に $a に co.jp を代入するにはどうすればいいですか?
$a = $b\..$c
で合ってます??
139nobodyさん:04/10/15 00:44:50 ID:???
>>136
関数。shift unshift pop push 他。

>>138
$a = $b.'.'.$c
140nobodyさん:04/10/15 00:53:13 ID:???
>>137
聞く前になんで試してみないの?
141nobodyさん:04/10/15 01:17:23 ID:???
>>140
面倒なんだろ?
まあよくわからんが。
142nobodyさん:04/10/15 08:34:27 ID:???
このままperlの言語仕様を全部質問されそうな勢いだな。
何スレぐらいかかるだろうか。
143nobodyさん:04/10/15 08:35:47 ID:0zK8noVI
掲示板があったとして
log.txtを編集するために
bbs1.cgiでflockした場合
bbs2.cgiで編集しようとした時にも
ロックされてるんですか?
144nobodyさん:04/10/15 10:12:58 ID:???
>>139さん、shiftって配列の先頭の要素を削除する関数ではないんですか?
shift (@data);
とかならわかるんですけど、
スカラー = shiftという意味がわからないのです。
145nobodyさん:04/10/15 10:54:53 ID:???
print "Location: http://www.2ch.net/";
という文のみのファイルを作って、プラウザからアクセスすると指定URLに飛びますが、
上記の文より前に
print "Content-type: text/html\n\n";
などと書かれていると、ブラウザ上に「Location: http://www.2ch.net/」という文字列が表示されてしまいます。

やりたい事は、フォームから検索をかけて、検索処理中の間は特定のページを表示して、
検索が終了したらその結果を表示する画面に遷移する、ということです。
「検索処理のリクエストを受ける → 特定のページを出す「お待ちください」など → 検索終了 → 結果表示」

要するに、1回のPerlの処理で、ブラウザ上で複数のページ間を遷移させる事は可能でしょうか。
146nobodyさん:04/10/15 11:09:31 ID:???
>>144
マニュアルのshiftの項をよく読め。

ttp://perldoc.jp/docs/perl/5.6.1/perlfunc.pod とか。
147nobodyさん:04/10/15 11:22:44 ID:???
>>145
君のやろうとしていることは perl とは関係無い。
javascript を勉強する方が役に立つだろう。
148nobodyさん:04/10/15 13:29:36 ID:???
HTMLでmetaで指定する部分は全てヘッダで返せるのでしょうか?

例えば
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/Javascript">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">

を、

print "Content-type: text/html; charset=Shift_JIS\n";
print "Content-Style-Type: text/css\n";
print "Content-Script-Type: text/Javascript\n";
print "cache-control: no-cache\n";
print "pragma: no-cache\n\n";

にした場合、きちんと返ってるのでしょうか?
149nobodyさん:04/10/15 13:33:40 ID:???
聞く前にやってみてはどうかね。
150nobodyさん:04/10/15 13:45:29 ID:???
返ってるか分からないんです…
151nobodyさん:04/10/15 13:55:55 ID:???
最近はやればわかるのにやりもしないで質問してくる連中が多いな
152nobodyさん:04/10/15 14:55:30 ID:???
>>148
一点目のアドバイス。
「きちんと返っているかどうか確認する方法を教えてください」と質問すれば
いじめられることもなかっただろうに。

二点目のアドバイス。
どっちにしても Perl と全く関係ない質問なので、
WebProg初心者スレなどで聞く方が正解。
153nobodyさん:04/10/15 15:35:31 ID:???
>>143
bbs2.cgiがflock使うなら勿論ロックになる。
flockはセマフォでの唯一のロック獲得争いにすぎない。
そのロックしないプログラムには通用しない。
154nobodyさん:04/10/15 15:37:05 ID:???
>>153だが我ながら変な日本語だ。逝く。
155nobodyさん:04/10/15 16:21:08 ID:???
>>154
bbs.cgiでlog.txtに書き込みするためロックしました
そのままdelete.cgiでlog.txtの書き込みの一部を削除しようとした場合には
ロックはされてないということでいいんですか?
156nobodyさん:04/10/15 16:57:04 ID:???
flockによるロックは、トイレにカギをかけるようなものではなく、
カギのかからないトイレのドアに使用中と札を下げるようなもの。
その札を見てくれる奴には効果はあるが、ハナから見ちゃいねー
奴には無効。delete.cgiがどっちの奴かはオレにはわからない。
157nobodyさん:04/10/15 17:40:29 ID:???
>>155
delete.cgiが、flockでlog.txtに対するロックを獲得しようとすれば、ちゃんと排他制御がなされる。
(bbs.cgiがロックを返すまで待つか、即座に獲得失敗するかはモード次第)。
しかし、delete.cgiがflockを行っていないのなら、bbs.cgiによる排他制御は無意味。
bbs.cgiがロックを得ている・得ていないに関わらず操作可能。
flockは、お手軽なロック機構にすぎない。
(ロック用ディレクトリとか、スリープするか即座に失敗させるかを自力でやらなくて良いって程度のもの)。
158nobodyさん:04/10/15 17:49:21 ID:???
【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/
159nobodyさん:04/10/15 17:55:33 ID:???
>>153だが、
>flockはセマフォでの唯一のロック獲得争いにすぎない。
これは勘違いだったようだ。perlのflockがセマフォ使ってるわけじゃないか。
もう氏ぬ。
160nobodyさん:04/10/15 20:46:48 ID:M3+xPf5C
クーロンでperlで作成したブログラムを起動したいのですが、
どうしたらいいのでしょうか? 普通はブラウザのボタンから起動されると
思うのですが、ある時間が来ると自動で動かしたいのです。よろしくお願いします。
161nobodyさん:04/10/15 21:05:08 ID:???
>>160
好きなようにセットしろよ
使い方分からないならググれば一発だろ

ついでにスレ違いな
162nobodyさん:04/10/15 23:13:44 ID:???
>>159
下の下の方(flock(2)やfcntl(2)の下のほう)ではセマフォつかってるよ。多分。
それでも↓は意味不明だけど。
> >flockはセマフォでの唯一のロック獲得争いにすぎない。
163nobodyさん:04/10/16 02:52:59 ID:???
1000ステップのperlスクリプトと、200ステップのperlスクリプト、
どちらも実行ステップは100だとしても、やはり後者の方がサーバに対する
負荷は少ないのだろうか。
164nobodyさん:04/10/16 03:14:53 ID:???
それはもちろん自分で負荷を計測してから聞いt(
165nobodyさん:04/10/16 11:06:14 ID:???
>>163
1ステップだ。↓を実行してみな
while(1) { fork;}
166nobodyさん:04/10/16 12:33:14 ID:???
前のカキコした香具師とは関係ないが便乗して

計測の方法が分かりません。。。
ググったらWin鯖は無理と書いてあったんですが、Win鯖で出来るソフトありませんか?
167nobodyさん:04/10/16 20:03:43 ID:???
>>166
話が見えない。
ああ、誤爆か…
168nobodyさん:04/10/16 21:45:26 ID:???
perlのスクリプトでflockしたファイルに対して、PHPのスクリプトでflockしたら(もしくはその逆も)、
ちゃんと排他は行われるでしょうか?
169nobodyさん:04/10/16 23:05:32 ID:???
CGIカウンターを設置したいので、perlを勉強しています。参考書を見て↓のを作成したのですが。

# カウントファイルの読み込み
open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません");
eval{ flock(FILE, 2);};
$count = <FILE>;

# カウントファイルの書き込み
seek(FILE, 0, 0);
print FILE ++$count;
close(FILE);

# サーバ出力
print <<END;
Content-type: text/html
中略)
END

Apachでエラーログをみると Premature end of script headers と出てしまいます。
どの部分を訂正すればよいのでしょうか?ご存知の方、ご指導お願いします。
170nobodyさん:04/10/16 23:13:07 ID:???
print <<END;
Content-type: text/html
中略)
171nobodyさん:04/10/17 01:00:06 ID:???
open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません");

このdieの部分はどこに出力されるのですか?ログとか?
172nobodyさん:04/10/17 01:03:49 ID:???
標準エラー出力 (STDERR)
173nobodyさん:04/10/17 01:38:29 ID:sz1VkLQM
配列のリファレンスをforeachで処理するにはどうしたらいいですか?
$dbh->{NAME}
が配列へのリファレンスだとして、
$dbh->{NAME}->[0]ではアクセスできる状態です。

foreach($dbh->{NAME})
{
 print;
}

foreach($$dbh->{NAME})
{
 print;
}

等とやってもうまくいきませんでした。
174nobodyさん:04/10/17 01:39:32 ID:???
@{$dbh->{NAME}}
175nobodyさん:04/10/17 01:41:51 ID:???
>>174
うまくいきました。ありがとうございました。
176nobodyさん:04/10/17 10:10:48 ID:???
>170
中略)の部分は

<html>
<head><title>perlアクセスカウンター</title></head>
<body>
<P>あなたは$count番目の訪問者です。</p>
</body>
</html>
END

Premature end of script headers 
エラー:カウントファイルが開けません のエラーログが出ます。

open or die の文がおかしいのかと思ったのですが、良くわかりませんでした。よろしくお願いします。
177nobodyさん:04/10/17 10:20:37 ID:???
初心者なんで間違ってるかもしれんが、
Content-type:text/htmlの後に改行が2つ(\n\n)必要だった希ガス
178nobodyさん:04/10/17 10:21:41 ID:???
openに失敗してるんだろ
179nobodyさん:04/10/17 13:45:28 ID:???
>>168
双方が協調して動作するためには、同じ方式のロックメカニズムを使用する必要があるが、
perlのflockはOSが提供しているflockとは限らない、PHPは知らない。
プラットフォームインディペンデントに作るなら、昔ながらのロックファイル方式か、
OSの提供する排他制御のプリミティブを直接呼び出すのがいいだろう。
180nobodyさん:04/10/17 22:56:51 ID:???
二次配列等は使えますか?
181nobodyさん:04/10/17 23:20:50 ID:???
>>180
ここに書く前にperlのdocument群を読んで欲しいかも。。。
182nobodyさん:04/10/18 01:01:57 ID:???
>>180
2年前に同じ質問したことあるな・・
183180:04/10/18 01:23:59 ID:???
これは失礼いたしました…
184nobodyさん:04/10/18 04:17:33 ID:???
myについて質問させて下さい。

sub a
{
my $daskin;
$daskin="かきくけこ";
&b;

&c;
}

sub b
{
my $daskin;
$daskin="あいうえお";
}

sub c
{
print "$daskin";
}

こういったスクリプトを書いた時、&a、&b、の中で$daskinは局所化されているので
&c内のprintの表示が空になることを期待していたのですが、「あいうえお」と表示されてしまいます。
変な質問ですが、みなさんにとっては納得のいく結果でしょうか?
私の局所化処理が間違っている場合、教えて下さいm(__)m
185nobodyさん:04/10/18 05:07:01 ID:???
申し訳ありません。
自己解決いたしました。
上記のスクリプト、ここへの転載も含め、私の記述が間違っていたようです。
186nobodyさん:04/10/18 13:44:39 ID:???
print <<"EOF";
メッセージ:
$message
ここまで
EOF

こういう記述があるとして、$messageにはランダムにメッセージが入るのですが、
ここに何も文字列が入らなかった場合、HTMLで見ると

メッセージ:

ここまで

このように、間が空行になってしまいます。
ここを上手く詰められるような記述方法は無いでしょうか。
187nobodyさん:04/10/18 13:54:10 ID:???
print <<"EOF";
メッセージ:
$messageここまで
EOF
188nobodyさん:04/10/18 16:35:34 ID:???
>>179
ありがとうございます。
ロックファイルでやる事にします。
189nobodyさん:04/10/18 18:54:11 ID:???
0410181738 という形の時間(year,mon,day...)をcookieの期限のために

sprintf("%s, %02d-%s-%4d %02d:%02d:%02d GMT",
$day,$mday,$mon,$year+1900,$hour,$min,$sec);

というような形にしたいのですが、曜日だけが変換のネックと
なっています。どのようにこの日の曜日を計算させればよいの
でしょうか?


190nobodyさん:04/10/18 19:32:32 ID:???
191nobodyさん:04/10/18 21:38:36 ID:???
1.http://aaa.a.a/a.cgi

2.http://bbb.b.b/b/cgi

1のプログラム上から引数を渡して2のプログラムを動作させて
結果を1のプログラムに返すようなことって可能でしょうか?

2のサーバーのローカルにあるデータベースからデータを取得して
1のサーバーのローカルにあるデータベースにデータを保存したいと
おもっております。 言語はperl使用です。
192nobodyさん:04/10/18 21:42:53 ID:???
>>191
LWPとか
さんざん外出
193nobodyさん:04/10/19 10:09:36 ID:???
>>192
何スレも前で既出のもんとかを既出の一言で片付けられたってわかるわけねーだろアフォ
どうせ本当に既出かどうかの確認もしてねぇんだろ?(pp
ん?何スレ目で話題が出たか言えるか?無理だろうなぁ日本語読めてないっぽいもんなぁ(・∀・)ニヨニヨ
194nobodyさん:04/10/19 10:22:08 ID:???
>>193
前スレで何回もでてるよ。確認もしてないのはお前だ。
195nobodyさん:04/10/19 10:25:54 ID:???
>>194
いや、どう見ても釣りだろw
196nobodyさん:04/10/19 14:27:41 ID:IcRPasE8
LWPで何百何千もの html をネットから落としてきて解析するプログラム書いてるんですけど
request() とrequest()の間ってやっぱsleepとか入れて間を開けた方がいいのでしょうか?
具体的には ヤフーの株価データなんですけど
197nobodyさん:04/10/19 14:35:05 ID:???
>>196
相手次第
198nobodyさん:04/10/19 17:42:02 ID:6g0jZqZR
日本一Perlが凄い人ってKENTさんですか?
199nobodyさん:04/10/19 17:45:10 ID:???
もちろんそうですよ。
200nobodyさん:04/10/19 19:19:06 ID:???
CGIレスQって、・・・・なコーディングがしばしば。
201nobodyさん:04/10/19 20:44:07 ID:AGmXypRw
自宅サーバ板か迷いましたがprogエキスパートの方のほうが確実。
現在、ADSLですが、DDNSは使っていないので、固定Webアドレスが保証できない状態です。
ADSLモデムのルーター機能を通していますので、当然ルーターにグローバルIPが振られてます。
では、プライベートIP上のCGI実行Progでこのルーターのグローバル
IPを得ることはできます?
あるperlのCGI実行スクリプトがWebサーバー上のフォルダへのフルパス(http://〜)
を要求しているので、グローバルIPが固定でない場合ですから、その都度prog的にIPを取得すれば使えるのでお願いします。
win me
AN HTTPD
ActivePerl5.8.4
です。
202nobodyさん:04/10/19 20:57:26 ID:???
ベタだが、そのルータの設定画面からひろっちゃえば?
ページの取得にはLWP使用。
203nobodyさん:04/10/19 21:25:04 ID:???
同じ環境に設定したサーバーにperlで書いたCGIをいれて動かしているのですが
片方ではcommon.plというところでとまってしまいます
片方ではすんなり動きます
おそらく何か重要な部分を設定ミスしてると思うのですが
わかる範囲でチェックをしたつもりなのですが
1から重要な場所をチェックできるようなサイトをどなたかしりませんか?
もしくは直感的にどこが悪いか指摘していただいても結構ですので
よろしくお願いいたします。
204nobodyさん:04/10/19 21:36:22 ID:???
205201:04/10/19 22:15:51 ID:???
>> 202
ありがとうございます。
ルーター設定ページを読み込んで、読み取る方法も確かにそれもありですね
ベタですね。確かに^^
おそらくActivePerlなので、Win用ActiveXコンポーネント(dllなど)が利用できるので
できますよね。WIN32APIも呼べるはずですが、…そのサンプルを今探しております。
P…面倒だからやはりDDNSか固定IP…
いやがんばります。できたら報告致します・
206nobodyさん:04/10/19 23:13:46 ID:???
REMOTE_ADDR表示するCGIをインターネット上のどっかにおけばいいじゃん。
207nobodyさん:04/10/19 23:56:47 ID:???
>>205
DDNSの方が断然楽そうですなぁ。。。
208nobodyさん:04/10/20 04:50:52 ID:aP/RN7ic
>>203
それだけじゃわかんない。
209nobodyさん:04/10/20 10:36:58 ID:???
rename関数を使ったファイルロックを考えてます。

for($i=2;$i>0;$i--){
if (rename("file.unlock","file.lock")) {last;}
}
if($i<0){
die "Failed file lock";
}
処理
rename("file.lock","file.unlock");
これに「異常終了しファイルロックが1分以上かかっていたら修正する」という処理を入れたいんですが、どんな方法がありますか。
210nobodyさん:04/10/20 10:41:01 ID:???
for文間違ってました
条件が $i>=0 です。
211nobodyさん:04/10/20 11:05:53 ID:???
212203です:04/10/20 11:51:17 ID:???
>>208さん
現在mein.cgiというのを動かしているのですが
# CGI 初期設定のインポート
require"../config/default.cfg";
# 変換ライブラリのインポート
require"../common/jcode.pl";
# CGI共通ライブラリのインポート
require"../common/common.pl";
という順番でrequireしていっています
片方では問題なくcommon.plはとおるのですが、片方では
さばのログを読む限りではcommon.plを読み込んでいる最中に
500エラーとなってとまってしまっています。
ちなみにエラーで止まる部分は

この部分→use Date::Calc qw(Delta_DHMS);
my($days, $hours, $min, $sec) = Delta_DHMS($young_year, $young_mon, $young_day, $young_hour, $young_min, $young_sec,
$old_year, $old_mon, $old_day, $old_hour, $old_min, $old_sec);
です。
213nobodyさん:04/10/20 12:12:49 ID:???
お前の勝手な解釈による抜粋よりエラーメッセージそのまま
貼った方がいいと思うけどな...
214203です:04/10/20 12:29:46 ID:???
>>213さん
BEGIN failde--compilation aborted at common.pl line108
です
215nobodyさん:04/10/20 12:31:34 ID:???
それだけじゃないだろ
216nobodyさん:04/10/20 12:36:07 ID:???
まず、mainのスペルミスを直してくれないか。
217nobodyさん:04/10/20 13:28:26 ID:???
>211
ありがとうございました
218nobodyさん:04/10/20 13:40:35 ID:???
オリゴ糖ございました
219203です:04/10/20 13:43:29 ID:???
すみません事故解決しました
Date::Calc
のモジュールが入っていませんでした
どうもお騒がせしました
220nobodyさん:04/10/20 14:01:44 ID:???
>>214
事故解決したようだが、注意しとく。

まずひとつめ。「BEGIN failde」なんてなってるところからして
コピペじゃなくて手打ちしただろ? 手打ちは間違えて混乱のもと
になるのでこういうときはできる限りコピペするのが基本。どう
してもできないときはしょうがないが、鯖のログなら普通コピペ
できるはずだ。

またuseしてるモジュールがないときは、エラーメッセージは

Can't locate ナントカ.pm in @INC (@INC contains: (中略)) at ほげほげ line XX.
BEGIN failed--compilation aborted at ほげほげ line XX.

って2行でる。勝手に1行目削られるとナントカ.pmがないっていう
いちばん肝心な情報がわからなくなるわけだ。だからちゃんとした
アドバイスを受けたければエラーメッセージをそのまま貼れって
いわれるのよ。

次になんか質問するときは気をつけよう。
221nobodyさん:04/10/20 14:42:43 ID:???
質問です。
ファイル名にマルチバイト文字が使われているファイルがサーバーにあるとして、
そのファイルに直接アクセスしようとしても404になり、
マルチバイト文字の部分だけをURLエンコードすると正常にアクセスできます。

検索CGIを作っていまして、ファイル名にマルチバイト文字がある場合、
URLエンコードを行なってから検索結果画面を出そうと思っています。
例えば、このCGIからマルチバイト文字をファイル名に使ったファイルへのパスが
../data/俺俺.txt
だとします。
この場合、../の部分を絶対パスに置き換えてから検索結果に出力しているのですが、
http://www.domain.com/data/俺俺.txt
の「俺俺」の部分だけをURLエンコードする方法をご存知の方はいないでしょうか。
Perlメモにて全角文字の有無を検出する方法はわかったのですが、
全角文字の部分だけを変換して変数に保存したいのです。
222nobodyさん:04/10/20 14:48:18 ID:???
>>221
$path =~ s/(全角文字列にマッチする正規表現)/URLエンコードする関数($1)/ge;

とかでいいんじゃないの?
223nobodyさん:04/10/20 15:03:45 ID:???
use Encode が使えると楽だが、perl5.005 あたりだと文字コードによってはいろいろ厄介かも
224221:04/10/20 15:18:11 ID:???
レスありがとうございます。また、使用Perlは5.6.1です。
出力されるページ及びスクリプト自体はSJISなので、
EUC変換を行なってから下記のコードを追加しました。

# Perlメモの正規表現より「ASCII以外」の文字列がある場合
if ($path =~ /[\x8E\xA1-\xFE]/) {

 # 「ASCII以外」の文字列をエンコードする
 $path =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", $1)/eg;

}

とりあえずはこの方法で解決できそうです。
即レス感謝です。
225nobodyさん:04/10/20 15:22:06 ID:???
>>224
ファイルシステム上のファイル名がSJIS(cp932)だとその方法は使えんが、大丈夫だろうな?
226221:04/10/20 16:05:39 ID:???
ローカルでのテストでは動くようですが、鯖に上げても動かなかったです。
ちなみにローカルでのテスト環境は、「Win2000Pro ActivePerl5.6.1 AN HTTP Daemon 1.42k」です。

HTMLの読み物として「リンクの方法.txt」というファイルが実際にありまして、
とりあえずそれを検索する事でテストしています。
「リンクの方法」はSJISですと「%83%8A%83%93%83%4E%82%CC%95%FB%96%40」、
EUCですと「%A5%EA%A5%F3%A5%AF%A4%CE%CA%FD%CB%A1」となるようです。
一部省略してますが、該当部分のソースを下に書かせていただきます。

$temp_euc = $temp;              # $tempはsjisで、ファイル名だけが入ってます
&jcode::convert (\$temp_euc, "euc");    # $tempをEUCにした$temp_eucを用意
if ($temp_euc =~ /[\x8E\xA1-\xFE]/) {  # Perlメモの正規表現より「ASCII以外」の文字列がある場合
 $temp_euc =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", $1)/eg;
}
print <<"HTML";
<A href="$absolute_dir\/$temp_euc">$temp</A> # 絶対パスとファイル名を結合したパスへとリンク
HTML

この方法ですと、>>224氏が言ったように、
<A href="http://www.domail.com/%A5%EA%A5%F3%A5%AF%A4%CE%CA%FD%CB%A1.txt">リンクの方法.txt</A>
となり、<A>タグ内のリンク先のファイル名がEUCとなって、ファイルシステム上のファイル名の関係で使えませんでした。
もう少しやり方を模索してみます。
227221:04/10/20 16:10:55 ID:???
アンカーをミスりますた。>>225氏が言ったように、でお願いします。

要するに、マルチバイト文字だけをURLエンコードしたいが、
マルチバイト文字を正確に検出するにはEUC形式である必要がある。
しかし、そのままEUCをURLエンコードしてもファイルシステムの都合上使えないため、
マルチバイト文字に該当する部分だけをSJISでURLエンコードができれば、ということです。
228nobodyさん:04/10/20 16:14:20 ID:???
>>221
EUCで取り出したのをSJISに変換してからエンコードすりゃいいだけじゃない?
229460:04/10/20 17:03:41 ID:???
perlでAが真且つBが真の時ってのを組みたいんだけど、その時は
if ( A ){ if ( B ){ 〜 }}か
if ( A , B ){ 〜 }
で良いかな?
230nobodyさん:04/10/20 17:08:37 ID:???
if (A && B) { 〜 } じゃ不満なのか?
231nobodyさん:04/10/20 17:08:54 ID:???
&&
232nobodyさん:04/10/20 17:08:57 ID:???
誰か>>460に答えてやれよ
233231:04/10/20 17:09:17 ID:???
かぶった
234nobodyさん:04/10/20 17:14:10 ID:???
>>229 = >>232みたいなヤツは放置しよう。
235nobodyさん:04/10/20 17:17:40 ID:???
>>232は皮肉で言ってるんだろ。>>229の名前欄が前書き込んだまま
236221:04/10/20 17:24:04 ID:???
>>228
申し訳ないですが、もう少し方法を具体的に教えていただけないでしょうか。
「EUCで取り出した」とはどの部分を指すのでしょうか。
$temp_euc =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", $1)/eg;
のように、一括で変換を行なうわけではないということですか?
237nobodyさん:04/10/20 17:28:45 ID:???
>>236
その例でいくと

unpack("H2",$1)

のところを

unpack("H2",eucをsjisに変換する関数($1))

にすればいいってことでしょ。
238nobodyさん:04/10/20 19:48:35 ID:???
>>236
いちいちEUCにしないで全部SJISでやればいいのに
エンコード対象が[^\w.-]ではダメなの?
239nobodyさん :04/10/20 20:16:04 ID:???
>>238
sjisだとメタ文字がコード含まれれるから\wじゃ駄目でそ。
eucも最上位ビットに1立つから\w駄目でない?
240nobodyさん:04/10/20 22:12:07 ID:???
>>238
SJISは正確なマッチングが出来ないんじゃなかったっけ?
241nobodyさん:04/10/20 22:16:04 ID:???
>>240
       , -,:'   / ̄) i{'r‐-、 `ヽ、
.    _...,,o‐y    ,:'- '⌒   ⌒ヽ. `ヽ' ,
    (o(  ,'    / /     、 `ヾ.   ヾ,
  ,:'´//7,'  ,' .,' ,:'   !  } i  !', ':,  ':,    ゙:,
  ,' / ,' {l.  ! {/   ,イ / }|  !|', !.  ',  ', ゙,
 ハ〃 ! !|  | |  ∠/ ,:'-ノ} /リ l ,ム.  !  } |!
  ハヽ、ゝ!|  l | ,:',;='ィ'、'´ ,'.ノ ノ.,;lノ=、l .,' ,' ,' ノ
    {   l l ', |'ヲi(_ノ.}  ´    i(ノ.}゙!ノ,:',:''´
     ',  h. ', ',゙、 ':゙゙_.ノ.     ':゙_ノ〃ン
     ':, { ',', ':,':,         丶   ,' l .}
      ヾ ':,':, ':ヾ、._    「´/    ,' | .,'    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        `ヾ-、`ヽ_    `´ _,.ィリ.ノ ,'  < なんとなかるよ、絶対大丈夫だよ!
         リ';',ヾ|  ` ‐┬ ´ _ノノ,'/     \______________
          ヾ,、-- 、 _ |     ´ノ'
          f ヾ、..___ ヽ、 ー‐''
         /_......_     \
242nobodyさん:04/10/20 22:31:34 ID:???
キモAA貼るヤシ死ねよ
243nobodyさん:04/10/20 22:35:28 ID:xGLMj0YB
my ($abc, $def) = @_;

このコードの意味がさっぱり分からんのでオシエテクリソ-

244nobodyさん:04/10/20 22:56:55 ID:???
@_ さんが袋に詰め込んでいる物を
$abc, $def の2人が「俺の物だ」って奪うんだよ。

でも不思議なことに奪われた袋の中身はなくなっていなーい。
245nobodyさん:04/10/20 23:02:27 ID:???
ワロタw
246nobodyさん:04/10/20 23:14:24 ID:xGLMj0YB
>>244
@_は変数ではないですよね?
もう少しヒントクリソー
247nobodyさん:04/10/20 23:26:27 ID:???
いや変数だよ。特殊変数。
248nobodyさん:04/10/21 01:10:59 ID:???
SJISならこれでいいんでは?
$str =~ s/([\x81-\x9f\xe0-\xfc])([\x40-\x7e\x80-\xfc])/sprintf("%%%02X%%%02X",ord($1),ord($2))/eg;

っと、半角カナ用にもう一押し必要か。残念!
\xa0-\xdf斬り。
249nobodyさん:04/10/21 01:31:19 ID:???
ASCII文字以外がある場合って書いてあるけど、
ASCII文字って厳密にはどこまでを指してんだ?
半角英数字記号をASCIIってとらえるんなら、
250nobodyさん:04/10/21 02:46:20 ID:???
perl 特殊変数でググれば幾らでも出てくるよ。
251201:04/10/21 05:43:48 ID:???
報告その1
LAN側からのみルーターにプライベートアドレスでtelnetでアクセス
で情報を得る。

252nobodyさん:04/10/21 10:50:09 ID:???
>>243
my ($abc, $def) = @_;
print ($abc, $def);
print \n;
print @_;
する
253221:04/10/21 11:33:49 ID:???
>>237

$temp_euc = $temp;              # $tempはsjisで、ファイル名だけが入ってます
&jcode::convert (\$temp_euc, "euc");    # $tempをEUCにした$temp_eucを用意
if ($temp_euc =~ /[\x8E\xA1-\xFE]/) {  # Perlメモの正規表現より「ASCII以外」の文字列がある場合
 $temp_euc =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", &euc2sjis ($1))/eg; # ここを変更
}
print <<"HTML";
<A href="$absolute_dir\/$temp_euc">$temp</A> # 絶対パスとファイル名を結合したパスへとリンク
HTML

sub euc2sjis { # 追加したサブルーチン
 my $str = $_[0];
 &jcode::convert (\$str, "sjis", "euc");
 return $str;
}

>unpack("H2",eucをsjisに変換する関数($1))
と言って下さったように変えてみたのですが、HTML部に表示されるエンコードされたURLは変わらずEUCのままでした。
追加したサブルーチンが動いていないのかとも思って確認しましたが、
単体で動かして確認したところ、sub euc2sjisは正常に動いているようです。

他の方が提示してくださった方法も見てみます。
254nobodyさん:04/10/21 11:58:55 ID:???
>>252
\nはダブルクオートで囲みやがれ
255nobodyさん:04/10/21 12:09:34 ID:???
EUC->SJIS変換には最低2バイト必要なわけで。1バイトなら無変換なのもしょうがないかと。
なんか、そこはかと遠回りしている気がするよ。\Wをエンコードするだけじゃ動作しなかったっけ?別に正確なURLエンコードを目指さなくても動作すればそれでいいのでは?
256nobodyさん:04/10/21 12:24:56 ID:???
257nobodyさん:04/10/21 12:30:19 ID:a34sr5QL
フォームから申し込みがあるたびに
a0001
a0002
a0003
という風に増加する変数を作りたいのですがどうすればいいでしょうか?
参考になるサイトなんかあったら教えてください。
宜しくお願いします
258nobodyさん:04/10/21 12:37:54 ID:???
>>257
$hensu = a0001;
$hensu++;
print $hensu;
259nobodyさん:04/10/21 12:39:13 ID:???
Perl マジカルインクリメントでぐぐれ
260nobodyさん:04/10/21 12:55:04 ID:???
>>258
レスありがとうございます。素朴な疑問ですが、
アルファベット文字含んでても、++で問題なく a002 になるんでしょうか?
>>259
調べてみます。ありがとうgざいます。
261258:04/10/21 13:00:50 ID:???
>>260
やってみて言えよ
262259:04/10/21 13:05:48 ID:???
>>260
ぐぐってから言えよ
263nobodyさん:04/10/21 13:25:31 ID:???
ぐぐりますた、わかりますた、サンクスコ
264221:04/10/21 14:44:50 ID:???
>>248氏の方法で実行してみたところ、
半角カナ以外では正常に実行できました。
とりあえずはこの方法で実装しようと思います。

あとは半角カナの対応ですか・・・
265nobodyさん:04/10/21 15:11:42 ID:???
>>264
\x5Cを含む表や申が入っている漢字でも上手く行く?
気になったからやってみたけど
Win2k+Apache1.3.31+ActivePerl v5.6.1の環境で正常動作しないんだよな
266221:04/10/21 15:25:17 ID:???
>>265

「Win2000Pro ActivePerl5.6.1 AN HTTP Daemon 1.42k」という環境で実行してます。
実際に導入するのは、悪名高い@ni○tyのCGI鯖ですが。

「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄.txt」
という、わざとらしく\x5Cを使った文字で構成されたファイル名を用意して、
このテキストファイル内の文字を検索して結果画面を出してみたところ、

<A href="%81%5C%83%5C%84%5C%87%5C%89%5C%8A%5C # 略 # .txt">―ソЫ\噂浬欺圭構 # 略 # .txt</A>

というHTMLが出力され、実際にそのリンクからファイルへアクセスできることは確認できました。

また、そのテキストファイル内に「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄」という内容を書き、
同じく「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄」で検索して正常に結果が表示されることから、
今のところは>>248氏の処理で半角カナを扱えない点以外での問題は無さそうです。
267nobodyさん:04/10/21 15:43:18 ID:???
>>266
my @str = qw(
http://example.com/data/リンクの方法.txt
http://example.com/data/俺俺.txt
http://example.com/data/ハンカクカナA.txt
http://example.com/―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄.txt
);

s{([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])}{
  my $chr = $1;
  $chr =~ /^[\x00-\x7F]\z/
    ? $chr
    : join('', map sprintf('%%%X', ord), split //, $chr)
}eg for @str;

print join "\n", @str;

# SEE ALSO: http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
268265:04/10/21 16:25:51 ID:???
>>266
エンコードは問題ないのにアクセスできないという不思議な現象に陥ってました
結局ANHTTPDに変更したらあっさり解決したのでApacheが悪かったようです

しかし何故Apacheじゃ見えなかったんだろう?
うーん気になるな・・・
269nobodyさん:04/10/21 16:33:29 ID:???
>>225で言ってるのがヒントのヨカン
270nobodyさん:04/10/21 16:52:10 ID:???
すいません、色々見てて気になったんだけど、
for (@配列) { 〜 }
って、これって
foreach (@配列) { 〜 }
と繰り返す回数って違うの?
271nobodyさん:04/10/21 16:57:06 ID:???
何 で や っ て か ら 聞 か な い ?
272221:04/10/21 17:56:10 ID:???
>>267氏、これで正常に動きました。感謝します。

が、肝心の s{ 以下の処理の部分が何をしているかが不明なので、ちょっとまだ導入できないです・・・
? と : が if else って事くらいしかわからない上に、色々と省略された書き方をされているようなので、
理解には時間がかかりそうです。
一文字ずつ分解して、[\x00-\x7F]以外のものはordで数値変換してsprintfで16進数に書き出しているということですよね。
splitを消すと\x5Cがおかしくなるようですが、何の処理をしているかもまだ理解の範疇にはないようです。

省略した書き方とかしたこと無いんで、冗長なコーディングしか出来ない自分が悲しい・・・
あと、省略できるものも極力省略しないという書き方をしているので(自分が理解できなくなると困るので)、
このソースをもとに何とか書き換えて実装してみようと思います。
273nobodyさん:04/10/21 20:11:32 ID:a34sr5QL
作業に若干時間がかかるスクリプトを単体で起動させると問題ないのですが、
サブルーチンとして起動させると、作業を終える前に次のコードに移ってしまいます。
これはどうやって防げばいいでしょうか?
274nobodyさん:04/10/21 20:52:06 ID:???
何も考えないで書くけど、
そのサブルーチンの最後に何かフラグを立てて、
それが立ってなければ待つってのは?
275nobodyさん:04/10/21 21:15:46 ID:???
話がよく見えないのだが、
サブルーチンという言葉の使い方が間違っているように思えてならない。
ひょっとして「子プロセス」とかそういうモノを指しているのか?
276273:04/10/21 21:40:12 ID:a34sr5QL
すいません、正しくはモジュールかもしれません。
いわゆる.plファイルです。
aというモジュールがあります。
b(.pl)というモジュールからaをuseしてます。
.cgi からbモジュールをrequireすると、aモジュールの作業を完了しないまま、
bモジュールの次のコードに移ってしまいます。
.cgiにから直接aモジュールをuseしたら、問題は
発生しませんでした。
277nobodyさん:04/10/21 22:08:58 ID:???
ますます混迷の度合いが深まってきた気がする...
278nobodyさん:04/10/21 22:14:52 ID:???
>>276
ああわかった。それはあれだ。

use したファイルはコンパイル時に読み込まれて実行されるが、
require したファイルはコード実行時に読み込まれて実行される。

b が require された時点ではコンパイルがとっくに終っているので
b の中で use した a が実行される機会は永遠に巡ってこない。
279273:04/10/21 22:21:30 ID:a34sr5QL
>>277
ちょとわらた
>>278
改善策ありますか?
280278:04/10/21 22:31:20 ID:???
b から a を use でなく require(+import) すれば良いんでないかと思うが試してない
281273:04/10/21 22:51:54 ID:???
require してみますたが、変わらずでした。
require、use云々ではないかもしれません。
wait;ってのが気になってるのですが、
これはどうやって使えばいいのでしょうか?
ググッテも情報量がひっじょーに少ないとです。
ヒロシです
282nobodyさん:04/10/21 23:06:49 ID:???
use や require は同一プロセス内での呼び出しだが、
wait は子プロセスの終了を待つ関数なので、使えない
283nobodyさん:04/10/22 10:48:37 ID:???
Cだと入力がCtrl+D(windowsはCtrl+Z)だとプログラム終了ってのを
if (nyuryoku == '\0') {exit(0);}
て書けるけど、perlだとどう書きますか。以下の何入れても
quer!が出ちゃうんです。
$var=<STDIN>;
chomp($var);
if ($var eq "\0") {
exit(0);
} else {
print "quer!\n";
}
284nobodyさん:04/10/22 10:50:06 ID:cSoqDRBP
上げておきますね^^
285nobodyさん:04/10/22 11:17:20 ID:???
>>283
行入力演算子(<>)はEOFでは未定義値を返すので、

if (!defined $var) {
286283:04/10/22 11:23:46 ID:???
>>285
どうもだす。それで行けますた。
287nobodyさん:04/10/22 11:42:34 ID:Y4MW0wLE
DBI.pm には Mysql.pm にあった fetchcol() メソッドがないみたいですが
自分で実装するしかないのでしょうか?
288nobodyさん:04/10/22 11:55:42 ID:+fQGbTx6
例えば "掲示板" という文字、UTF-8でエンコードすると

"E6%8E%B2%E7%A4%BA%E6%9D%BF"
となると思います。

そして本来UTF-8のコードである "E6%8E%B2%E7%A4%BA%E6%9D%BF" を誤って
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;
でデコードすると

"牙ず? "

となってしまいます。
この "牙ず? " を元のUTF-8のコード "E6%8E%B2%E7%A4%BA%E6%9D%BF" に戻すには
どのように処理したらいいのでしょうか?
どなたか教えて下さい。


289nobodyさん:04/10/22 12:20:13 ID:???
>>288
バイト列としてはちゃんとデコードできているが、utf8として解釈すべき
バイト列をEUCだと思って見てるから変に見えるだけじゃない?

EUCで表示したければ適当にutf8→eucに変換すればいい。

use Jcode;

$str = "%E6%8E%B2%E7%A4%BA%E6%9D%BF";
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;

print Jcode->new($str)->euc,"\n";
290nobodyさん:04/10/22 12:45:55 ID:pO/k5T0Y
すみません、教えて下さい。

手持ちのマニュアルで16進定数の記述方法が

$a='/abcd';

となっていたので携帯用絵文字を定義しようとしたのですが、

print $a;

をやると、/abcdと出てしまいます。

' を " に変えたり色々してみたのですが上手くできません。
正しい16進定数の代入の仕方を教えて下さい。m(__)m
291nobodyさん:04/10/22 13:17:36 ID:???
バックスラッシュの間違えじゃないのか
292nobodyさん:04/10/22 13:17:37 ID:???
$a= 0xabcd;
293nobodyさん:04/10/22 13:33:16 ID:???
教則本だと\がバックスラッシュとかになるから気をつけれ
294nobodyさん:04/10/22 14:27:39 ID:pO/k5T0Y
>>291-293さま
ありがとうございます。
今からやってみます。(;;
295nobodyさん:04/10/22 15:33:52 ID:pO/k5T0Y
できましたー。
ありがとうございました!!!!!
296nobodyさん:04/10/22 17:38:09 ID:gkwMnLH6
web上のファイル(複数)をperlを使って圧縮・サーバー上に保存、することはできますか?
よろしくお願いします。

環境:FreeBSD 4.7 UNIX O/S
perl5.6.1
297296:04/10/22 17:45:28 ID:gkwMnLH6
web上、サーバー上と表記しましたが、両方とも同じ自分がレンタルしているwebサーバーのことです。
下手くそな文章で申し訳ありませんが、よろしくお願いします。
298nobodyさん:04/10/22 17:54:42 ID:???
299nobodyさん:04/10/22 18:01:00 ID:???
>>298
それは笑う所ですか?
300nobodyさん:04/10/22 18:02:41 ID:???
301300:04/10/22 18:07:22 ID:???
302296:04/10/22 18:39:07 ID:???
>>298
>>300
ありがとうございます。
これから見に行って勉強してみます。
303nobodyさん:04/10/22 19:26:58 ID:???
print qq|<TITLE>テスト</TITLE>|;
としたら、
apacheのエラーログにUnrecognized characterというエラーが表示されました。
どうも、テストという日本語に問題があるようですが、
この場合、どうすれば日本語を利用できるようになるでしょうか?
phpを以前ちょっといじっていて、htmlの組み込み安さに感動したんですが、
perlは結構面倒なんですかね?
304nobodyさん:04/10/22 19:31:59 ID:kB/Ig1ML
age
305nobodyさん:04/10/22 19:32:44 ID:PwMLf+Ap
use CGI;
$data=new CGI;
$name=$data->param('name');
$mail=$mail->param('mail');
$message=$message->param('message');

こうやって取り出したデータの中の文字は、
URLエンコードされたままではなく元に戻されているのでしょうか?
306nobodyさん:04/10/22 19:41:09 ID:???
>>305
プリントしてみりゃいいだろ
307305:04/10/22 19:50:08 ID:PwMLf+Ap
>>306
プリントしてみたら元に戻っていたので、あれ?と思ったんです。
今までずっと$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
やってたんですけど。
実は要らなかったのかなと思いまして。

実際どうなんでしょう?
ついでに、文字コードなんかはどうなっているのでしょうか?
308nobodyさん:04/10/22 19:58:14 ID:???
(´-`).。oO(なんで自分で確かめられないんだろう)
309nobodyさん:04/10/22 20:02:09 ID:???
>>303
エスケープ文字について勉強しなおすことをすすめる
310nobodyさん:04/10/22 20:03:26 ID:???
>>309
qqについて勉強しなおすことをすすめる
311nobodyさん:04/10/22 20:05:07 ID:???
何にでも「自分でやってみて確かめろ」と返す人は多いが
漏れは敢えて「やってみなきゃわからんのは頭悪過ぎ。まず man を読め」と言うことにする
312nobodyさん:04/10/22 20:07:35 ID:???
>>311
チラシの裏にでも書いてろ
313nobodyさん:04/10/22 20:56:34 ID:???
最近のチラシは両面印刷です
314nobodyさん:04/10/22 20:57:46 ID:???
>>313
プリントの裏にでも書いてろ
315303:04/10/22 21:00:19 ID:???
調べましたが、やぱーりわかりません。
だれかヘルプみー
316nobodyさん:04/10/22 21:01:36 ID:???
>>312-313
すまん、ワロタw
317nobodyさん:04/10/22 22:03:02 ID:???
>>315
全角スペースでも入ってるんじゃないのか?
318nobodyさん:04/10/23 15:43:12 ID:EsL8XLQN
すいません、質問です。
perlには、Cにおけるfprintfのような関数はないのでしょうか?

print FILE hogehoge;

というのが何行も続いてしまい、違和感を感じるのですが。
319nobodyさん:04/10/23 16:40:33 ID:???
>>318
Perlは元々レポート作成用言語ディスよ?

fprintfに限らず、テキストの、文字入出力、ファイル入出力においての利便性は
Cとは比較にならんて。

ヒアドキュメントでも、format でも sprintf でも好きなもので対処すれば?
320nobodyさん:04/10/23 16:41:54 ID:???
if(hoge||hogehoge){

の「||」の意味が分かりません。
だれか教えてくださいませ
321nobodyさん:04/10/23 16:43:05 ID:???
>>320
or と ほぼ同じ。 or よりも優先順位が高いので or と書いておいたほうが
意図どおり動くことが多いはずだよ。
322nobodyさん:04/10/23 16:43:06 ID:???
>>320
演算子
323nobodyさん:04/10/23 16:53:18 ID:???
>>320
()だらけでウザイ時に良く使う。
324nobodyさん:04/10/23 17:39:11 ID:???
>>319
318は printf FILE ほげほげ と書けることを知らないに一票。
325nobodyさん:04/10/23 17:42:48 ID:???
>>319

sprintfで解決しました。

printする文字列を関数呼び出しで作成するというのは考えが及びませんでした。
どうもありがとうございました。
326nobodyさん:04/10/23 19:41:00 ID:???
mkdir使うみたいに sudo mkdir を
perlで利用することは不可能でしょうか?
権限ないディレクトリにはディレクトリ作成できなかったので、
sudoで特定のユーザにmkdirの権限与えたのはいいものの、
perlで使おうとしても使えないんですね。
telnet経由しかむりぽなのでしょうか?
327nobodyさん:04/10/23 19:55:17 ID:???

コーディング 【coding】

プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
(e-Wordsより)

自分の質問がPerlに関することなのか、
それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、
質問して下さい。
328nobodyさん:04/10/23 19:55:48 ID:???
>>326
いや、普通にできると思うけど。具体的にどうやってるか示されてない
のでこれ以上はなんともいえんがな。

でもmkdirのような引数しだいでどこにでもディレクトリ作れるコマンドを
sudoで許可するのはあまり感心しないな。
329326:04/10/23 20:20:45 ID:???
perl で my $makedir = `sudo mkdir $user_dir/new`;
としています。
aユーザからbユーザのディレクトリに newというディレクトリ
を作成するようにしていますが、
上記ではうまくいきません。
bユーザディレクトリの権限をaユーザのものにし、
my $makedir = `mkdir $user_dir/new`;
とした場合は問題なく作成されます。

宜しくお願いします
330nobodyさん:04/10/23 22:28:08 ID:???
池沼には、それがコーディングの問題じゃないということがわからないのだろうか?
331nobodyさん:04/10/23 23:18:04 ID:???
もういいよこの類に触るのはやめやめ
次の質問よろ
332nobodyさん:04/10/24 10:16:22 ID:???
hogeほげって何ですか?
何か意味があるんですか?
333nobodyさん:04/10/24 10:38:56 ID:???
>>332
perlコーディングには関係ないと思うんですが...
サザエさんの、来週もまた見てくださいねぇ〜、hogehugu が起源です。
334nobodyさん:04/10/24 12:22:59 ID:???
サザエさんはfugafuguだろ。うそ教えるなよhage
335nobodyさん:04/10/24 13:34:27 ID:???
336nobodyさん:04/10/24 19:38:54 ID:5pufjC0P
http://www.harukaze.net/~mishima/perl/module/upload_by_CGI_pm.html

こちらを参考に、アップロードのCGIを作成しているのですが、
アップロードを行うと、同フォルダにゴミファイルのようなものが出来てしまいます。
これを、消す事は出来ないのでしょうか?
337nobodyさん:04/10/24 19:40:35 ID:???
消せばいいんじゃない?
338nobodyさん:04/10/24 20:14:53 ID:5pufjC0P
すいません、消すと言うか、もとから作成されなくするって事は出来ないでしょうか?
339nobodyさん:04/10/24 20:36:57 ID:???
>>338
ごみファイルってCGITemp?????とか言うやつ?
340nobodyさん:04/10/24 20:38:56 ID:5pufjC0P
>>339
はい、そうです。
341nobodyさん:04/10/24 20:40:37 ID:???
>>340
print(OUT $file);
close(OUT);

この間に一工夫いる。
CGITempでぐぐるといいよ。
342nobodyさん:04/10/24 20:47:25 ID:5pufjC0P
print(OUT $file);
close($filename);
close(OUT);

としたら、作成されないようになりました!(これで、大丈夫ですよね)
大変ありがとうございました。
343336:04/10/24 21:57:58 ID:B/djfAD8
アップロードに関して、もう一件質問させてください。

アップロードしたファイルの名前を変更したいのですが、

print(OUT $file);
rename("$filename", "123456.xls");
close($filename);
close(OUT);

と、したのですが、これでは駄目なのでしょうか?
試してみたところ、上手くいきませんでした。
344nobodyさん:04/10/24 22:08:01 ID:???
ファイルの名前変えるのはファイル閉じてから。
345nobodyさん:04/10/24 22:18:07 ID:???
>>343
ハンドル持ってると操作が限定されるよ。
試しにopenしてから何秒かsleepさせて、その間に削除しようとしてみ。
346336:04/10/24 23:10:44 ID:B/djfAD8
>>344
renameの位置を変えて、色々といじったら、うまくいきました。

>>345
アドバイス、ありがとうございます!

度々申し訳ありません、もうひとつ質問させてください。
このコードでは、HTML部分でWinとMacを最初に入力するようにしていますが、
Winを使用しているのにMacを選択してしまった・・・と言う場合に、
何か不都合が発生するのでしょうか?
自分で試したところ、どちらでも特に問題なくアップできましたので・・・

できれば、この入力部分は省きたいと思っておりますので、
必要無い、との事でしたら削除しようと思っております。
347nobodyさん:04/10/24 23:33:53 ID:???
3度続くと流石に答えてもらえなくなる。
348nobodyさん:04/10/25 11:29:41 ID:???
>>345
それwindowsの話かな? unix系だとopen直後にunlinkしてプロセス終了時に
一緒になくなる一時ファイル作るってわりとありがちな手なんだけどね。
349nobodyさん:04/10/27 07:17:45 ID:???
UTF-8 の判別、EUC へ変換などをしたので Jcode を利用したいのですが、
Jcode.pm をスクリプトに同梱して配布したとしても
サーバ側でインストールがされていないと使えないものなんでしょうか?
この辺の仕組みがよくわかりません……。
350nobodyさん:04/10/27 07:53:40 ID:???
色々漁ってたらなんとなくわかってきました。
とりあえずインストールしてなくても動かすことはできるみたいですね。
スレ汚しすみません。
351nobodyさん:04/10/27 09:59:20 ID:???
すみません、質問させてくださいませ。
とあるドメインから、別のドメインのディレクトリ一覧、及びファイルの読み込みを行いたいのですが、
下記のようにするとオープンエラーになります。
(改行が多いと言われたので、次に書きます)

別ドメインのディレクトリ内容やファイルの取得は出来ないのでしょうか?
もし可能でしたら方法を知りたいのですが、お教えいただけませんでしょうか?

352nobodyさん:04/10/27 09:59:56 ID:???
--------------------------------------------

# ディレクトリの一覧を取得

if( !opendir(DIR,"CGIを設置しているところとは別のドメインのディレクトリ") ){
print"OpenErr";
}else{
foreach $file( readdir(DIR) ){
print "$file<BR>\n";
}
closedir(DIR) ;
}

--------------------------------------------

# ファイルの中身を取得

if (!open(IN,"CGIを設置しているところとは別のドメインのファイル") ){
print"OpenErr";
}else{
@data = <IN> ;
foreach $file(@data){
print "$file<BR>\n";
}
close(IN) ;
}

--------------------------------------------
353nobodyさん:04/10/27 11:42:36 ID:???
>>351
openで失敗してるんだろ、$!参照(print"OpenErr:$! at ",__LINE__; )
たぶん、権限ナシと予想するが

つーか、別のドメインってリモートじゃないよな
354nobodyさん:04/10/27 12:15:49 ID:???
>353さん
えーと、見当違いなレスだったらすみません。
使用したいドメイン名は書けませんが、要は
○○○.com にあるファイルを ×××.net で読み取る…と言う事をしたいのです。
リモートではないです。

権限の方、確認してみます。
355351:04/10/27 12:32:51 ID:???
連続ですみませんです。

>353さん
もちろんオープンで失敗していますので、エラーのメッセージとなります。
なので、オープン成功するにはどうしたら良いのかなーと。

そもそも無理なのでしたら仕方ないのですが、BLOG等では他の日記データとかを取り込んで
表示する仕組みとか有るみたいなので、どうにか方法はあると思うのですが…

もしPerl側の工夫で出来るなら、どうすればよいかヒントを頂けると助かります。
権限(ファイル置いているサーバ側の設定?)とかの変更が必要でしたら、
管理者に作業してもらおうと思います。
356nobodyさん:04/10/27 13:13:09 ID:???
>>351=354-355
バーチャルホストか?
どうもそうじゃないように見えるんだけどな・・・

VHでやってるなら権限次第だな
そうじゃないなら質問内容をもうちょっと的確に書けるくらい勉強しよう

あと最低限>>1は必ず目を通そうな
357351:04/10/27 13:37:48 ID:???
>>353さん
>>356さん
お手間おかけしましてすみませんでした…
もう少し勉強してきて、それでいて判らなければまたよろしくお願いします。
どうも有難う御座いました。

ちなみにバーチャルホストではなく完全に別ドメインのサーバで、
例えて言うと、”google.co.jp内の特定のファイル”を読むCGIを、
yahoo.co.jp内に設置したいのでした。
(読み込みたいファイルの名称やURLは固定のものです)
358nobodyさん:04/10/27 14:57:41 ID:???
>>357
LWP::Simple(モジュール)とかプロトコルについて勉強すると幸せになれるかも
359nobodyさん:04/10/27 17:10:04 ID:???
>>351
うざい
質問するレベル以前
つーか、open失敗する理由が、$!にセットされるから、先ずそれを表示させてみろ

まさか、open(IN,"http://www.yahoo.com/hoge")とかやってないだろうな?
360nobodyさん:04/10/27 18:11:49 ID:???
質問文をちゃんと読めよ
361nobodyさん:04/10/27 20:31:12 ID:???
(´-`).。oO(LWP を open に override してくれる神の光臨待ち。。。)
362nobodyさん:04/10/27 20:56:50 ID:???
>>361
そういうライブラリはあればあったで便利かもしれんな。
363nobodyさん:04/10/27 21:59:06 ID:???
package LWP::Open;

use base 'EXPORTER';
use LWP::Simple;
our @EXPORT = ('open');

sub open{

}
ここまで書いた後は頼んだ>>364
364 ◆7CWqH7Oesg :04/10/27 22:34:08 ID:???
use LWP::Simple;
use subs qw(open);
*open= sub { get($_[0]); };
$url="http://www.hogehoge/";
$data= open($url);
365nobodyさん:04/10/28 01:47:21 ID:GkfPSbvy
たびたび申し訳ないが、ちょっと教えて下さい

ハッシュのリストを作ってはみたものの
どうやってサブルーチンから出せばいいのかわからなくなりました。

sub XXX{

push @{ HoA{key_name} }, "value1", "value2";

return (??????);
}

このような場合ってどうやってリターンすれば宜しいでしょうか??
366nobodyさん:04/10/28 02:07:20 ID:GkfPSbvy
というか、リストのハッシュと言ったほうがよさそうだ。
367nobodyさん:04/10/28 08:40:21 ID:???
>>365
先にサブルーチンへリファレンスを渡してからゴリゴリするのが常套かと。
368nobodyさん:04/10/28 08:42:07 ID:???
push @{$HoA{key_name} }, "value1", "value2";

こう?

return \%Hoa;

で、

$refHoA->{key_name}->[0]
369nobodyさん:04/10/28 09:10:58 ID:???
別にグローバルならrefをreturnしてもいいけど、こうじゃないの?
my %HoA;
&XXX(\%HoA);
print @{$HoA{'key_name'}};
exit;

sub XXX {
my $refHoA = $_[0];
push @{$$refHoA{'key_name'}}, "value1", "value2";
return(0);
}
370nobodyさん:04/10/28 09:56:08 ID:???
>>369

そんなことしない
サブルーチンで局所化した変数でもリファレンスを返すと、スコープ外でも変数の内容は維持される。
なんか変な気もするが、そういうものらしい
なんでかはしらない(局所化してもスコープ外で実際に破棄されるわけではない?)
つーか、perlモジュールのコンストラクタは普通に局所化したハッシュをblessしてるし
371nobodyさん:04/10/28 09:56:09 ID:???
はじめから無名ハッシュにしとけばいいような。

sub XXX {
my $HoA;

push @{$HoA->{key_name}}, "value1", "value2";

return $HoA;
}
372nobodyさん:04/10/28 14:04:58 ID:???
>>370
my宣言した変数は内部に被参照カウンタを持っていて、
それが0にならない限りデータ領域は解放されないです。
サブからリファを返した場合、そのリファを保持する限り
領域も保持され、破棄すると領域も解放されるです。
373365:04/10/28 14:35:37 ID:???
ありがとうございました。みなさま。
どれも有効でしたが、368氏の方法が一番マッチしました。
ありがとうございました。
374nobodyさん:04/10/29 18:08:56 ID:jolcQ+aO
変数名にハイフンは使っていいですか?
今ローカル環境がないのであまり無茶なテストをサーバでしたくないために質問しました。すみません。

アンダースコアは大丈夫なことは知っています。
ハイフンもハッシュのキーになら使えるということも知っています。(クォート必要ですが)

変数名にも使えるのでしょうか?
例)
$a-a = 1;
$aa- = 1;
$-aa = 1;

確か一番下はダメなはず。
宜しくお願いします。
375nobodyさん:04/10/29 18:14:21 ID:???
ぐぐった
出てきた


>>374は腹を切って死ぬべきである
376374:04/10/29 18:25:42 ID:jolcQ+aO
>>375
>ぐぐった
>出てきた

だから?ぐぐるのもここで質問するのも同じだろ。
まぁ、ぐぐったら出てくるという回答だとしたら・・・

ありがとうございました。ハイフンは使えないようで。それでは失礼します。
377nobodyさん:04/10/29 18:28:19 ID:oV9k/ZOo
>>376
うわすげームカツクこいつ

マジで死ね 首吊って今すぐ死ねや 糞が
378374:04/10/29 18:39:04 ID:jolcQ+aO
>>377
たかが2ちゃんでの出来事にいちいち本気になるなよ
379nobodyさん:04/10/29 18:45:37 ID:???
>>374がむかつくという事実に変わりはない
380nobodyさん:04/10/29 18:46:02 ID:oV9k/ZOo
>>378
ハァ?それが関係あんのか?

更に胸糞悪ぃなてめぇは
381374:04/10/29 18:47:36 ID:jolcQ+aO
>>379-380
そもそも2ちゃんで本気になるお前らがおかしいだろ
ムキになるなよ
382nobodyさん:04/10/29 18:50:58 ID:???
>>381
いいから氏ね
383nobodyさん:04/10/29 18:51:58 ID:???
態度が悪い>>374がムキになって暴れております
384nobodyさん:04/10/29 18:52:42 ID:???
>>375>>377>>382
ttp://perldoc.com/perl5.8.4/pod/perlstyle.html
最後の項目を声に出して読みましょう。

>>376
> ぐぐるのもここで質問するのも同じだろ。
false
385374:04/10/29 18:54:15 ID:jolcQ+aO
>>382
お前が死んだらいいんじゃないか?
自分のために人が何かしてくれるとでも思ってるの?

いい加減自立しろよ、な。
嫌いなやつは「氏ね」なんて理屈は小学生レベルだぞ。
もうすこし大人になったほうがいいんじゃないか、な。
386nobodyさん:04/10/29 18:55:51 ID:???
>>384
英語厨は消えろ
387nobodyさん :04/10/29 18:56:36 ID:???
この程度のもんぐらいならテストで作って動かしゃわかるってこった。
388nobodyさん:04/10/29 19:05:53 ID:???
$abc=1234
の最後の文字列を消すようにはどのようにすればいいでしょうか?
この場合は、$abc=123にしたいです。
389nobodyさん:04/10/29 19:37:50 ID:???
chop
390nobodyさん:04/10/29 20:26:27 ID:???
$abc = int($abc/10);
391nobodyさん:04/10/29 20:45:30 ID:???
すいません、初心者なんですが教えてください。
登録や削除のできるCGIを作っています。
一つのフォームから、いくつかのsubmitを使って、それぞれ処理を変えたいのですが、
どのようにすればよいでしょうか?
なんとなく、nameを使ったり、受ける側でif文を書けばいいのかな?という感じなのですが、
どうやって、if文でsubmitのnameを受けたり、分岐したりすれば良いのか分からない状態
です。
どうぞ、よろしくお願いします。
392nobodyさん:04/10/29 20:52:34 ID:???
>>391
同じ name にして value を見る
393nobodyさん:04/10/29 20:57:57 ID:???
394nobodyさん:04/10/29 20:59:11 ID:???
>>392
すいません、その書き方が分からないので・・・
if文になるんでしょうか?
突然言い渡された仕事で、何が何だかさっぱりな状況なのでお願いします・・・。

連投になってしまい、すいません
395nobodyさん:04/10/29 21:25:48 ID:???
------html-------
<INPUT name=text1>
<INPUT name=text2>
<INPUT name=text3>
<INPUT name=text4>
<INPUT type=submit value="ここ押せ" name=hoge>
-----------------

-------cgi--------
#!/usr/bin/perl
require 'cgi-lib.pl';
require 'jcode.pl';

&ReadParse(*in);
$txt1 = "$in{'text1'}";
$txt2 = "$in{'text2'}";
$txt3 = "$in{'text3'}";
$txt4 = "$in{'text4'}";
&jcode'convert(*txt1,'sjis');
&jcode'convert(*txt2,'sjis');
&jcode'convert(*txt4,'sjis');

処理
---------
こんなもんだろ。
396nobodyさん:04/10/29 21:52:26 ID:???
>>394
まずはHTMLから勉強して濃いよアフォ
>>395
アフォに何を言っても無駄だからやめとけ
397nobodyさん:04/10/29 22:00:17 ID:???
すいません、perlでテキストファイルを白紙に戻す方法ってあるんでしょうか?
なんかどこをみても載ってない気がする。
398 ◆7CWqH7Oesg :04/10/29 22:11:15 ID:???
truncate
399nobodyさん:04/10/29 22:58:21 ID:buGH5/R1
perlからhtmlファイルを「open」で呼び出した場合、呼び出し元はwebサーバですか?それともクライアント側ですか?
400nobodyさん:04/10/29 23:26:28 ID:???
>>374
まあ裸では使えないが${'...'}のかたちにすりゃほとんど
なんでもアリ。

そうまでして使いたいものかどうかはギモンだがな。

${'a-a'} = 1;
${'aa-'} = 1;
${'-aa'} = 1;
401nobodyさん:04/10/30 00:29:39 ID:???
>>397
print OUT '白紙';
402nobodyさん:04/10/30 00:47:08 ID:???
print if(m/test/) while(<DATA>);

こんなことはできますか?
403nobodyさん:04/10/30 00:48:20 ID:???
やってみれば?
404nobodyさん:04/10/30 01:10:10 ID:???
403さんの言われた通りにやってみましたができませんでした。
どこがいけないのでしょうか。
405nobodyさん:04/10/30 01:17:43 ID:???
406nobodyさん:04/10/30 01:44:29 ID:???
>>405
ありがとうございます。
読んだ上で色々やってみましたが、このような書き方は仕様上不可能のようですね。
お手数おかけしました。
407nobodyさん:04/10/30 03:37:08 ID:???
push(array, value) って value 省略したときに $_ 使ってくれないみたいなんですけど、
これって常識ですか?

省略したときに $_ を使うようになる条件て何かあるんですか?
408nobodyさん:04/10/30 04:46:55 ID:???
>>407 常識、ない
409407:04/10/30 05:22:56 ID:???
>>408
がびーん!

ありがとうございます
410nobodyさん:04/10/30 10:23:50 ID:???
短いスクリプトではない場合あんまり暗黙の$_を使わない方がいいと思うよ
411nobodyさん:04/10/30 10:59:58 ID:eCRfKScU
教えてください。

文字列ソートを
@data = sort{(split(/\,/,$b))[2] cmp (split(/\,/,$a))[2]} @data;

としてたものを、文字の数でソートしたいと思い、
@data = sort{(split(/\,/,length$b))[2] <=> (split(/\,/,length$a))[2]} @data;

とやってみましたが、ソートしてくれません。
lengthの位置を色々変えてみましたが、ソートしないかエラーかでした。
どうすれば(この場合)[2]番目の文字数でソートできるのでしょうか。
412nobodyさん:04/10/30 11:13:52 ID:zVFP7DHQ
ファイルアップロードについて教えてください。
環境 -> Linux + Perl5 + cgi-lib.pl

kentさんのjoyfulとか、ほかモジュールを使わないでアップロード機能を
装備しているスクリプトを参考に下記のようにやってみたのですが、
まったくダメダメクンのようです。

ユーザーのファイルを受け取るには、これ以外何をやればよいでしょうか?
どうか教えてください。

$upfile = $in{'img'};
if ($upfile) {
$upfile =~ s/\\/\//g;
$img_file = basename $upfile;
open OUT,">$img_file";
binmode OUT;
binmode STDOUT;
print OUT $in{'img'};
close OUT;
chmod (0666,$img_file);
413nobodyさん:04/10/30 11:25:33 ID:???
414nobodyさん:04/10/30 11:27:57 ID:???
>>411
@data = sort{length((split(/\,/,$b))[2]) <=> length((split(/\,/,$a))[2])} @data;

>>412
デリミタの処理が一切見当たらない。
enctype="multipart/form-data"でPOSTしたらどんなデータが送られてくるのか?を確認するよろし。
415412:04/10/30 11:39:40 ID:zVFP7DHQ
>>413
参考にしてみます。

>>414
>enctype="multipart/form-data"でPOSTしたらどんなデータが送られてくるのか
File::Basenameで取得したファイル名の中に、ローカルパスが格納されています。
001.jpg -------------------------------------------------------------
C:\Documents and Settings\admin\My Documents\My Pictures\任天堂\001.jpg
---------------------------------------------------------------------
てことは、$in{'img'}をopen DATA,"$in{'img'}";する必要があるってことです?
416411:04/10/30 12:03:05 ID:???
>>413>>414
おぉ、できました。
ありがとうございます!
417412:04/10/30 14:08:03 ID:zVFP7DHQ
やはり、よくわからなかったので、おとなしくCGI.pmを使用することにしました。
みなさまありがとうございました。
418nobodyさん:04/10/30 14:28:37 ID:???
ここにはファイルのアップを1から書ける人はいないから、
諦めた方がいいね
419nobodyさん:04/10/30 15:15:30 ID:???
10文字以上20文字以内で、
英数字が使えて、最初の文字列にのみ数字を禁止するような
正規表現はどのようにすればいいでしょうか?

正規表現難しすぎる・・・。本読んでも頭がこんがら・・・
分かりやすいサイトあったら教えてください
420nobodyさん:04/10/30 15:27:19 ID:???
421nobodyさん:04/10/30 17:16:32 ID:???
>>412
車輪の再発明ではなく勉強のためなら↓を見るよろし。シンプルだ。
ttp://tohoho.wakusei.ne.jp/cgi/wwwupl2.txt

実用化するにはもう少し手を加えたほうがよいが。
422nobodyさん:04/10/30 20:00:53 ID:M6l56cQx
WinXP + Apache + Perl5 cgiです。
cgiの再起呼び出しは可能なのでしょうか。
cgi上のフォーム で、cgiの一部を書き変えたいのですが。
423nobodyさん:04/10/30 20:14:58 ID:???
>>422
そういうのは再帰呼び出しとは言わないような。。。
できるからやってみ。つーかやってみてから書きなはれ。
424nobodyさん:04/10/30 22:11:53 ID:???
>>422
そのレベルで自己改変コードは危険すぎる。
つーか、99.999%書換え不要。
425nobodyさん:04/10/30 23:39:13 ID:???
フォームからsubmitボタンが1回クリックされるごとに
1 -> 2 -> 3
と変更していく変数$aを作りたいのですが、
どうすればいいでしょうか?
大まかな方法は何となく分かるんですが、
ロック制御などについてよく分かりません。
426nobodyさん:04/10/30 23:39:44 ID:JL00AQ8N
あg
427nobodyさん:04/10/30 23:58:31 ID:???
カウンタじゃいけないのか?
428nobodyさん:04/10/31 06:04:57 ID:PbybcUUP
s/(?:abc|bbc)/c/;

s/abc/c/;
s/bbc/c/;
とではどっちが速いですか?
429nobodyさん:04/10/31 06:43:53 ID:/9xW7Y/D
<input type="file" name="file">
として、
$query->param('File')
で受け取った値を、同じ(type="file")として別のCGIなどに
渡す事はできないのでしょうか?

調べてみたところ、(type="file")はセキュリティのため、
初期値を設定したりスクリプトで値を操作することが出来ないとされており、
同じ内容を受け渡す事ができず、困っております。

よろしければ、おしえてください。
430nobodyさん:04/10/31 07:29:15 ID:???
>>428
自分で試してみようとは思わないのですか?
431nobodyさん:04/10/31 07:46:09 ID:???
動作が異なるものを比べても意味無いじゃん。
432nobodyさん:04/10/31 08:21:16 ID:???
処理A,B,C,Dがあって、それぞれに対応する変数$a,$b,$c,$d(動作そのものではなく)があります。
これらの対応する変数の大きい順番に処理A,B,C,Dを行いたいのですがどうすれば良いでしょうか?
433nobodyさん:04/10/31 08:23:04 ID:???
>>429
出来ないように作られているので出来ない。
出来るようにすると、お前以外の世界中の人が困るようになるので、出来るようには出来ない。
434nobodyさん:04/10/31 08:34:02 ID:???
>>429
さんざんガイシュツだがLWP。HTTP::Request::Commonのマニュアルに
例つきで説明されてるのでよく読め。
435nobodyさん:04/10/31 12:18:51 ID:???
KENT-WEBにあるWeb ProtectというCGIを設置したんですが、
パスワード認証画面が携帯電話(au W11H)で表示することができないです

<tr>
<td class="ent2">
<table border=0 cellpadding=0 cellspacing=5 width="100%">
<tr>
<td colspan=2>$title</td>
</tr>
<tr>
<td>ユーザー名 :</td>
<td><input type=text name=id size=15 value="$cid"></td>
</tr>
<tr>
<td>パスワード :</td>
<td><input type=password name=pw size=15 value="$cpw"></td>
</tr>
<tr>
<td></td>
<td><input type=checkbox name=cook value="1" $checked>
パスワードを記憶する</td>
</tr>
<tr>
<td colspan=2 align=right height=50 valign=bottom>
<input type=submit value="    OK    ">
<input type=reset value="キャンセル"></td>
</tr>
</table>


行数足りなくて最後の方ちょっと省略しましたが
これを携帯で表示させるにはどうすればいいのでしょうか?
436nobodyさん:04/10/31 14:15:22 ID:???
>436
丸投げ改造スレへドゾー。
437nobodyさん:04/10/31 14:18:58 ID:???
Aサーバに設置したスクリプトから、
lsコマンド使って、Bサーバのあるディレクトリの一覧を取得するようなことは
可能でしょうか?
438nobodyさん:04/10/31 14:32:57 ID:???
>>437
いくつかのやり方に応じて適切な条件が揃わないとできんよ。
つーか、逆に言うとそれをやられないように作られてるんだから。
439nobodyさん:04/10/31 16:29:29 ID:???
試行錯誤してやっと完成したスクリプト。
しかし初心者だけにセキュリティ的な部分が非常に気になります・・・。
何かセキュリティ的に大丈夫かどうかチェックする方法ないですかね?
2chでさらす以外で。
他の初心者さんたちはどうしてるんだろ?
440nobodyさん:04/10/31 16:37:53 ID:???
上級者に聞くしかないでしょう。
じゃなきゃ自分が上級者になる。
441nobodyさん:04/10/31 22:09:05 ID:???
>>439
只でやりたかったら、どっかで晒すか知り合いに頼むしかないだろ。
金かける気があるならhttp://www.softek.co.jp/Sec/WebProbe/のようなツール使う
442nobodyさん:04/10/31 22:24:06 ID:???
>>439
どういうセキュリティを懸念してるんだ。
とりあえずはクロスサイトスクリプティングあたりか?
443nobodyさん:04/10/31 23:47:52 ID:???
作ったものによるだろ。
XSSは当然として、セッションハイジャックやSQLインジェクションなど
その他色々。
444 ◆7CWqH7Oesg :04/11/01 00:59:27 ID:???
4様が微笑みながら444ゲット ズサーーーー!!
445nobodyさん:04/11/01 01:09:12 ID:CTnWn+hA
>>444
うるせーー!!!!!
446nobodyさん:04/11/01 04:25:18 ID:rUgrlUVh
net::ftpのdirをつかって、ファイルの更新日時を取得したのですが、
月がOctのように英語表記になってしまいます。
これはどのように数字に変更すればいいのでしょうか?
447nobodyさん:04/11/01 10:51:27 ID:???
>>446
%Month = (Jan=>1, Feb=>2...)みたいなハッシュを用意しといてひけば
とりあえず数字にはなる。
448nobodyさん:04/11/01 13:02:20 ID:???
s/Oct \d{2} \d{2}:\d{2}/10月$1日$2時$3分/g;
みたいに12行書く。
449nobodyさん:04/11/01 13:03:07 ID:???
カッコ付け忘れ。適当に補ふ。
450nobodyさん:04/11/01 19:42:22 ID:IPrYAMkf
キリ番を調べたいのですが、
100単位でのキリ番は、
$a = substr("カウント値",-2,2);
if($a eq '00'){ print "キリ番"; }
で処理しています。
連番に関してはなかなかいいアイディアが思い浮かびません。
参考となるカウンターやアイディアをご教授ください。
451nobodyさん:04/11/01 19:52:51 ID:???
キリ番とかダサイからやめたほうがいいよ
452nobodyさん:04/11/01 20:25:55 ID:???
>>451
禿同
453nobodyさん:04/11/01 20:55:08 ID:???
>>451-452
アイディアのカケラも思い浮かばないような発想力不足のクズはこのスレにいないでいいよ
454nobodyさん:04/11/01 21:05:16 ID:IPrYAMkf
>>450です。
確かにダサイのですが要望があったので色々と試してました。
0の連続するきっちりのキリ番やゾロ目なら数十桁くらいを配列にいれて
比較してたのですが、連番となると数が多すぎて…
455nobodyさん:04/11/01 21:17:07 ID:???
漏れもダサイとは思うが、どうしてもやらにゃならんと言うなら
キリ番やゾロ目なら正規表現使う方が賢明だろう

連番はアイデアがないが
「自分が数字を見たとき連番かどうかをどうやって判断しているのだろう?」と
自分の頭の中の認知回路を自己分析してみると
実装可能なアルゴリズムを思いつけるかもしれん
456nobodyさん:04/11/01 21:18:46 ID:???
ゾロ目:
sub zorome { my($x)=@_; $x % ('1' x length($x)) == 0; }

連番:
sub renban { my($x)=@_; zorome($x - substr('123456789', 0, length($x)-1));}

あたりでどう?
457nobodyさん:04/11/01 21:25:11 ID:hZSImnu8
連番は、何個同じ数字がどこに並んでりゃいいの?3個どこでもよければ
while(($var =~ /(\d)/) and ($var =~ s/$1{3}//)){print "連番やん\n";}

458450:04/11/01 21:49:58 ID:IPrYAMkf
>>450です。
>>456>>457様、ありがとうございます。
教えて頂いたものは負荷も少なく凄いです。

正規表現に疎いためまだ理解できていないのですが…
連番は何個からとかは特に決めていません。
12でも連番のキリ番として扱う予定です。

>>457
$varに数値をいれるとして、$1の部分が理解できません。
これだと例えば1114も連番となってしまいますか?
459nobodyさん:04/11/01 22:11:56 ID:???
$1を知りたければ、多少でもいいから正規表現を学ぶんだ
460nobodyさん:04/11/01 22:35:50 ID:???
正規表現だとゾロ目は

$x =~ /^(\d)\1*$/

なのでこっちの方がシンプルかも? (最初が数字でその後0個以上の
同じ数字が文字列の最後まで続く)

最低n桁にしたければ*のところを{n-1,}にすればいい。たとえば
最低4桁なら

$x =~ /^(\d)\1{3,}$/

461nobodyさん:04/11/01 22:38:27 ID:???
連番は

index("123456789", $x) >= 0

という手もある
462nobodyさん:04/11/01 23:26:45 ID:???
セッションハイジャックやSQLインジェクションってどうやって防ぐの?
入力チェックが効果的ってどっかで見た気がするが。
463450:04/11/01 23:27:32 ID:IPrYAMkf
>>450です。

>>460>>461様ありがとうございます。
正規表現でのゾロ目チェックは参考になりました。
連番でindexを使うのは気付きませんでした。
464nobodyさん:04/11/01 23:32:03 ID:???
>>462

Perlコーディング初心者質問スレ Part 38
465 ◆7CWqH7Oesg :04/11/01 23:32:49 ID:???
>>462
マルチだし、ハイジャックて・・・
466nobodyさん:04/11/02 00:52:58 ID:???
>>462
セッション管理を必要としない仕様にする。
SQLを必要としない仕様にする。

そもそもセッション管理やSQLを使用しているのか疑問なのだが。
使用しているのならどこが穴になるのか想像できるはず。

ttp://www.atmarkit.co.jp/fsecurity/special/30xss/xss01.html
ttp://www.atmarkit.co.jp/fsecurity/rensai/webhole01/webhole01.html
467nobodyさん:04/11/02 08:25:16 ID:s3D5jAc8
Image::Magickで1M以上のJPG画像を縮小しようとしたら
サイズはあっているのですが画像の上の10%くらいで変換がおわってあとは真っ黒になります
なにが原因なのでしょうか

use Image::Magick;
$i = Image::Magick->new;
$i->Read('test.jpg');
$i->[x]->Scale("200");
$i->Write("temp.jpg");
468nobodyさん:04/11/02 09:46:11 ID:???
途中で殺されたんじゃねーの
469462:04/11/02 10:19:20 ID:???
あれ、俺マルチなんかしてねーぞ?
470nobodyさん:04/11/02 10:35:00 ID:???
>>467
よくわからんが、Scale メソッドってそういう呼び出し方するんだったっけ
471467:04/11/02 10:55:21 ID:MX3i4yL1
use Image::Magick;
$i = Image::Magick->new;
$i->Read('test.jpg');
$i->Resize(width=>200, height=>150, blur=>0.7);
$i->Write("temp.jpg");
これも駄目でした
472nobodyさん:04/11/02 11:55:28 ID:???
まじめにエラーハンドリングしてみたら?
なんか出てるかもよ。

ttp://www.imagemagick.org/www/perl.html#erro
473nobodyさん:04/11/02 14:27:15 ID:???
正規表現の修飾子を変数に入れたまま
使う事は出来ないんでしょうか?

foreach(@list){
 if(/$pattern/$a){
  print "true";
 }else{
  print "false";
 }
}

正規表現を勉強しようと、
CGIで正規表現と複数の文字列をPOSTし、
文字列がマッチするか検証するスクリプトを書いています。
474nobodyさん:04/11/02 14:46:21 ID:???
>>473
eval使え

475nobodyさん:04/11/02 15:02:49 ID:???
>>474
出来ました。ありがとうございます。

if(eval "/$pattern/$a"){}
476nobodyさん:04/11/02 18:01:53 ID:???
みんなならどっちにする?

$a=4 if $b;
$b=5 if $b;



if($b){
$a=4;
$b=5;
}

なんか{}(ブロック)をなくす方が処理が早いみたいなこと聞いて
こんなつまらないことで悩んでる状況。
477nobodyさん:04/11/02 18:19:17 ID:???
ご教授ください。

その月が何日が最終日なのかを調べるほうほうは
どのようにつくればいいのでしょうか?
478nobodyさん:04/11/02 18:22:06 ID:???
ツェラーの公式で検索してみ
479nobodyさん:04/11/02 18:41:26 ID:???
>>476
それがものすごい回数繰り返されるループの中とかなら、
ベンチとって選べ。

そうでなければどうせ誤差ぐらいしか違わないから自分が
見やすいと思うほうにしとけ。

一般論としては、動くの作って動作速度に不満が出てから
プロファイラでどこが時間食ってるか調べて集中的に直せ、
と言われているようだ。

軽くベンチした感じでは、$bがfalseならif(){}の方が
3倍ぐらい早いが、$bがtrueなら25%ぐらい遅い。
480nobodyさん:04/11/02 18:52:04 ID:???
sub last_day {

my($y,$m) = (shift,shift);
my @days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

return 0 unless (1 <= $m and $m <= 12 );

$m-- == 2
? $days[$m] + ($y % 4 == 0) - ($y % 100 == 0) + ($y % 400 == 0)
: $days[$m];
}
481476:04/11/02 19:28:42 ID:???
>>479さん
神様のような方ですね。
ありがとうございました。
10回程度なので見やすいほうにさせていただきます。
482nobodyさん:04/11/02 21:02:59 ID:???
($a,$b)=(4,5) if $b;
も、べんちまぁくしてねぇ(はぁと)
483nobodyさん:04/11/02 21:03:44 ID:???
>>476
それだと条件分岐の評価が2回行なわれるので、
条件式次第では遅くなる可能性があるよ。

$a=4, $b=5 if $b;
$b and $a=4, $b=5;
($a,$b)=(4,5) if $b;
$b &&= 5 and $a = 4;

労力の割にはたいした効果が期待できないので、
最適化のためにblockを消したりとかは、した事ないけど。
484nobodyさん:04/11/02 22:26:47 ID:???
日本時間、2004年11月2日午後10時を示す数字
04110222

をGMTで同じように8桁で表したいのですが、どの様にするのが
よいのでしょうか?

一旦、unix timeにして、-9時間して、戻すのが順当でしょうか?
できれば、use Time::Localはしたくありません。
(それが使えない環境などがありそうなため)

perl JST GMT でググってもTZとかしかでてきませんでした。
よろしくお願いします。


485nobodyさん:04/11/02 22:27:49 ID:???
2chの各スレッドのURLってどういう計算式なんですか?日付が絡んでそうなのはわかるのですが
だれかおしえてくらさい
                       ↓ここの部分
http://pc5.2ch.net/test/read.cgi/php/1097158988/l100
486nobodyさん:04/11/02 22:31:43 ID:???
unixtime
487nobodyさん:04/11/02 22:49:38 ID:???
ありがとうございました。
488nobodyさん:04/11/03 00:48:07 ID:???
変数から特定の文字列がある場合、それを抜き取るという
動作をしたいんですが、これはどうすればいいでしょうか?
index と substr を使う方法を思いついたのですが、
もっとスマートな関数とかありますでしょうか?
489nobodyさん:04/11/03 00:52:38 ID:???
age
490nobodyさん:04/11/03 01:26:52 ID:???
>>488
if(/特定の文字列/){
  $unko = $1;
}
491nobodyさん:04/11/03 06:51:50 ID:???
>>490
抜き取られていない。

push @result,$1 while s/(特定の文字列)//;
とかいろいろ。
492nobodyさん:04/11/03 07:37:05 ID:???
PerlでPHPのgetImageSizeみたいなのないですか?
特にSWFのサイズ取得とかあるサブルーチンあったら教えてくださいませ
493nobodyさん:04/11/03 07:42:15 ID:???
>>484
あとは自分で何とかしる。

$_ = '04110222';
my @a = /(..)/g;
my @m = qw/31 28 31 30 31 30 31 31 30 31 30/;
$m[1]++ unless $a[0] % 4;
my $t = 946652400 + 3600 * ($a[3] + 24 * int $a[2] - 1 + 365 * $a[0] + (3 + $a[0]) / 4);
$t += 86400 * $m[$_] for 0..$a[1] - 2;
print scalar localtime $t;
494nobodyさん:04/11/03 12:14:21 ID:???
495nobodyさん:04/11/03 13:27:44 ID:???
>>484
Time::Localってperl本体に付属してたと思ってたんだけど、
分離されたんだっけ?

あとGMTにするのはgmtime使うかtimezoneいじるべきで
unix timeを9時間戻すのはよろしくないと思うよ。
496nobodyさん :04/11/03 15:09:23 ID:???
ユリウス時間でも出してきたらどない?
497nobodyさん:04/11/03 15:24:21 ID:???
>>495
> GMTにするのはgmtime使うかtimezoneいじるべきで
漏れもそう思うが、

> unix timeを9時間戻すのはよろしくないと思うよ。
これには何か理由があるのか?
498484:04/11/03 15:46:43 ID:???
色々返答ありがとうございました。
質問の仕方が悪かったかもです。

どうやらgoogle君に聞いてみると、Time::Localは標準ライブラリらしいです。
なのでどの環境いっても使えそうです。
重くなりそうという根拠のない理由から、できれば避けたいと書きました。
#標準ライブラリということを確定的できる情報元ってないんでしょうか…

何をしたいかというと、
0411031500という時間をcookieのexpire時間にしたいのですが、cookieではGMT
でJSTを指定できないらしいので変換をしなくてはならないのです。

>>493さんのコードちょっとむずかしすぎてまだ理解できてないです…
以下のURLのサブルーチンでunix timeにはできそうです。
http://www.ybi.co.jp/koike/qa3000/qa3165.htm
499nobodyさん:04/11/03 15:56:35 ID:???
use Object; $obj->document();
http://perl.infoware.ne.jp/documents.html
500nobodyさん:04/11/03 16:07:16 ID:???
>>497
うるう秒が間に入るとずれるから。ちゃんとサポートされたシステム
での話しだけど。

クッキーのexpire時間ぐらいならそう厳密じゃなくていいから
構わんと思うけどね。
501nobodyさん:04/11/03 16:41:00 ID:???
>>498
5.8.4の標準ライブラリなら
http://www.perldoc.com/perl5.8.4/lib.html

確実に知りたいのなら
perldoc perlmodlib
502497:04/11/03 16:41:31 ID:???
>>500
d
503nobodyさん:04/11/03 16:55:54 ID:???
標準ライブラリだからといって必ず使えるという保障はないわけで。
あんまりこだわる必要はないと思うけど?

それよりも、なぜにcookieのexpireで人間的日付を元にするのかが気になる。
単純に timeから30日間有効 とかにしてしまえば楽なのに。
504nobodyさん:04/11/03 17:10:11 ID:???
>>494
情報ありがとう!
やはり1つの関数で勝手にファイル判別してくれるとかはないんですかね?
まぁ手動で見分けて条件分岐すればいいんでしょうけども・・・。
505nobodyさん:04/11/03 17:12:48 ID:???
2chで出てるようなIDを生成したいんですが、2chがどうやって生成してるのか教えて頂けないでしょうか?
前に、そういうサブルーチンを見かけた気がするんですが検索しても見つかりませんでした。
よろしくお願いします。
506nobodyさん:04/11/03 17:13:59 ID:???
>>505
crypt
507nobodyさん:04/11/03 17:17:55 ID:???
>>506
いやそれは分かるんですがcryptの元の文字列をどうしてるのか知りたいのです。
508nobodyさん:04/11/03 17:24:01 ID:???
>>507
確かホスト名と日付だったとおもう
509nobodyさん:04/11/03 18:31:44 ID:???
>>500
なるほど、4年に一度狂う位なら問題なさそうなので、unix timeにして-9時間に
しようかと思います。

標準ライブラリは、導入されていなかったり、過去のバージョンであるかわからない
とのことなのでやっぱり使わないほうが無難な気がするので使わない方向でいきます。

>>503
なぜ、人間的日付かというと、その時間になったら掲示板に投稿できなくなるという
改造を自分でして、読みやすいから0411031700みたいな形で設定ファイルに保存
するという形をとったからです。
ここから間違いかもしれませんが…unix timeで保存した方が良かったのかもしれませんね。
#やっぱり見やすいからそうしました。
510nobodyさん:04/11/03 19:20:15 ID:???
>>508
それだけだと、総当りでIPアドレス算出できるから、日ごとに更新される乱数が使われてる。
511nobodyさん:04/11/03 19:27:43 ID:???
>>505
ここを探してみそ。
http://age.s22.xrea.com/talk2ch/

# 正しいID算出方法かどうかの保障はないけど。

>>504
見つけたら是非とも報告よろしくー。
512505:04/11/03 21:07:28 ID:???
>>511
やりたいことができました。
本当にありがとうございました。
513nobodyさん:04/11/03 22:16:22 ID:???

トリップの作り方はわかったのですが、
                              ↓ここのIDはどうやって作るんでしょうか?
356 :Now_loading...774KB :04/11/03 21:01:50 ID:j7+5/dK/
誰かよろしくお願いします。
514nobodyさん:04/11/03 22:19:10 ID:???
>>513
>>511のリンク先読めねーの?
515nobodyさん:04/11/04 00:33:21 ID:???
配列の数を吐き出す奴ない?length(@xx)とかやってもだめだった。
516nobodyさん:04/11/04 00:43:00 ID:???
>>515
スカラーコンテクストなら@xxは配列の要素数になる。
わからなければscalar(@xx)としとけば確実。
517nobodyさん:04/11/04 00:44:14 ID:???
>>515
$#xx+1
またはscalar
518nobodyさん:04/11/04 00:56:38 ID:???
>>517
$#xxは$[変えるとそれにつれて変わるので(要素数-1)として
使うのは危険だと習った。

$[ = 1;
@xx = (1,2);
print $#xx+1;

$[をいじったスクリプトなんて書いたことないけどね。
519nobodyさん:04/11/04 01:03:20 ID:???
scalarでいいじゃん
520515:04/11/04 01:27:14 ID:???
みんなありがd
521515:04/11/04 03:06:36 ID:???
sub内だけで使用する変数ってlocal($hensuu)って宣言するんだっけ?
522nobodyさん:04/11/04 03:30:18 ID:???
my
523nobodyさん:04/11/04 03:51:59 ID:???
>>521
調べる気ないな・・・
524nobodyさん:04/11/04 11:55:35 ID:3xCNLIZD
特定のページからの来訪の場合のみ、
処理させたいんですが、この場合環境変数とif文使えばいいんでしょうか?
525524:04/11/04 11:56:51 ID:???
あ、これだとノートンとか入れてる人には無効になってしまいますね。
526nobodyさん:04/11/04 12:48:50 ID:???
あるプログラムからpostでID/PASSを送るプログラム作ってるんだけど、
ブラウザに丸見えになりますよね?
で、一応暗号化はしたんですけど、例えばネットカフェに
データが残ってて、解析されたら終わりってことですよね・・・
う〜んどうすればいいものか。
他のスクリプトはどうやっているんでしょ?
527nobodyさん:04/11/04 12:54:01 ID:???
<form action="$url">
<input type="text" name="url" value="">
</form>
上記のようにアクション先にその場で入力された
URLを指定することってできるでしょうか?
528nobodyさん:04/11/04 13:30:32 ID:???
>>527
Javascript使ってしか無理だと思うけど。
529nobodyさん:04/11/04 13:31:47 ID:???
>>527
じゃばすく
530527:04/11/04 13:40:32 ID:???
javascriptを使用しない場合は不可能でしょうか?
531527:04/11/04 13:41:16 ID:???
perlを使った方法はないでしょうか?
532526:04/11/04 13:52:12 ID:???
POSTとGET以外に変数を別のスクリプトに渡す方法ってあるでしょうか?
533nobodyさん:04/11/04 13:53:10 ID:???
>>531
もう少しWebの仕組みを(略
534nobodyさん:04/11/04 14:45:41 ID:???
できないこともないけど、スマートじゃないな
535nobodyさん:04/11/04 15:18:06 ID:???
>>534
教えてくださいませ
536nobodyさん:04/11/04 15:34:22 ID:???
>>532
「変数を」別のスクリプトに渡す
ということは、foo.cgi->Browser->bar.cgiの過程で
foo.cgiが出力した値をbar.cgiに渡したいということか?
537526:04/11/04 15:46:07 ID:???
>>536
はい、そのとおりです。
538nobodyさん:04/11/04 15:51:48 ID:???
ちょと似た質問なんだけれど、
海外で手に入れた会員管理の有料perlプログラムを使ってるんですが、
http://****.com/****.cgi?password=***** みたいな感じで
ログが残って、ログアウトしたあとも、ブラウザの戻るとかで
会員画面に入れるんだが、
詐欺プログラムですか、これは?
perlのことあまり詳しくありませんが、これなんとかする方法ありますか?
539nobodyさん:04/11/04 15:57:04 ID:???
>>538
作成者に聞くのがスジってものでしょう
540nobodyさん:04/11/04 16:03:30 ID:???
>>537
そういうセッション管理で一般的に使われるのはCookieだな。
Passは最初の認証だけ使って、後はセッションIDをCookieへ入れといて、
ワンタイムパスワードをPOSTさせて認証処理・・・って感じになるのかな。
本なんかをちょっと見ただけで実際に作ったこと無いから、落とし穴があるかも。
Cookieは気をつけないとPOST以上に危険だから注意

あと、
>ブラウザに丸見えになりますよね?
の一言が気になるんですが、まさかtype="hidden"を知らないなんてことは・・・
541nobodyさん:04/11/04 22:34:38 ID:???
unko
542nobodyさん:04/11/05 00:12:53 ID:???
>>537
ActivePerl入れて、インターネットゾーンでも使えるようにレジストリ緩めれば、language=perlで好きなことできるよ。

そんな糞ページ誰も見ないがな。
543nobodyさん:04/11/05 01:23:41 ID:???
>>542
あなたもクソページですね
544nobodyさん:04/11/05 04:30:09 ID:127p6d3j
スクリプトに引数を付けることで処理を色々に分岐させようとしています。

例:-a、-l、-h、-v、-r、<引数なし>を引数とする。
現在、引数を見て処理させる場合、
if ($#ARGV == "0") {
if ($ARGV[0] eq "-a") { 処理1; }
elsif ($ARGV[0] eq "-l") { 処理2; }
elsif ($ARGV[0] eq "-h") { 処理3; }
elsif ($ARGV[0] eq "-v") { 処理4; }
elsif ($ARGV[0] eq "-r") { 処理5; }
else { &error; }
}
elsif ($#ARGV == "1") {
if ($ARGV[0] eq "-a" && $ARGV eq "-l") { 処理5; }
elsif ($ARGV[0] eq "-l" && $ARGV eq "-h") { 処理6; }
elsif ($ARGV[0] eq "-h" && $ARGV eq "-v") { 処理7; }
elsif ($ARGV[0] eq "-v" && $ARGV eq "-r") { 処理8; }
elsif ($ARGV[0] eq "-r" && $ARGV eq "-a") { 処理9; }
else { &error; }
}
などとしていますが、引数が増えるとそれだけ組み合わせも増えるわけで
現在引数による分岐だけで混乱しています。しかもこのスクリプトを実際に
使用する場合、引数の順序も固定されてしまうので、表現力が乏しくなります。

それぞれの引数に数字を割り当てて、それをfor (@ARGV)で見ていって
それらを加算した結果で処理させる方法などを考えましたが、
数字を割り振るコツも分かりません。

引数や、それらの組み合わせが増えたとき、どういう風に対処すれば
分かりやすく、作りやすいスクリプトが書けるのでしょうか。

よろしくお願いします。
545544:04/11/05 04:39:45 ID:127p6d3j
上の例文は間違いです。

正しくは以下の通り。

if ($#ARGV == "0") {
if ($ARGV[0] eq "-a") { 処理1; }
elsif ($ARGV[0] eq "-l") { 処理2; }
elsif ($ARGV[0] eq "-h") { 処理3; }
elsif ($ARGV[0] eq "-v") { 処理4; }
elsif ($ARGV[0] eq "-r") { 処理5; }
else { &error; }
}

elsif ($#ARGV == "1") {
if ($ARGV[0] eq "-a" && $ARGV[1] eq "-l") { 処理5; }
elsif ($ARGV[0] eq "-l" && $ARGV[1] eq "-h") { 処理6; }
elsif ($ARGV[0] eq "-h" && $ARGV[1] eq "-v") { 処理7; }
elsif ($ARGV[0] eq "-v" && $ARGV[1] eq "-r") { 処理8; }
elsif ($ARGV[0] eq "-r" && $ARGV[1] eq "-a") { 処理9; }
else { &error; }
}
546nobodyさん :04/11/05 04:46:45 ID:???
>>544
引数をハッシュに代入してexistsで条件分離したら?

for(@ARGV){
  $param{$_} = '1'; #値自体はなんでもいい。
}
分岐は
if(exists $param{'-a'}){ 処理1;}
とか
if($param{'-a'} == 1){ 処理1;}

みたいの。
547nobodyさん:04/11/05 06:55:34 ID:???
>>544
my %table = (
'a' => sub{ print "処理1" },
'l' => sub{ print "処理2" },
...
'r' => \&r_part,
'al' => \&r_part,
'hl' => sub{ print "処理6" },
...
);

sub r_part{ print "処理5" }

my $key = join('', sort @ARGV);
if (exists $table{$key}){
$table{$key}->();
} else {
print "ERROR";
}
548547:04/11/05 07:02:16 ID:???
おっと、ハイフン取り除く処理を忘れてたーよ。
549nobodyさん:04/11/05 07:51:54 ID:???
>544
getoptとか、そんなのはダメ?
http://www.aplawrence.com/Unix/perlgetopts.html
550544:04/11/05 10:39:14 ID:T3r+ugEG
ああ、寝てしまった間にこんなにレスが付いてる!
ありがとう御座います!

ぱっと見た感じでは
>>546さんと>>547さんは同じ処理ですか?
連想配列にこういう使い方があったと知って、眼から鱗の初心者です>私
両方を試してみます。ありがとうございます。

>>549
煩雑な徒手作業のところをできる限り自動化/半自動化していく積もりで
ゆくゆくはこうしたモジュールを有り難く使った方が効率が良いとは考え
ているのでこういう助言は本当に助かります。
ありがとうございます。

早速実験してみます。

ありがとう御座いました。
551nobodyさん:04/11/05 11:05:29 ID:vXdBVIeu
スクリプトいじってたら
正規表現で
s/ //g;
とやっても空白がマッチしなくなりました
s/\s//g;
ならマッチします
原因と元に戻す対処法を教えてください
552551:04/11/05 11:19:18 ID:vXdBVIeu
自己解決しました
553nobodyさん:04/11/05 11:36:35 ID:vAMAiFLG
間違えてPHP質問スレに書き込んでしまったのでこちらで質問しなおします。

ttp://tohoho.wakusei.ne.jp/wwwperl2.htm
こちらのsocket関数の項目に書かれているスクリプトを自分の
スクリプトに組み込んでますが
自分の使っているサーバーでperl -wcでスクリプトチェックを行ったら
Unquoted string "stdout" may clash with future reserved word at aaa.cgi line 543.
このような警告文が表示されました。
select(stdout);
のstdoutをAAAとか別のものに置き換えたらこの警告文が回避できましたが
別のものに置き換えても正常に動くのでしょうか?
perlのバージョンはThis is perl, v5.8.2 built for i386-freebsdです。
554nobodyさん:04/11/05 11:56:32 ID:???
select(STDOUT);
555553:04/11/05 12:26:44 ID:vAMAiFLG
>>554
どうも有り難うございます。
stdoutをそのまま大文字にしても動くんですね
556nobodyさん:04/11/05 13:45:35 ID:uR92YhZO
現在CGIでのアクセス制限サイトを作っているのですが、
アドレス欄にIDとパスワードが表示され、
そのIDとパスワードを含んだアドレスを入力すると、
ログが記録されないのです。
(cgiの認証画面から入力するときちんと記録されます)

ログ記録はこんな感じなのですが。。。
どこか間違っているのでしょうか

sub record {
local($date,$time,$agent,@data);

# 時間&ホスト取得
$date = &get_time;
$time = time;
&get_host;

# ロック開始
&lock if ($lockkey);

# ログファイルの読み込み
open(IN,"$prvdir/$logfile") || &error("Open Error: $logfile");
@data = <IN>;
close(IN);

# ブラウザ情報
$agent = $ENV{'HTTP_USER_AGENT'};
$agent =~ s/&/&/g;
$agent =~ s/</</g;
$agent =~ s/>/>/g;
$agent =~ s/"/"/g;
557556続き:04/11/05 13:45:59 ID:uR92YhZO

# ログ更新
while ($max <= @data) { pop(@data); }
unshift(@data,"$in{'id'}<>$date<>$host<>$agent<>$time<>\n");
open(OUT,">$prvdir/$logfile") || &error("Write Error: $logfile");
print OUT @data;
close(OUT);

# ロック解除
&unlock if ($lockkey);
}
558556続き:04/11/05 13:54:30 ID:uR92YhZO
すいません、この認証処理の中で何か足りないのかもしれません。
どなたか解る方お願い致します。

sub pwCheck {
local($f,$id,$pw,$check,$time);

if ($mode eq 'enter') {
$time = time;
if ($in{'cook'} eq "") { $in{'cook'} = 0; }
&set_cookie($in{'cook'}, $time);
}

$f=0;
open(IN,"$prvdir/$pwdfile") || &error("Open Error: $pwdfile");
while (<IN>) {
($id,$pw) = split(/:/);
if ($in{'id'} eq $id) { $f++; last; }
}
close(IN);
if (!$f) { &error("認証できません"); }

$pw =~ s/\n//;
$check = &decrypt($in{'pw'}, $pw);
if ($check != 1) { &error("認証できません"); }

&fileOpen;

if ($mode eq 'enter') { &record; }
exit;
}
559nobodyさん:04/11/05 14:09:48 ID:???
わかるなぁ〜その気持ち。。。
560nobodyさん:04/11/05 15:14:14 ID:???
561nobodyさん:04/11/05 15:21:59 ID:???
と、レスしてから改めて>>556の説明を読んでたら混乱してきた。

何をしたくて、どこがどのように思った通りに動いてくれないのか
わからない…。

URLにクエリーが表示されちゃって困ったよー。って話じゃない…?
562nobodyさん:04/11/05 16:10:54 ID:???
エスパー回答者向けだな
563伊藤:04/11/05 17:14:02 ID:???
呼んだか?
564nobodyさん:04/11/05 21:03:45 ID:w/zBhN/X
print "  <a href=\"$script?action=icondisp&type=$FORM{'type'}\">$lbl_iconlist</a>\n";

これを新しいウィンドウで開きたい場合はどのように書き直せばいいのでしょうか?
以下のようにするとエラーなんです。
よろしくお願いします。
print "  <a href=\"$script?action=icondisp&type=$FORM{'type'}\" target="_blank">$lbl_iconlist</a>\n";
565nobodyさん:04/11/05 21:17:13 ID:???
>>564
バーカ
print ' <a href="' . $script . '?action=icondisp&type=' . $FORM{'type'} . '" target="_blank">' . $lbl_iconlist . '</a>' . "\n";
566nobodyさん:04/11/05 21:38:56 ID:w/zBhN/X
>>565
全角にスペースにしわすれました
すいません
567nobodyさん:04/11/05 22:58:07 ID:???
printf にした方が読みやすいとは思うけれどもども。。。
printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|;
$script, # スクリプトのお名前
$FORM{'type'}, # typeの値
$lbl_iconlist; # アイコソリスト(文字列)
568nobodyさん:04/11/05 22:58:54 ID:???
>>567
あらやだ。
> printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|;
printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|,
569365:04/11/05 23:36:15 ID:???
print qq[<a href="$script?action=$icondisp&type=$FORM{'type'}" target="_blank">$lbl_iconlist</a>]."\n";

でいいんじゃないの?
570nobodyさん:04/11/06 02:52:14 ID:???
ダブルクォーテーションとかの扱いは人それぞれだからどうでもいいじゃん自分で気に入ったの使えば
571nobodyさん:04/11/06 04:17:26 ID:???
>>507
俺も同感
だからこそperlは何通りも書けるんだしね
572nobodyさん:04/11/06 09:00:12 ID:???
そこがPerlの良さ
573nobodyさん:04/11/06 10:24:21 ID:???
そこがPerlの悪さ
574nobodyさん:04/11/06 14:55:07 ID:???
そこがPerlのぬるぽ

ところで、NullPointerExceptionをPerl語にすると何?
575nobodyさん:04/11/06 16:06:17 ID:???
ガッ
576nobodyさん:04/11/06 16:06:35 ID:???
釣れますか?
577nobodyさん:04/11/06 17:29:59 ID:???
ダウンロードカウンタのCGIを作ろうとしています。

ブラウザにファイルの内容を送ろうと思うのですが,どうすれば良いでしょうか?
以下だとファイルが壊れてしまいます.

open(FILE,"$FileName");
binmode(FILE);
print <FILE>; ←while(<FILE>){print $_ }でもだめ.
close(FILE);

送りたいファイルは40KB程度ですが,数MB程度のファイルも対応できるとうれしいです.
お知恵をお貸しくださいm(_ _)m
578577:04/11/06 17:41:38 ID:???
書き忘れましたが,ファイルはバイナリファイル(LZH,ZIP等)です.
よろしくお願いします.
579nobodyさん:04/11/06 17:53:55 ID:???
>>577
環境によっては binmode(STDOUT); がいるんじゃないかな。
あと、バイナリファイルなら行読み込みにせず、readでバイト数指定して読み込み
while (read(FILE, $buffer, 1024*10)) ... バッファサイズは適当に
printで出力する場合はバッファoffするのも忘れずに $|=1 (念の為
580nobodyさん:04/11/06 17:58:03 ID:???
>>577
binmode(STDOUT) してないだけじゃないの?
つーか、壊れるという曖昧な表現じゃなくて
バイナリエディタで比較してみたら こういう違いがでてきた、ってな感じで話してくれないと。
まぁ、それ見りゃ自分でもおかしいとこに気づくんだろうけどね
581580:04/11/06 17:59:28 ID:???
んぁ。言葉選んでる間に答えられちゃってるよオレ
カコワリィ
582577:04/11/06 18:12:10 ID:???
>>579-580
レスありがとうございました。
原因は二つで,binmode(STDOUT)されてないこと,行読みした結果,改行コードが欠落したことでした.

>>579
「$|」というのはPerlの環境変数のようなものなのでしょうか?
print $|;だと値を返すようですが・・・
手元の資料&Google先生を調べても分からなかったのですorz

>>580
ご指摘,ありがとうございます.
「どういう風に壊れたのか」を説明する必要がありました.
失礼しました.
583nobodyさん:04/11/06 19:13:15 ID:???
>>580
Don't mind, 既知問題っぽかったから推測で書いちゃったけど
実は全然違う原因だったって事はよくあるからね.

>>582
$|は検索しにくいのが難点だな。Perl バッファリングで調べると詳細でてくるよ。
584577:04/11/06 19:17:26 ID:???
>>583
とほほさんのBBSに質問がのってますね.
勉強したいと思いますm(_ _)m
585nobodyさん:04/11/06 20:47:26 ID:55uCUnw3
    ○ ,                   ○>
   / ̄'☆                   )>>1 
  / >                    /

☆をダブルクリックするとかめはめ波が出るぞ

注)設定とか環境のせいで正常にかめはめ波しないときがあります
586nobodyさん:04/11/06 20:55:15 ID:???
    ○ ,                   ○>
   / ̄'☆                   )>>585
  / >                    /
587nobodyさん:04/11/06 20:56:12 ID:ZyicEXrd
Win2K + Active Perl 5.8 を使用しています。以下のスクリプト
を実行すると、「p.tif」 のファイル名が文字化けしてしまいます。
「use encoding "shift_jis";」の行を外すと、正常に「あ.tif」に変換
されるのですが、この行を残したままrename するにはどうすれば
よろしいでしょうか?

use encoding "shift_jis";
chdir 'c:\\test';
rename "p.tif", "あ.tif";
588nobodyさん:04/11/06 21:13:32 ID:jPPLQ8mN
    ○ ,                   ○>
   / ̄'☆                   )>>587 
  / >                    /

☆をダブルクリックするとかめはめ波が出るぞ!

注)設定とか環境のせいで正常にかめはめ波しないときがあります
589nobodyさん:04/11/06 21:20:51 ID:???
perl 5の正規表現で、content-typeヘッダに日本語があるかないかを判別するのに
iso-2022-jp|shift-jis|euc-jp|multipart\/mixed
という記述をします。これを応用して、『英語か日本語にマッチ』するかどうかを記述するには
どうすればよいでしょうか?

590587:04/11/06 22:56:11 ID:???
>>587 は自己解決できましたが、もっとスマートな方法があれば
よろしくお願いします。

use encoding "shift_jis";
use Encode;

chdir 'c:\\test';
$str = encode("shiftjis","あ.tif");
rename "p.tif", $str;
591nobodyさん:04/11/06 23:23:01 ID:???
>>587
no encoding;
で一旦切ってしまって、処理後にもう一度
use encoding "shift_jis";
しておく…のはあまりスマートじゃないですね。。

>>589
「キャラクタセットが英語または日本語である場合マッチ」ということなら、
http://www.iana.org/assignments/character-sets
↑と睨めっこして、必要なのを足していくとか。
(キャラクタセットの指定が無かったり、Unicodeを使われたら、終わりな気もするけど。)
592nobodyさん:04/11/07 19:03:48 ID:???
HTMLの<!---->みたいに複数行をまとめてコメントアウト
する方法をど忘れしてしまったので教えてください。
「#」じゃなく。
593592:04/11/07 19:14:26 ID:???
自己完結。

=comment # ここからコメント
=cut # ここまでコメント
594nobodyさん:04/11/07 19:14:34 ID:???
回答方法もど忘れしてしまいました。
595nobodyさん:04/11/07 20:51:25 ID:OKDqn1bD
お恥ずかしい話ですがsplitガどうしても上手くいきません。

@dat = split(/*/, <DAT>);

これで合ってると思うのですが、どうしてもエラーになってしまいます。
*DATは存在します。ちゃんと*で区切られています。
596nobodyさん:04/11/07 20:53:39 ID:???
* → \*
597nobodyさん:04/11/07 20:54:42 ID:V/bBugXz
全角半角混合の文字列からある順番の文字を取得したいのですがうまくいきません。
誰かお願いします。

文字列 $xx=あいうえおaiueo
から2番目の'い'を取り出だすとき
substr($xx,1,1);ではだめで
全角は2バイト分なので
substr($xx,3,2);でないとだめなようです。

598nobodyさん:04/11/07 20:55:58 ID:???
>>597
何がしたいのかサッパリわからん
599597:04/11/07 21:00:05 ID:V/bBugXz
たとえば
ランダムに生成された全角半角混合の文字列
$xx=げあじgraふぇeあefaじえeaあい;
から9番目のeを取り出す方法を教えて
600nobodyさん:04/11/07 21:56:10 ID:???
>>599
use Encode を使え
ただし 5.8 以上の perl でないとだめだが
601nobodyさん:04/11/07 22:01:19 ID:???
文字列を1文字ごとに分割して配列に入れりゃいいんじゃないか?
602nobodyさん:04/11/07 22:03:13 ID:???
んじゃ文字を配列にバラすコードを。文字コードは勝手にSJISと判断。
my @moji;
foreach ($xx =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]/g) {push (@moji,$_)}
print $moji[8];
603nobodyさん:04/11/07 22:40:30 ID:???
>>602
そこまでやったら、直接取り出せばいいんじゃない?
my $p = 9;
my ($moji) = ($xx =~ /([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]){$p}/);
print $moji;

お勧めは、version5.8以上なら>>600さんの通りEncodeで、
それ未満なら、
http://search.cpan.org/~sadahiro/String-Multibyte-1.05/Multibyte.pm
604nobodyさん:04/11/08 00:46:30 ID:???
どこまでしたいか謎だったからなぁ。やりたいのはこうかもしんないし。
my @moji = ($xx =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]/g);
print @moji[2..8];

なんにせよ環境も要件もよくわからんと返しようがないのぉ。
605597:04/11/08 02:03:34 ID:???
パールは5.8 以上みたいです。
トリップ生成用途だったのですが、これでうまくいきそうです。
みなさんどうもありがとうございます。
606595:04/11/08 09:25:10 ID:???
>>596
動きました!ありがとうございます。
607595:04/11/08 11:09:36 ID:IV2+5aK4
@data = split(/\n/, <DAT>);
で代入したら、$data[0]にしか代入されていません。
どなたかよろしくお願いします。
608nobodyさん:04/11/08 12:07:11 ID:???
>>607
その場合の <DAT> は一行しか読み込まないので、当然そうなるだろう。

というか何がしたいのだいったい。
ひょっとして君のやりたいことは @data = <DAT> だったりしないか。
609nobodyさん:04/11/08 13:34:38 ID:???
つーか、<DAT>って何よw?
610595:04/11/08 15:22:15 ID:hLOeveWj
>>608-609
あっ、すみません。<DAT>はファイルハンドルです。

>>608
なぜこの場合だと一行しか読み込まないのですか?
では、どうすればすべての行を読み込んでくれますか?

説明不足ですみません。返答お願いします。
611nobodyさん:04/11/08 15:27:35 ID:???
>>610
608をちゃんと読めアホ
612595:04/11/08 16:59:14 ID:x02iMqC5
>>611
すみません。やっていることがおかしかったですね。
ありがとうございました。
613nobodyさん:04/11/08 17:06:22 ID:???
ちょっとすれ違いなのですが
http://www98.sakura.ne.jp/~jun/perl/
どなたかここの移転先を知りませんか?
Perlに関するTipsや排他制御について、リファレンスについて説明してあったサイトなのですが
何時の間にかなくなったようで、、、、
614nobodyさん:04/11/08 17:17:29 ID:???
ちょっとどころじゃなく全くのスレ違いなんですが、
閉鎖したんじゃないですかね?

どうしても見たいなら

ttp://web.archive.org/

でも使って下さい。
615nobodyさん:04/11/08 21:29:51 ID:???
@var=<IN>;
とすると改行\nが消えないですが、それを消して配列に代入する方法はありませんか。
616nobodyさん:04/11/08 21:45:10 ID:???
たまにこういう釣りみたいな質問が来るな
617nobodyさん:04/11/08 21:57:37 ID:???
>>615
{ local $/ = undef; @var = split(/\n/, <IN>); }

あたりかな。ただしファイルの末尾の空行が消えるのが嫌なら、
splitの第3引数に負の値を与えるとともに、splitしたあとで
@varの最後の要素を捨てる必要があるだろう。

普通に読んだ後でchomp @varした方が書くのは楽だね。
618nobodyさん:04/11/08 22:31:46 ID:???
chomp(@var=<IN>);
619nobodyさん:04/11/09 00:16:14 ID:???
配列をヒアドキュメントでprintするとスペースも一緒にprintされてしまうわけですが、
これを回避するにはいちいちヒアドキュメントを閉じるしかないですか?
620nobodyさん:04/11/09 00:47:01 ID:???
no
621nobodyさん:04/11/09 01:27:59 ID:???
>>619
$"を空文字列にしておく

あるいは、

@{[join('',@a)]}として埋め込む
622619:04/11/09 02:18:31 ID:???
>>621
腸ありがとう
623nobodyさん:04/11/09 06:54:36 ID:???
>616
このスレで質問するとよく言われます。。

>617>618
ありがとうございます。
624nobodyさん:04/11/09 07:22:29 ID:???
>623
言われないように努力したりしないの?
釣りだと思われるような質問しちゃってるんだよ?
625nobodyさん:04/11/09 07:43:45 ID:???
Perlから,自分が動いているOSを知ることは出来ますでしょうか。
例えばWindowsで下を実行すると

print $^O
> MSWin32

とか出ますが,WinXPとかWin98とかくらいまで詳しく知るには,どういう方法がありますか。
(できればUnix系でも詳しく知りたいです)
626nobodyさん:04/11/09 09:36:25 ID:enWymUQX
別のウェブサーバー上にあるファイルの情報をstatとかで更新されているか、
されていないかとかしたいのですが、どうやってやったらいいのでしょう?
$url = "http://www.example.com/file.jpg";
@data = stat $url;
とかやっても取れないので(うすうすわかっていましたが)。。。
ウェブ上のデータとstatの内容を取得する方法を教えてください。
627nobodyさん :04/11/09 09:59:56 ID:???
>>626
lwpでもなんでもいいけど
httpのヘッダで
Date か Last-Modified みるしかなかんべ。
取れなかったら諦めるしかない。
628nobodyさん:04/11/09 10:07:38 ID:enWymUQX
>>627
ありがとう。
そういうものなんですか。
629nobodyさん:04/11/09 18:49:56 ID:???
>>625
$hoge =`uname -m`; とか。
詳しいことはUNIXのコマンドリファレンスでも探せば良し。

>>626
他のサーバーのデータは、
socketでソケット作って、connectで繋いで初めて得られる。
色々複雑だから、素直に解説本読みなはれ。
630nobodyさん:04/11/09 19:46:44 ID:???
>>625
http://aspn.activestate.com/ASPN/docs/ActivePerl/lib/Win32.html

use Win32;
print join(', ', Win32::GetOSVersion()), "\n";
print join(', ', Win32::GetOSName()), "\n";
631nobodyさん:04/11/09 22:34:49 ID:???
>>629-630
ありがとうございます。こんな風にしていろいろな環境でOS名を取得できました。
# 自分の目的のためには下の例で事が済んだのですが。

#-------
my $OS;
if ( $OS = `uname -s` ) {
    #do nothing
} elsif ( !$OS and eval{require Win32} ) {
    $OS = ( Win32::GetOSName() )[0];
} else {
    die "MacPerl?";
}
print $OS;
> Linux, FreeBSD, Win2000, Win98...

#-------
my $OS = $^O;
if ( $OS eq 'MSWin32' ) {
    require Win32;
    $OS = ( Win32::GetOSName() )[0];
}
print $OS;
> linux, freebsd, Win2000, Win98...
632nobodyさん:04/11/09 23:22:24 ID:mn5HDpbS
CGIにhtml組み込んで、
アクセスしてみたら、真っ白のページが表示されます。
んで、ホームページのソース表示してみたら、
確かにそこにはhtmlソースがちゃんとあるんだけど、
表示されていない。

原因はどんなことが考えられますでしょうか?
633nobodyさん:04/11/09 23:29:58 ID:???
>>632
どうせまともな HTML 吐いてないとかじゃないの?
634nobodyさん:04/11/09 23:31:31 ID:???
タグの閉じ忘れ


つうか原因探ってほしいならソースをどっかにあげましょう
635632:04/11/09 23:34:40 ID:mn5HDpbS
print <<__HTML__;
Content-Type: text/html; charset=EUC-JP

<html lang="ja"><head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">
<title>test</title>

このコードに問題ありますか?
636632:04/11/09 23:36:40 ID:???
タグの閉じ忘れっぽいですね、
他ブラウザで試したら表示されました。
企業から配布されてるスクリプトなのにテキトーだなぁ

サンクスでした。
637nobodyさん:04/11/10 00:18:59 ID:sQyPPo3N
スレ違いだったら大変申し訳ございません。

cronでcgiを動かすにはどのように設定ファイルを書けば宜しいのでしょうか。

/public_html/a.cgi
にありますcgiを例えば1時間毎にa.cgi?a=1&b=2とパラメータを渡してcronで
実行したいのですが。

よろしくお願い致します。
638nobodyさん:04/11/10 00:22:22 ID:???
スレ違いだな。スレタイを100回音読してから、また質問しに来ような
639nobodyさん:04/11/10 00:37:27 ID:sQyPPo3N
>>638
大変申し訳ありません。
該当スレを御存知でしたらお願いしたいのですが。
640nobodyさん:04/11/10 00:39:15 ID:???
>>639
犬板のくだ質
641nobodyさん:04/11/10 05:09:30 ID:???
>>637
perl /public_html/a.cgi
パラメータは渡せるが動的にするのはcronじゃ無理じゃないかな〜(知らないだけかも)
ちなみにコマンドラインのときはGETメソッドじゃなく引数になるから受け方違うよ

a=1とb=2が決まってるなら
ファイルの最初に宣言した方が早い

どうしてもCGIとして動かしたいならばWWW経由で/public_html/a.cgiを呼び出すプログラムが必要

それよりコマンドラインでperlを使ったことなさそうだけど
作るときちゃんと文法チェックしてるのかな?
642nobodyさん:04/11/10 08:39:47 ID:QcwLl9v+
誘導済みのスレ違いの質問にレス付ける馬鹿。
晒し上げ。
643nobodyさん:04/11/10 11:45:26 ID:I1NueUmN
@data = (system("df"));
とかして、ディスクの使用状況をテキストに書き出したいんだけど、
これじゃあ戻り値を取得できないですよね。
どうやったら取得できますか?
644nobodyさん:04/11/10 11:55:42 ID:I1NueUmN
643です。
自己解決しますた。m(_ _)m
645nobodyさん:04/11/10 16:07:28 ID:???
PERLで作成したファイルをPERLからダウンロードさせる場合に
どのようにしたらいいのでしょうか?

ファイル作成後に「ダウンロード」とボタンを表示してクリックしたら
ファイルをダウンロードするみたいな感じです。
646nobodyさん:04/11/10 17:04:37 ID:I1NueUmN
>>645
print "<a href=\"file\">DL</a>\n";
647nobodyさん:04/11/10 18:18:53 ID:???
リダイレクト前にcookieを作って、リダイレクトページで生成したcookieの値を取得したいのですが、
結構な頻度で値が取得できません。
ですが、少し時間をおいて取得すると値が取得できるので、
cookie作成のスピードよりもリダイレクト後のページで値を取得してるっぽいです。

従いまして、cookie作成時に少し時間を開けてからリダイレクトしたいのですが、
sleepを入れても意味がありませんでした。

この様な場合の対処方法をご存知の方がいらっしゃいましたら、どうかご教授ください。

よろしくお願いいたします。
648nobodyさん:04/11/10 20:55:28 ID:sQyPPo3N
ファイルから1行読み取り、その読み取った行を削除してファイルを上書きするにはどうしたらよいのでしょうか。

aaa,bbb,ccc,ddd
111,222,33,4444

このようなファイルがありaaa,bbb,ccc,dddを読み込んだ後にaaa,bbb,ccc,dddを削除して
ファイルを上書きするような処理です。

よろしくお願いします。
649nobodyさん:04/11/10 21:03:44 ID:???
>>645
「ダウンロード」とボタンをクリックしたらファイルを作成して
print "Location: http://www.example.com/file.zip\n\n"
650nobodyさん:04/11/10 21:52:59 ID:QZhMSK0D
>>645
ダウンロードボタンをクリックしてCGIでperlを動かした先で

$length = (-s $file);
print "Content-type: application/octet-stream\n";
print "Content-disposition: attachment; filename=hoge.dat\n";
print "Content-Length: $length\n\n";
open(fp, "<$file");
binmode(fp);
print <fp>;
close(fp);

するとOKだと思う
651nobodyさん:04/11/10 21:55:59 ID:QZhMSK0D
>>648

削除したい行以外を別の一時ファイルに書き込んで、元のファイル名にリネームする
で良いんじゃない?

他にいい方法があれば知りたい
652nobodyさん:04/11/10 21:57:30 ID:???
何でわざわざ別ファイルに書かせなきゃならんのかがわからん
653nobodyさん:04/11/10 22:21:12 ID:???
>>647
クッキーを食べない時と食べる時がある状況が良く分からないけど…。
<meta http-equiv="refresh" ..>
を使ってクライアント側で飛ばして見るとか。

# 状況は改善されない予感。
654nobodyさん:04/11/10 22:24:11 ID:QZhMSK0D
読み書きモードでオープンすればいいんだっけ?
655nobodyさん:04/11/10 22:30:47 ID:???
読み書きモードでその場更新でもいいけど、更新中にプログラムが
あぼーんすると変な状態で残ったりする。別ファイルに書き込み、
書き終わったらrenameなら書き換え前か書き換え後のどっちかには
なるので、オレはこのほうが好き。

656nobodyさん:04/11/10 23:55:31 ID:???
>>647
確認できるソース求む
657nobodyさん:04/11/11 00:08:27 ID:???
647ではないんだけどプログラム変えてないのに
IEでcookieが急に読めなくなった。(前はできてました。)
プログラムAでcookie送信してプログラムBに遷移して
そのcookieを取ろうとしても取れなかった。
他のcookieは取得することができました。
ネスケでは大丈夫だったんだけどなぁ。

ちなみにCGI.pm使って
$hoge=param('hoge');
とやって$hogeが空になっており、
cookieのフォルダを見るとちゃんとそのcookieがありました。
658nobodyさん:04/11/11 00:21:14 ID:???
>>657
確認できるソース求む
659nobodyさん:04/11/11 00:52:30 ID:???
まずはIEのクッキー設定を疑うよろし。
660657:04/11/11 01:49:17 ID:???
657ミスりました。
paramのとこcookieです。

>>659
クッキーの設定も疑って全て許可にしてもだめだったのです。
でも、今家のPCで同じスクリプト走らせたらできました・・・。
で、サーバの方も試したらできました。
仕事場のPCからやった時はできなかったんですよほほほ。
ご迷惑おかけしました。
661nobodyさん:04/11/11 11:33:09 ID:???
文字列$aが数字以外を含んでいたら、
エラー出したいんですが、
どうすればいいんでしたでしょうか?
~[0-9]を使えばいいことはわかるんですが・・・

if($a=^[0-9]){
echo"error";}

何か間違ってますか?(^^;
662nobodyさん:04/11/11 11:35:42 ID:???
age
663nobodyさん:04/11/11 11:51:58 ID:???
>>661
うむ、それもかなり激しく

if($a=~/[^0-9]/){
664nobodyさん:04/11/11 11:54:04 ID:???
>>663
間違えまくってますね笑汗
ありがとうございます、助かりました。
665nobodyさん:04/11/11 13:59:06 ID:???
/\D/ 小泉こうだろう?
666nobodyさん:04/11/11 14:33:41 ID:tk5UM/xB
自分のPCで実行して、入力先をWEBページにして、
記載されている内容を処理しファイルに書きたいのですが
可能でしょうか?

基本的なことですみません。
何の言語を覚えたらいいのかわかりませんので。
667nobodyさん:04/11/11 14:54:37 ID:???
何言ってるんだかわからん
668nobodyさん:04/11/11 15:18:47 ID:tk5UM/xB
すみません。説明が下手で。
以下のようなことをWindows XP上でしたいのです。
できますか。

実行したら、例えばこの板のスレッド一覧
http://pc5.2ch.net/php/subback.html
を読んで
インデックス/スレタイ/その時点での書き込み数
をCSVファイルに書き込むようなものです。
中でリンクから各スレを読んで>>1のハンドルも取得できればなおよいです。
669nobodyさん:04/11/11 15:20:41 ID:???
>>668
できるよ
670nobodyさん:04/11/11 15:21:57 ID:???
LWP
671nobodyさん:04/11/11 15:28:02 ID:riaohoTo
翻訳
perlプログラムをローカルPCで実行
ネット上のウェブページの情報を取得
いろんな処理
ローカルPCに保存

ってこときゃ?
672671:04/11/11 15:29:21 ID:riaohoTo
チョコ食ってる間に進んでた。
すまそ
673nobodyさん:04/11/11 15:32:15 ID:R3WWGPIl
ウェブから入力された新しいユーザー名を、ユーザ名の入ったファイルを
チェックして必要があれば弾いたり空いている場所に追加したり削除する
CGIを作りたいのですが・・・・。

ユーザー名の入ったファイルを行入力演算子で配列に読み込んで、
それをいろいろやってから再び配列に戻して、最後に
$i=0;
while($i<=$count){
print FILE "$username[$i]\n";
$i++;
}
みたいに、改行して出力すれば次にCGIを呼び出したときに再び
行入力演算子で配列に読みこめるファイルが作成できるのでしょうか?
何度もやったのですが、どうしてもうまくファイルが作成できないのです。
674nobodyさん:04/11/11 15:33:41 ID:???
>>671
そんな感じぢゃな。

perlプログラムをローカルPCで実行 → ActivePerl をゲットせよ
ネット上のページの情報を取得 → LWPの使い方を習得せよ
解読処理 → HTMLをパースする方法、正規表現とか HTML::Parser とかを習得せよ
CSVファイルに書き込む → まあ何とでもなるぢゃろう

>>672
その FILE とかいうファイルハンドラは
当然書き込みモードで open されとるんぢゃろうな?
675nobodyさん:04/11/11 15:33:44 ID:???
>>668
perlスレなのでperlを覚えてください
676673:04/11/11 15:35:58 ID:R3WWGPIl
>>674
いえ、入力モードで開いて配列に読み込んで、
一旦閉じてから再び出力モードで開いてます
677nobodyさん:04/11/11 15:46:34 ID:tk5UM/xB
>>671 >>674
ありがとうございます。

>>675
覚えてからできないのがわかったら悲惨ですから
先に確認したいと思いました。
じゃ勉強始めます。
678nobodyさん:04/11/11 16:00:47 ID:???
スレタイ見るだけのスクリプトなら、手元にあるから、貼っといてやるよ。
スレの中身見るのは、自分で作りな。

use LWP::Simple;
$url = "http://pc5.2ch.net/php/subback.html";
@lines = split(/[\r\n]/, get($url));
foreach my $buf (@lines) {
 if ($buf =~ /<base href="([^\"]+)"/){
  $base_ref = $1;
  last;
 }
}
foreach $buf (@lines) {
 if ($buf =~ /<a href="(\d+)\/l50">(\d+):(.*)\((\d+)\)/){
  $thethread = $1;
  $num = $2;
  $title = $3;
  $rescount = $4;
  print "$thethread, $num, $title, $rescount\n";
 }
}
679nobodyさん:04/11/11 16:42:01 ID:???
レンタルサーバにてたまにcgiがCPU 90%を長時間(600hとか)使うことがあります。
このスクリプトの問題点を調べたいのですが、どのようにすればよい
かアドバイスを頂けたらと思います。

利用しているスクリプトは、余裕派掲示板です。
http://specters.net/cgipon/

バージョンは、2.62と、3.00 beta7を利用しておりどっちが
CPUを食っているかはまだわかりません。

そこまでCPUを使ってるのにkillしないサーバ屋もサーバ屋ですが、
とりあえず、他人の迷惑になるので調査したいのですが、とっかかり
がわかりません。

発生頻度は、1-2日に1回位起きてるのかもという位で、まだ
詳しくはわかりません。

よろしくお願いします。
680nobodyさん:04/11/11 16:49:47 ID:???
>Perlのコーディングで困ってる人のスレです。
681nobodyさん:04/11/11 17:00:04 ID:???
>>679
Devel::DProf
で調べると良いよ。
682nobodyさん:04/11/11 17:25:26 ID:???
>>681
素晴らしいです。
#!/usr/bin/perl -d:DProf

にすれば良さげです。ちょっと仕掛けてみます。
683nobodyさん:04/11/11 20:23:40 ID:???
ちょっといいか・・・?
>レンタルサーバにてたまにcgiがCPU 90%を長時間(600hとか)使うことがあります。
600時間てあんた、一体何動かしてるんだ?
ほぼ一ヶ月だぞ?
684nobodyさん:04/11/11 20:45:48 ID:???
>>681
これ良いです
便利なものがあるもんですね
685nobodyさん:04/11/11 21:02:10 ID:???
>>683
600minでした すまそ

一行ごとに解析できる Devel::SmallProf というのもあるらしい。

686nobodyさん:04/11/11 21:11:26 ID:Z05OwTsM
@hogeに20行の文字列が入ってて、
それを指定した位置から指定した位置の複数文字([6]から[14]までの文字)を
$hogeに入れるにはどうしたらよいですか?
687nobodyさん:04/11/11 21:16:03 ID:???
for(i=6;i<=14;i++){
$hoge .= $hoge[$i];
}
688nobodyさん:04/11/11 21:35:44 ID:Z05OwTsM
>>687
多謝!!
689nobodyさん:04/11/11 22:09:33 ID:???
$hoge = join('', @hoge[6 .. 14]);
690nobodyさん:04/11/12 00:37:35 ID:???
ずっと気になっているんですが、.= とは何ですか?行数をどう処理するものなんですか?
691nobodyさん:04/11/12 00:44:05 ID:???
連結演算子
692nobodyさん:04/11/12 00:47:37 ID:???
<textarea>で作った2行の文字から改行を取り除くにはどうすればよろしいでしょうか?
$value =~ s/\n//;としてもだめでした。

perlバージョンは最新です。windows2000です
693nobodyさん:04/11/12 01:02:29 ID:???
>>692
Win環境は\r\nだよ
694nobodyさん:04/11/12 01:02:48 ID:???
$value =~ s/\r\n//g;
695nobodyさん:04/11/12 01:03:03 ID:???
>>692
Perlメモ
でググってから、もう一度来い
696nobodyさん:04/11/12 01:18:01 ID:???
ありがとうございます。うまくできました。
697nobodyさん:04/11/12 03:20:48 ID:???
>>690
$hoge .= $foo; と $hoge = $hoge . $foo; は同じ

>>692
漏れはどっちでも対応できるように $value =~ s/\r?\n//g; ってしてる。
698nobodyさん:04/11/12 07:17:05 ID:???
>691>697
思い出しました、ありがとうございます
699nobodyさん:04/11/12 09:07:08 ID:bxBJtrFy
$_ = "AAA_BBB ZZZZ-DDD_EEE/FFF.";
のような文字列中からアルファベット三文字のリストを抜き出そうとしています。
my(@list) = $_ =~ /(?:^|[^A-Z])([A-Z]{3})[^A-Z]/g;
foreach (@list) {
  print "$_\n";
}
にしてみたのですが抜き出されるのは
AAA,DDD,FFFの3つでAAA_のマッチのあとのBBBとDDD_のあとのEEEがとれません><
700nobodyさん:04/11/12 10:27:18 ID:???
>>699
こいでいいじゃん。
while(s/[A-Z]{3}//) {
print $&, "\n";
}
701nobodyさん:04/11/12 10:29:01 ID:???
>>699
これでどうよ?

my $t = "AAA_BBB ZZZZ-DDD_EEE/FFF.AAA";
my(@list) = $t =~ /(?:^|[^A-Z])([A-Z]{3})(?=[^A-Z]|$)/g;
foreach (@list) {print "$_\n";}

最後のAAAにマッチさせたくないのであれば|$の部分をカット
702699:04/11/12 16:58:54 ID:bxBJtrFy
701さんのでうまくいきました。
ありがとうございました。
703nobodyさん:04/11/13 12:05:38 ID:???
パスの区切り文字が環境(OS)によっては / だったり、\ だったりするので
実行環境を判定して場合分けしようと思いましたが、定番の方法があれば教えてください。

一応、こんなことしか思いつかないのですが・・
$^X=~/exe$/i
704nobodyさん:04/11/13 12:59:33 ID:???
>>703
CGI.pmのソース読んでみて。
705703:04/11/13 13:14:55 ID:???
>>704
なるほどわかりました。これが定番なんですね。
スマートな方法じゃないのでがっかりんこです。
706nobodyさん:04/11/13 13:50:49 ID:???
>>703
my $os = $^O;
my $separator = '/';
if ($os =~ /^MSWin/i or $os =~ /^dos/i or $os =~ /^OS2/i){
$separator = '\\';
} elsif ($os =~ /^MacOS/i) {
$separator = ':';
}
でも構わないと思うけど。

# 手抜きするなら、/[:\/\\]/で区切るとか。
707nobodyさん:04/11/13 15:05:09 ID:???
>>703
やりたいことをまずは書いたほうが解決は早いよ。
ディレクトリ部分を削除してファイル名のみにしたいとか。そんな感じじゃないの?
708nobodyさん:04/11/13 17:15:37 ID:OROQk2Kk
ファイルハンドルがcloseされているのかされていないのかを明示的に調べる
方法はありますでしょうか?
709nobodyさん:04/11/13 17:46:23 ID:???

はい
710nobodyさん:04/11/13 17:49:37 ID:j/c/9VEE
フォームに記入してもらったメールアドレスにsendmailでメールを送信するCGIを組んで運用しているのですが、
infoseekのwebメールサービスで本文の文字化けが起きてしまいます。
例)あああああ → ??????????

ヘッダには以下のものを設定してあります。
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

ググってみたところ同じ問題を抱えているweb管理者さんがたくさんいることはわかったのですが
解決方法を見つけることはできませんでした。

文字化けさせない方法があったら教えてくださいませ。
711nobodyさん:04/11/13 18:46:27 ID:???
charset="iso-2022-jp" で試してみそ
712nobodyさん:04/11/13 19:12:30 ID:j/c/9VEE
>>711
レスありがとうございます。

実は以前は""で括っていました。
これが文字化けの原因かも?と思い現在は""を外しているわけですが
やはり文字化けしてしまっているという状況です。

この問題が解決できれば、多くのWeb管理者さんが助かることになると思います。
(もちろん私もですが…)
どうか皆さん、お知恵をお貸しください。
713nobodyさん:04/11/13 19:20:00 ID:???
化けるメールと化けないメールのヘッダを比べてみたら?
714nobodyさん:04/11/13 19:33:36 ID:j/c/9VEE
>>713
レスありがとうございます。

何度も見直しているのですが、PCのメーラから送ったものと特に違う箇所は無いのです。
(Received、Message-ID、X-Mailer等は抜かします)

Subjectは両方ともISO-2022-JPのBでエンコーディングして(されて)います。
715nobodyさん:04/11/13 19:40:31 ID:???
Charset=iso-2022-jp ではダメか?
とにかく化けたメールのヘッダを晒してみんしゃい
716nobodyさん:04/11/13 19:42:20 ID:???
ごめん 710にかいてあった 鬱
717nobodyさん:04/11/13 19:56:16 ID:???
自作のCGI(PHPのPEAR:Mailを使用)で、710と同じヘッダでInfoseek宛に
メール送信してみたが、文字化けはしない。

710の使っているCGIとHTMLのソースを見たら、原因が分かるかも。
718nobodyさん:04/11/13 20:03:52 ID:???
>>709
>>708じゃないけど、よかったら教えてくださいな。

>>710
本文の文字コードが2022-JPかどうかをもう一度確認。
719710:04/11/13 20:07:15 ID:j/c/9VEE
>>717
あまり綺麗なソースではないので恥ずかしいのですが、よろしくお願いします。
xxxの箇所は伏せさせてください。

my $mailer = '/usr/sbin/sendmail';
my $mlfr= 'xxx@xxx';
my $mlto= '[email protected]';
my $mlsb= 'xxx';
my $mlmsg = "あああああ";

my $mlhd= "Reply-to: $mlfr" . "\n" . "MIME-Version: 1.0" . "\n" . "Content-Type: text/plain; charset=iso-2022-jp" . "\n" . "Content-Transfer-Encoding: 7bit" . "\n" . "From: $mlfr" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";

my $err = 0;
open( MAIL, "| $mailer -t -f'$mlfr'" ) or $err = 1;
if ( $err == 0 ) {
 print MAIL $mlhd;
 print MAIL $mlmsg;
 print MAIL "\n";
 close( MAIL );
}

なお、通常のメーラ、そしてyahooやhotmailなど他の無料メールサービスでは正常に表示されています。
720nobodyさん:04/11/13 20:35:30 ID:???
$mlmsgはホントにiso-2022-jpか?
721nobodyさん:04/11/13 21:16:07 ID:???
> my $mlmsg = "あああああ";
でエラー出てないから、送ってるコードはiso-2022-jpじゃ無いだろ。
コード変換しろ。
722710:04/11/13 21:17:27 ID:j/c/9VEE
>>720
鋭いご指摘ありがとうございます。
素晴らしく見事に見過ごしてました…orz

$mlmsgにコード変換かますことで解決しました。
皆さんありがとうございました。
723nobodyさん:04/11/13 21:19:42 ID:???

- - - - - ここまで釣り - - - - -
724nobodyさん:04/11/13 21:25:31 ID:???
>ググってみたところ同じ問題を抱えているweb管理者さんがたくさんいることはわかったのですが
...
725nobodyさん:04/11/13 21:26:44 ID:???
                    |
                    |
                    │
     /V\            J
    /◎;;;,;,,,,ヽ
 _ ム::::<,,゚ A゚>::| ジーーッ
ヽツ.(ノ:::::::::.:::::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
726nobodyさん:04/11/13 21:33:59 ID:???
>この問題が解決できれば、多くのWeb管理者さんが助かることになると思います。
...
727710:04/11/13 21:37:32 ID:???
お騒がせしてしまい申し訳ないです。
でも決して釣りなどではありませんから、ええ本当に…('A`)

例えば大手サイトでもこんな感じで…
ttp://www.e-casio.co.jp/support/080.html

とにかくすみませんでしたorz
728nobodyさん:04/11/13 23:06:05 ID:???
>>727
その文字化けの注意点は
710が思ってる文字化けの問題ではないと思われる
729nobodyさん:04/11/14 00:51:05 ID:???
>>710

my ($err);
my $mailer = '/usr/sbin/sendmail';
my $mlfr= 'xxx@xxx';
my $mlto= '[email protected]';
my $mlsb= 'xxx';
my $mlmsg = "あああああ";

my $mlhd= "Reply-to: $mlfr" . "\n" . "MIME-Version: 1.0" . "\n" . "Content-Type: text/plain; charset=iso-2022-jp" . "\n" . "Content-Transfer-Encoding: 7bit" . "\n" . "From: $mlfr" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";

if (open( MAIL, "| $mailer -t -f'$mlfr'" ))
{
  print MAIL $mlhd;
  print MAIL $mlmsg;
  print MAIL "\n";
  close( MAIL );
} else {
$err = 1;
}

関係ないけど、こんなのどう?
730nobodyさん:04/11/14 05:48:52 ID:???
>>729
my $mlhdの行がイモ過ぎる。
書き直してやれよ。
731nobodyさん:04/11/14 09:59:57 ID:???
my $mlhd=<<EOF;
Reply-to: $mlfr
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
From: $mlfr
To: $mlto
Subject: $mlsb

EOF
732nobodyさん:04/11/14 10:57:46 ID:???
メールの改行コードって ¥r¥n じゃなくていいんだっけ?
733nobodyさん:04/11/14 13:07:57 ID:???
>>731
そのままprintしてもいいよね

print MAIL <<_EOF;
Reply-to: $mlfr
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
From: $mlfr
To: $mlto
Subject: $mlsb

_EOF
734nobodyさん:04/11/14 19:41:44 ID:???
>>732
sendmailがよきにはからってくれるが、明示的に
print MAIL <<_EOF;
Reply-to: $mlfr\r
MIME-Version: 1.0\r
Content-Type: text/plain; charset=iso-2022-jp\r
Content-Transfer-Encoding: 7bit\r
From: $mlfr\r
To: $mlto\r
Subject: $mlsb\r
\r
_EOF
とする方が望ましい。
735nobodyさん:04/11/14 20:17:27 ID:???
(;゚Д゚)
736nobodyさん:04/11/14 20:17:29 ID:???
(my $mlhd = <<"EOF") =~ s/(?<!\r)\n|\r(?!\n)/\r\n/g;
Reply-to: $mlfr
...

EOF
737nobodyさん:04/11/15 00:54:44 ID:Pp2G7AAw
ここで質問してよいのか迷ったのですが、もし不都合でしたら御指摘ください。

perlのスクリプト中で、あるURLのhtmlファイルを取得して、そのファイルの
データを処理したいのですが、その取得方法がわかりません。

ぜひご教授お願いします。
738nobodyさん:04/11/15 01:29:15 ID:???
>>703
遅レスだが、ポータビリティを重視するならFile::Spec
使ったほうがいいんじゃない?
739nobodyさん:04/11/15 01:40:44 ID:???
740nobodyさん:04/11/15 02:56:46 ID:???
ソートに関して…躓いています。

@data = (
'あ,1,A',
'い,2,B',
'う,3,C',
'え,4,D',
'お,5,E',
'か,6,F',
);

という例があったとして、これを数字でソートし、
さらに4にもっとも近い順からソートしたいのですが、これが上手くいきません。
方法があれば何卒教えて頂きたく思います。どうか宜しくお願いします。
741nobodyさん:04/11/15 04:31:28 ID:???
こんなんじゃ?
for(@data){
$data{$_}=abs(4 - (split(/,/,$_))[1]);
}
foreach (sort {$data{$a} <=> $data{$b}} keys %data){
print $_, "\n";
}
742nobodyさん:04/11/15 07:00:56 ID:???
my @new = map{ $_->[1] }
sort{ $a->[0] <=> $b->[0] }
map{ [abs((split(/,/))[1]-4), $_] } @data;

--
# 数字は8桁以内
my @new = map{ substr($_, 8) }
sort{ $a cmp $b }
map{ pack('A8A*', abs((split(/,/))[1]-4), $_) } @data;

--
# >>741さんと同じハッシュ使用
my %temp = map{ $_ => abs((split(/,/))[1]-4) } @data;
my @new = sort{ $temp{$a} <=> $temp{$b} } keys %temp;
743nobodyさん:04/11/15 08:47:06 ID:???
>map{ pack('A8A*', abs((split(/,/))[1]-4), $_) } @data;
map{ sprintf('%08d%s', abs((split(/,/))[1]-4), $_) } @data;
だね…。
744nobodyさん:04/11/15 10:38:06 ID:???
すみません、便乗でいいですか?
>740さんの例題をすこし弄って、

@data = (
'赤,あ,1,A,6',
'青,い,2,B,5',
'赤,う,3,C,4',
'青,え,4,D,3',
'赤,お,5,E,2',
'青,か,6,F,1',
);

これを>740さんの質問通り三つ目で四に最も近い数字でソートします。
この後が僕の質問なんですが、
これを更に一番目でソートし、最後に五番目でソート…
というのは出来ますでしょうか?
具体的にはこんな感じでしょうか?

@data = (
'青,え,4,D,3',
'青,い,2,B,5',
'青,か,6,F,1',
'赤,う,3,C,4',
'赤,お,5,E,2',
'赤,あ,1,A,6',
);

一応、>741さんや>742さんの解答を参考に頑張ってみたんですが、
やっぱり上手くいきませんでした。
複雑だし無理かもしれませんがどうかお願いします。
745nobodyさん:04/11/15 11:14:04 ID:???
sort { } の中身を工夫すればできる
できなければ駱駝本を買って sort 関数のところを読め
746nobodyさん:04/11/15 12:09:37 ID:44z8JY7I
jcode.pl v2.13 を使っているのですが、大量のバッチ処理をしていてふと
気付いたら、以下のようなメッセージが極々々まれに出てるのに気付きました。

Character in "C" format wrapped at [フルパス]/jcode.pl line 554.

行554には $s2e{$code} = pack('CC', $c1, $c2); とかかれているのですが、
恥ずかしながらなぜ警告(?)メッセージが出てるか自分でわかりません。

どなたか教えて頂けないでしょうか?
(ネットで探してみましたがちょっとよく分からくて)
747nobodyさん:04/11/15 13:27:24 ID:???
$c1と$c2の値がすでに文字列なんじゃないの。
748nobodyさん:04/11/15 14:04:03 ID:???
>>746
とりあえず診断メッセージがわからないときはperldiag(1)を
見るのがいいと思うのだが。

Character in "C" format wrapped in pack
(W pack) You said

pack("C", $x)

where $x is either less than 0 or more than 255; the "C" format is
only for encoding native operating system characters (ASCII,
EBCDIC, and so on) and not for Unicode characters, so Perl behaved
as if you meant

pack("C", $x & 255)

If you actually want to pack Unicode codepoints, use the "U" format
instead.
749nobodyさん:04/11/15 15:03:24 ID:44z8JY7I
>>748
ありがとうございます。英語力は全く無いのですが、
0〜255の範囲以外のが来てるのでエラーになっているのですね。色々試しています。
750737:04/11/15 21:26:40 ID:YvLIGcES
>>739

ありがとうございます。LWPを使ってうまくいきそうです
(何をやってるのか自分でまだ理解できてなかったりしますが・・・)
751nobodyさん:04/11/15 22:45:40 ID:v6KPj5Kw
漠然とした質問で申し訳ないんですが、1000行程度の1対1対応のデータを
1回のプロセスで何度も検索する場合、あらかじめハッシュを作った方が速くなるのでしょうか?
いまいちハッシュの性能というのが分からないのですが、検索キーをかえるたびに
1行目から値を探していくのと、ハッシュにキーを入れて値を得るのと、
ハッシュのほうが速そうな気がするんですが、やっぱり速いでしょうか?
752nobodyさん:04/11/15 23:40:04 ID:???
>>751
case by caseとしか言いようが・・・
行という言葉を簡単に使ってるけども、
実際には行の切り出しという処理が入るわけだし、
それなら固定長でデータを扱う方が早いわけだし、
ハッシュというか位置インデックスを作れば固定長の呪縛が無くなるし、
というか何度も検索する必要があるのか?という根本的な疑問も残るし、
長くなったがオレの言いたいことはこれだね!
なんで試してみない?
753nobodyさん:04/11/15 23:47:01 ID:???
>>752
実際二つ作ってみるのが早いですよね。めんどくさがって申し訳ないです。
組み合わせの検索をする感じなんですが、大体2500〜40000くらいの組み合わせから
条件に合うものをピックアップする感じで、やはりとにかく試すことにします。
ありがとうございました。
754nobodyさん:04/11/15 23:51:24 ID:???
>>751
よくわからんが、もし言いたいことが

while($hairetsu[$index] ne $hikaku){ $index++; }



$index = $hash{$hikaku}

を比べたいのなら、後者の方が圧倒的に速い
755751:04/11/15 23:54:50 ID:???
>>754
バッチリそんな感じです。ハッシュの方から作ってみる事にします。
756nobodyさん:04/11/16 00:01:02 ID:???
>>754
えーと。。whileつーのは。。やっぱりいいや。
意味せんとしていることは伝わってるみたいだし。
757751:04/11/16 00:18:23 ID:???
>>756
ああ読み違えました!のかな?
今必要としているのは、キーと値の両方で、キーはただの行数とかじゃなくって
ユニークなデータなので、while($hairetsu[$index] ne $hikaku){ $index++;}
の方だと無理なのかもしれません。ごめんなさいよく分かりません。
758nobodyさん:04/11/16 00:23:16 ID:???
普通は、1000個もハッシュ作ってからindex検索するるより、
1000行ベタ検索した方が速い。30000行でもそうだったかな。
759nobodyさん:04/11/16 00:35:13 ID:???
ごめん、30000行のはSQL+pnamazuとベタとの比較で、
そりゃDBのが速いが、pnamazuが介在してるからか、
たいして変わらなかった。QDBMあたりでやったらどう
かな。こんどやってみるか。
760nobodyさん:04/11/16 03:12:24 ID:???
1回しか検索しないなら要素がいくつだろうがリニアサーチの方が速いけど、
何回も検索するならソートしてから二分探索するかハッシュ作った方が全然速い。
要素が1000個でも。
761nobodyさん:04/11/16 06:55:09 ID:???
>>760
1回の検索ではリニアサーチの方が速いんなら、何回やっても
リニアサーチの方が速いだろうが(プッ
1*n < 1.2*n、ほれ回数が多くなるほど差は広がる。
762nobodyさん:04/11/16 07:06:06 ID:???
>>744
ソートというより、一番近い値を探すという感じだね。

>>745
絶対無理。
763nobodyさん:04/11/16 08:47:34 ID:???
>>761
mod_perlなんかならハッシュだな。つまり、何回も検索する際、
perlを起動しなおさない。作ったハッシュをメモリに保存しとく。
あと、namazuとかsufaryとかindexファイルを別に作っておくとか
すれば、>>760でOK.
764nobodyさん:04/11/16 11:13:02 ID:???
最初にハッシュを作るステップを抜きにすれば、
リニアサーチよりハッシュの方が速いということ?
765nobodyさん:04/11/16 12:44:55 ID:???
>>762
差分の絶対値でソートすればええやん

>>764
まあそういうことや
766nobodyさん:04/11/16 16:53:03 ID:???
みんな
require 'ファイル';
って最初の方に読んじゃってますか?

そのファイルが必要な処理がある直前(複数箇所)で
requireしてるんだけど問題ありますかね?
複数箇所と行っても一回の起動では一箇所しか呼び出しません。
767nobodyさん:04/11/16 17:34:24 ID:???
>>744
遅レス御免。
これで処理しても示されてる結果にはならないが、
条件が複数のソートはこんな感じでいいと思う。

$sort_routine = sub {
 my @La = split /,/, $a; my @Lb = split /,/, $b;
 abs(4 - $La[2]) <=> abs(4 - $Lb[2]) || $La[0] cmp $Lb[0] || $La[4] <=> $Lb[4];
};

@ahoo = sort $sort_routine @data;
768762:04/11/17 06:08:04 ID:???
ごめんなさい。質問を勘違いしてました。

質問内容は
・3の要素でソート
・1の要素で安定なソート
・5の要素で安定なソート
で、その順番を逆転させれば一回でできる訳ですね。
5の要素でソート、同じ値なら1の要素でソート、同じ値なら3の要素でソート。

use sort "stable";
my @new = map{ $_->[3] }
sort{ $a->[0] <=> $b->[0] or $a->[1] cmp $b->[1] or $a->[2] <=> $b->[2] }
# sort {$a->[1] cmp $b->[1] or $a->[2] <=> $b->[2] } # 3と1の要素だけでソート(例示と同じ結果を得る)
map{ my @v = split(/,/); [$v[4], $v[0], abs($v[2]-4), $_]; } @data;

>>745
つっこんでごめん。
769767:04/11/17 07:36:26 ID:???
なんだ、>>767の方法ってPerlメモってところで既出だったのか・・・。
せっかくその場で考えたのに、空しいぜ。
よく読んで頭冷やしてくるか。

>>766
条件などで読むファイルを変えたいときは、
途中に書いたことはあったけどね・・・。

何でもないときは、先頭に書くのが基本でしょ。
そのプログラムが、どのファイルに依存しているかを明示しておけば、
後々運用管理するのに楽になるし。
770nobodyさん:04/11/17 17:56:42 ID:???
Perlメモお世話になってます。
771nobodyさん:04/11/17 18:32:44 ID:tQLRR4kH
同じファイルハンドル(この場合$fh)から別ファイルに続けて書き出そうとすると
何も出力できません。

open (OUT,"> test/$test");

while(<$fh>){ #$fhはファイルハンドルが入っている
prin OUT $_;
}

close(OUT);

という処理を繰り返し実行すると2つ目のファイルは
なにも表示されません。

1回実行したあとファイルハンドル($fh)を表示してみましたが、
確かに指し示しているファイルは1回目と変わりません。
ファイルハンドルを書き出した後ファイルハンドルって
どうなってしまうのでしょうか?
772nobodyさん:04/11/17 19:09:57 ID:???
>>771
prin じゃなくて printだよね?
while は$_を操作しません。
773771:04/11/17 19:13:30 ID:tQLRR4kH
すいません。printです。
forでも同じでした。
774771:04/11/17 19:20:12 ID:tQLRR4kH
なんどもすいません。
できました。書き出す前にtellでファイルハンドルの場所を
取って来て、書いた後seekで戻す事によって解決しました。
お騒がせしました。
775はなわlo:04/11/17 19:25:22 ID:???
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l ftp://l.l
776nobodyさん:04/11/17 19:38:43 ID:GNPvE3vb
htmlの部分とCGIの部分を分けてコーディングしたいです。
何かよいモジュールなどありませんでしょうか。
777nobodyさん:04/11/17 19:39:43 ID:???
HTML::Template
778nobodyさん:04/11/17 20:00:07 ID:???
>>775の[ここ壊れています]って初めて見た。
779質問です:04/11/18 01:55:30 ID:U6GG0aJq
$file = "file.xxx";

$size = -s "$file";

print "Content-Disposition: attachment; filename=\"$file\"\n";
print "Content-Length: $size\n";
print "Content-Type: application/octet-stream\n\n";

open(DAT, "$file");
while(<DAT>){
print;
}
close(DAT);

のようなコードで file.xxx をダウンロードしたいのですが、
ダウンロード画面はちゃんとでてダウンロードできるのですが、
ファイルが壊れて保存されます。これはなんででしょうか。
OSはwindowsでapacheで動かしてます。。
780nobodyさん:04/11/18 02:59:31 ID:???
>OSはwindowsでapacheで動かしてます。。
DATもSTDOUTもbinmode()せにゃあかんのでは?
781779です。:04/11/18 04:26:15 ID:???
すいません。そのとおりでした。
ありがとうございます。
感謝感謝。
782nobodyさん:04/11/18 11:15:20 ID:???
TO:[123] こんにちわ。

↑のような文字列から数値部分(123)だけを取り出す場合、どう書くのがスマートでしょうか?
TO:[数値] という書式は固定です。
783nobodyさん:04/11/18 11:17:02 ID:???
$string =~/^TO:\[(\d+)\]/;
$no = $1;
784nobodyさん:04/11/18 11:23:07 ID:???
>>783
できました!ありがとうございました!
785nobodyさん:04/11/18 13:06:46 ID:If69CbzI
s/"/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;

これは"が"に変換されてるデータ($_)から"を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての"が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの"のみです。
最初にいきなりs/"/"/g;などとやらず、fontタグの"だけを"に戻す方法すにはどの様にすれば良いでしょうか?
786nobodyさん:04/11/18 13:10:17 ID:???
すいません、書き直します・・・。;は全角です。

s/";/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;

これは"が";に変換されてるデータ($_)から";を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての";が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの";のみです。
最初にいきなりs/";/"/g;などとやらず、fontタグの";だけを"に戻す方法すにはどの様にすれば良いでしょうか?
787nobodyさん:04/11/18 13:13:42 ID:???
馬鹿ですいません・・・。&quot;は全角で書きましたが本来は半角です。

s/&quot;/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;

これは"が&quot;に変換されてるデータ($_)から&quot;を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての&quot;が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの&quot;のみです。
最初にいきなりs/&quot;/"/g;などとやらず、fontタグの&quot;だけを"に戻す方法すにはどの様にすれば良いでしょうか?
788nobodyさん:04/11/18 13:14:13 ID:???
stylesheetが使われる可能性も考えろよ
789nobodyさん:04/11/18 13:32:05 ID:???
そもそもなんでFONTタグ内の " が &quot; に変換されとるの?
790nobodyさん:04/11/18 13:38:18 ID:???
>>789
説明不足ですいません。
BBSのログで、保存する時点ではタグに関わる記号&;<>は全てデコードしてあります。
で、読み出して表示する際に許可したタグのみ有効にする仕組みになってて、fontタグのみ有効にしてます。
791nobodyさん:04/11/18 13:45:00 ID:???
>>790
× &;<>
○ &"<>
でした・・・。
792789:04/11/18 13:54:44 ID:???
だったら、<> の2種類だけをエンティティーコードに変換すりゃええやん。
793nobodyさん:04/11/18 14:08:47 ID:???
s!(?<=<font)([^>]+)!my $s = $1 ; $s =~ s/&quot;/\"/g ; $s!ieg ;

こうかなあ。
794nobodyさん:04/11/18 15:02:37 ID:???
>>793
うまいこといかないっす・・
795nobodyさん:04/11/18 16:41:16 ID:???
すいません。色々悩んだ挙句、ログに記録する時点でダブルクォートは&quot;に変換しない
って事にしました。
796nobodyさん:04/11/18 17:13:54 ID:???
(´д`)
797nobodyさん:04/11/18 17:54:10 ID:???
&hearts; → そのまま。

&hiroyuki; → &amp;hiroyuki;

みたいに実態参照が定義されていない場合のみ & をエスケープしようと思ったら、
定義されているやつを全部リストとかで持ってないとダメなんだろうか。

使えるモジュールとかありますか?
798nobodyさん:04/11/18 18:15:24 ID:???
>>797
HTML::Entities

decode_entitiesに食わせて変化するか(定義されていれば変化する)

または、

%entity2charハッシュのキーにあれば定義されている

といったあたりでいけると思う。
799nobodyさん:04/11/18 18:48:22 ID:???
>>794
なんで>>793のでうまくいかないんだ?
俺っちも考えたが、793と同じような形になったし。
もしかしてネタ?
800nobodyさん:04/11/18 19:09:44 ID:???
>>798
ありがとう。うまくいってるようです。
でも借りてるサーバーには HTML:: が無いんだけど、まあコピーして置いとけば動くだろう。
801nobodyさん:04/11/18 19:59:02 ID:???
>>799
すいません。<>も&lt;&gtに変換された状態なのを説明してませんでした。
<>のままの状態だと>>793さんので出来ました。
802nobodyさん:04/11/18 21:45:59 ID:???
>>801
s!&lt;(/?font\b.*?)&gt;! (my $s=$1) =~ s/&quot;/\x22/g; "<$s>" !egis;
ではどう?
<font **>と</font>の両方を < > も含めて戻せると思うんだけど。
803nobodyさん:04/11/18 21:57:39 ID:???
>>802
ばっちり復元出来ました!すげー!
FONTタグで囲まれたデータ部分の&lt;&gt;&quot;はそのままで、
タグの記述部分だけちゃんと変換されてます。
ありがとうございました!
804nobodyさん:04/11/19 08:46:55 ID:???
超初心者な質問です。

telnetモジュールを使用して、リモートコンピュータに接続してから、
・screen起動
・外部プログラム起動
・CTRL-A d で[detached]
という操作をperlで実行したいのです。

色々サイトを回って調べて、telnet接続まではできたのですが、
上記手順の「CTRL-A d で[detached]」で行き詰っております。
CTRL-Aという操作をperlのtelnetモジュールで行うには、
どういう記述をすればよいのでしょうか?
805804:04/11/19 10:44:06 ID:???
説明が悪かった気がします。

何でscreenを使用したいかというと、
webブラウザ上で、サーバのプログラムを起動させ、常駐させたいからです。
通常のデーモン(inetdなど)であれば、わざわざscreenなど使わなくても
telnetモジュールで接続させ、コマンドを実行させればよいのですが
今回起動させたいプログラムは、バックグラウンドで動作してくれないため、
常にコンソールを開いておく必要があるのです。
なので、仮想的に常駐させるためにscreenを選んだというわけです。
当方、UNIX系OSに触れて1週間足らずなので、
「screenなんて使わなくても この方法でいいだろバカ」
という意見なども助かります。
806nobodyさん:04/11/19 10:59:05 ID:n9OG7mgX
swfからcgiをたたいて、画像の縦横サイズを変更し、
swfに表示するということをやっております。
画像は正しくロードできるのですが、ファイルサイズが取得できず、
ローディング表示ができなくて困っています。

詳しく説明します。
まずswf内で
_root.[object].loadMovie("hoge.cgi", "POST");
を使い、ロードの要求をします。
するとhoge.cgiでimageMagickというモジュールを使い、
縦横サイズを変更します。ここでPOST送信されている
stageWとstageHとranはswfから送られてくる変数です。
807806:04/11/19 10:59:50 ID:n9OG7mgX
つづきです。
---
use Image::Magick;
if($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}else {
$query = $ENV{'QUERY_STRING'};
}
foreach $pair (split(/&/, $query)){
my ($key, $value)=split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$key}=$value;
}

$i = Image::Magick->new;
$img="img/cover$form{'ran'}.jpg";
$i->Read($img);
($width, $height)= $i->Get('width', 'height');
if($width/$height>=$form{'stageW'} / $form{'stageH'}){
$newwidth =$width*$form{'stageH'}/$height;
$i = $i->Transform(geometry=>$newwidth);
}else{
$newwidth= $form{'stageW'};
$i = $i->Transform(geometry=>$newwidth);
}
print "Content-type: image/jpeg\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
undef $i;
exit;
---
808806:04/11/19 11:00:52 ID:n9OG7mgX
つづき2です。
--
そして戻ってくる画像データをswf内にて
getBytesLoaded()やgetBytesTotal()で調べています。
するとロードされたバイト数はしっかり取得できているのに
対し、総ファイルサイズはロード中はずっと0になっていて、
ロードが完了すると総ファイルサイズが表示されます。

OS FreeBSD
perl 5.8.x
Flash ver.6.0

どうか、よろしくお願いいたします。
809nobodyさん:04/11/19 12:30:01 ID:???
ヘッダじゃない? Content-Length
810nobodyさん:04/11/19 13:49:59 ID:???
$alldataが空じゃなく、$ENV{'CONTENT_LENGTH'}が空の状態で

read STDIN,$alldata,$ENV{'CONTENT_LENGTH'};

を実行したら$alldataの中身は変わってませんでした。
原因はどこですか?
811810:04/11/19 14:33:50 ID:???
すいません、ちゃんと空でした。
812nobodyさん:04/11/19 15:43:47 ID:???
これを設置してみたんですが、発言がややアイコンの右下に表示されるのが嫌です。
真横に表示させることはできないのでしょうか?
ttp://spiral.lib.net/cgi/mc/
813nobodyさん:04/11/19 15:47:41 ID:???
右下じゃなくて右上でした
814nobodyさん:04/11/19 16:12:25 ID:???
>>805 >/dev/null 2>&1
他にもnohupとか。

>>812
作った人に言え
815nobodyさん:04/11/19 16:17:03 ID:???
>>814
無理なんです今は・・
816nobodyさん:04/11/19 19:45:10 ID:???
perlで変数を()でくくって宣言しているのをしばしば見かけるのですが、
($tmp) = "hoge";
とか。
これは何の意味があるんでしょう?
817nobodyさん:04/11/19 20:16:23 ID:???
>>816
その例ではまったく無意味かと
($foo, $bar) = @_;
とかやると
$foo = $_[0];
$bar = $_[1];
の効果が得られる。
多分書いた人の癖じゃないか?
818nobodyさん:04/11/19 20:26:47 ID:???
>>817
レスありがとうございます。
某レスQのCGIにしばしば出現てて悩みました。()の中はスカラ変数が一つだけなんです。
実際は右辺はサブルーチンだったりするんですが、配列は戻ってこない。
($ret) = &getMessage("$filename$EXT");#戻り値は0か1
とか。
悩むのやめときます。
819nobodyさん:04/11/19 22:09:11 ID:???
ていうかレスキューなんか参考にするのやめれ
820804:04/11/19 22:47:11 ID:???
>>814

レスありがとうございます。
/dev/nullについて調べて、実際に動かしてみました。
要するに出力をポイっとやるわけですよね?

末尾の2>&1は何でしょうか?色んなサイト調べてみましたが、
nullの動作に触れてるところばかりHITしたらしく。。orz

nohupもためさせてもらいました。
動作的にはscreenと似ているので、助かります。
しかし、nohupすると、私のUNKサバではかなり重くなってしまいます。。

出力を書き込んでいるからでしょうか?

あと、nohupや &での開始だと、telnetモジュールを切断させた後
ジョブをフォアグラウンドに復帰させる方法が見当つきません。。

我侭ばかりですいません。よろしくお願いします。



821804:04/11/19 22:50:33 ID:???
論点がPerlからズレてきているようなので、質問を訂正します。

割り込みキー入力(今回の場合はCTRL+A)を
perlからコンピュータに送信する方法はあるのでしょうか?

板汚し申し訳ないorz
822nobodyさん:04/11/19 23:02:34 ID:???
>>818
そうやっておくと、もし2つ以上の返り値があった場合に
最初の値だけ取って、残りを捨てるということができる。
安全策ってわけだな。
あまり誉められたものではないと思うけど。

823nobodyさん:04/11/19 23:08:43 ID:???
>>821
試してないけど\x01送るんじゃ駄目?
824nobodyさん:04/11/19 23:09:06 ID:???
だからさ、2つ以上の返り値があるのかどうかわかんなくなっちゃうでしょ
825823:04/11/19 23:20:43 ID:???
>>821
おっと2>&1についてもついでに答えるんだった・・・
「標準エラー出力を標準出力に纏める」という意味。

nohupが重くなる理由はmanに書いてあったぞ
> スケジューリング優先度は 5 増やされるので、
> 実行の割り当て時間はやや小さくなる。
そんなに大きく変わるかは知らないが
826804:04/11/20 00:21:15 ID:???
>>823,825

レスありがとうございます。
大変貴重な情報をいただきました。
若干板違いな質問にも丁寧に答えてくださって、感謝です。
827nobodyさん:04/11/20 04:13:04 ID:???
質問です.
ある, 改行コードがCR+LFのテキストファイルがアップロードされた際, 改行コードをLFに
変換し, そのファイルを保存するcgiを書きたいのですが, 以下のように書いてみましたがうまくいきません.
LFに変換されずCR+LFのまま保存されてしまいます.
#!/usr/bin/perl
use CGI;
$query = new CGI;
Content-type: text/html\n\n

$fn = $query->param('filename');
$type = $query->uploadInfo($fn)->{'Content-Type'};

if($type =~ /^text\//){
  open(FILE,">test.txt");
  while (<$fn>) {
    $temp = $_;
    $temp =~ s/\r\n/\n/;
    chomp($temp);
    print FILE "$temp\n";
  }
}
どのようにしたらいいでしょうか?宜しくお願いします.
828nobodyさん:04/11/20 06:01:26 ID:???
>>827
そもそもそれ文法エラーだろ
829nobodyさん:04/11/20 08:04:12 ID:???
>>806
>>809のContent-Lengthは、レスポンスの方だと思う。

print "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
で、$filesizeにjpegデータのサイズを入れておく。
(一旦テンポラリファイルを作らないとだめかも知れないけど)
830nobodyさん:04/11/20 08:31:32 ID:???
windowsなら\nをさらに\r\nに直してくれる自動サービス付き
バイナリモード binmode を参考に
831nobodyさん:04/11/20 11:15:04 ID:???
>>822
contextによって返す値がかわる関数もあるし意味もなくカッコつける癖は
まねしない方がいいと思われ
832nobodyさん:04/11/21 07:32:38 ID:???
>>821
screen使った事ないけど、man読んでみた限りでは、
-d -Dでいけるんじゃ?

それから、うに板の方が適切な質問じゃないかと。
833nobodyさん:04/11/21 12:49:54 ID:???
for(@list) {
...
}

の中で現在の行番号を取得する良い方法はありませんか?
$_ == $list[$hoge] になるような $hoge が知りたいのですが……。
カウンタ変数を新たに作るしかないんでしょうか。
834806:04/11/21 13:04:12 ID:Ewup0dSn
>829さん
お力添え、ありがとうございます。
早速やってみます!!
835nobodyさん:04/11/21 13:14:54 ID:???
>>833
for(0..$#list){
処理
}
836nobodyさん:04/11/21 13:23:09 ID:???
>>835
希望の処理ができました。
ありがとうございます。
837nobodyさん:04/11/21 18:47:52 ID:8gMC3V6h
perl+mysqlでカートを作りました。
一応入力チェック(サニタイジング)として、like演算子のワイルドカードである
「%」と「_」があったら削除してます。

よく考えたら「_」はメールアドレスとして普通に使われてる可能性があるんですよね。
そこで質問ですが、_これってlike演算子以外では安全ですよね?

DBIのprepare時にプレースホルダを使用してるのですが、みなさんは_対策とかしてますか?

838nobodyさん:04/11/21 18:54:50 ID:???
>>837
データを新規レコードとして挿入するだけなら問題ない。
まあlikeなんて挿入で使わないんだから気にするなよ。
839nobodyさん:04/11/21 19:01:17 ID:ubTrO76H
@user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'});
if ($user_agent[0] eq 'DoCoMo') { $URL=$iURL; }
elsif ($user_agent[0] eq 'J-PHONE') { $URL=$vURL; }
elsif($user_agent[0] eq 'UP.Browser' || $user_agent[0] =~ /^KDDI/) { $URL=$eURL; }
else { $URL=$pURL; }
print "Location:$URL\n\n";
print "Content-type: text/html\n\n";
print "<HTML><HEAD><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"10;URL=$URL\"><TITLE>auto jump</TITLE></HEAD><BODY><A HREF=\"$URL\">自動でジャンプしない場合はこちらから</A></BODY></HTML>";
exit;

というのでHPを携帯なら携帯で察知して携帯用HPに
飛ばすようにしているのですが
話題の京ぽんを携帯用に飛ばしたいのですが出来ません。
ご教授ください。
840nobodyさん:04/11/21 19:33:12 ID:???
>>837
プレースホルダつかってるなら勝手にエスケープしてくれるんじゃないの?
841nobodyさん:04/11/21 19:48:30 ID:w/cY/u9z
urlだけを抜き出したいんですがうまくいきません。

@hoge=$url=~m/http:\/\/[-_.!~*'\[\]\(\)a-zA-Z0-9;\/?:\@&=+\$,%#]+/gi;


<a href="http://gaerge">fgagear</a>
とかを取得すると、
http://gaerge">fgagear</a>
となってしまいます。
どこをどう直せばいいんでしょうか。
842nobodyさん:04/11/21 19:54:09 ID:???
>>841
urlのマッチングなんて探せばすぐ見つかるだろが
843nobodyさん:04/11/21 20:07:53 ID:w/cY/u9z
どこが間違ってますか?
正規表現メモを参考にしたんですが。
844nobodyさん:04/11/21 20:55:58 ID:???
>>839
AirWiki: AirH"PHONE/AH-K3001V/FAQ
http://d.memn0ck.com/index.cgi?AirH%22PHONE%2FAH-K3001V%2FFAQ#i15

>>841
my $url = qq{<a href="http://gaerge">fgagear</a>};
my @hoge = $url =~ m/http:\/\/[-_.!~*'\[\]\(\)a-zA-Z0-9;\/?:\@&=+\$,%#]+/gi;
print "@hoge";

問題なさそうだけど。
845nobodyさん:04/11/21 20:57:55 ID:???
>>841
コピペして @hoge を print してみたけど
http://gaergeになったよ
846841:04/11/21 21:33:14 ID:???
確認してくれた方ありがとうございます。
正規表現事態は間違ってないみたいですね。
しかしなんでだろう・・
847nobodyさん:04/11/21 22:26:23 ID:hibhMAES
今使ってるレンタルサーバーはcgiを別サーバーに置くようになっています。
cgiサーバーからhtmlサーバー内のログファイルを読み込むには、別サーバなので、
ソケットを使わなければいけないということで、とりあえずトップページを表示させようと、
次のソケットスクリプトを実行してみました。

  $host = "www.xxxxxxxxxxx.com";
$page = "/";
$line = "";
$addr = (gethostbyname($host))[4];
$name1 = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name1);
binmode(S);
select(S);
$| = 1;
select(stdout);
print S "GET $page HTTP/1.0\r\n\r\n";
while (<S>) { $line .= $_; }
close(S);
print $line;

ページの指定を$page = "/index.html";にするとNot Found
$page = "/";にするとForbiddenという反応が返ってきてうまくいきません。

これはただ、パスの指定が悪いだけなのか、やはりサーバーの設定で
ソケットが使えないようになっていて、cgiサーバーからhtmlサーバーの
ファイルを読み込むのはあきらめなければならないということでしょうか?
848nobodyさん:04/11/21 22:46:59 ID:???
>>847
ソケットが使えないようになってるならそもそも
返事すらもらえないはずなので、パスじゃねーの?
849nobodyさん:04/11/21 22:50:12 ID:???
最初にすべきことは使えるかどうかの確認じゃないかと
850nobodyさん:04/11/21 22:51:11 ID:???
>>847
パスが合ってる筈なのにって場合は、リクエストにHOSTも入れた方がいいかも知れんね。
851839:04/11/21 22:51:26 ID:ubTrO76H
京ぽんのuser agentをいろいろ設定しましたが
どれもだめです。
そもそもの書き方を間違えているのでしょうか?
852nobodyさん:04/11/21 22:52:41 ID:???
>>847
print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
853nobodyさん:04/11/21 23:48:01 ID:???
>>851
京ぽんつーのが何なのか知らないが、elseの中でUA名を表示させてみれば
どういうUA名で分岐すればいいのか分かるのでは?
854nobodyさん:04/11/22 00:59:03 ID:???
perlの掲示板に検索機能をつけようと思ってるのですが、ログが1投稿毎に別ファイルにしてあります。
いちいち1ファイルごとに読み込んでマッチ処理の繰り返しでは負荷的にも問題あるので、
データディレクトリでgrepかけて、該当したファイルのみ読み込みたいのですが、
perlでやるにはどうすればよいでしょう?
855nobodyさん:04/11/22 01:10:34 ID:???
数値Aと数値Bを比較して大きい方を変数に代入したい場合、
最もシンプルな記述はどんな感じになりますか?
856nobodyさん:04/11/22 01:16:03 ID:???
>>855
?
857nobodyさん:04/11/22 01:18:25 ID:???
$hensu = $a > $b ? $a : $b;
858nobodyさん:04/11/22 01:22:50 ID:???
>>854

>>1

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
859nobodyさん:04/11/22 01:25:58 ID:???
>>854
open(IN,"grep '$keyword' file|");#実際にgrepを実行する
って手があるが、鯖によってはgrepはダメかもしれない。
ファイル名の検索ならFile::findで一発なんだが・・・。
860855:04/11/22 01:31:38 ID:???
>856
ifで書くと長いので。
>857
多謝。
861nobodyさん:04/11/22 01:38:42 ID:???
>>860
大きなお世話かもしれんが、最初のうちはif使ってたほうが良いぞ
862nobodyさん:04/11/22 01:49:13 ID:???
>>859
ありがとうございます。
grepからの出力を拾う方向で実装してみます。
863nobodyさん:04/11/22 02:20:18 ID:???
grep で子プロセス1個作るのも結構な負荷だぞ。
ファイルの数が多ければ grep の方が軽いが、
少ないなら perl の中でループ回す方が鯖にやさしい。
てのはコーディングというより負荷軽減スレにふさわしい話題だが。
864856:04/11/22 02:58:22 ID:???
>>860
最もシンプルに答えただけなんだが、理解できなかったみたいだな。
865nobodyさん:04/11/22 03:28:27 ID:???
理解してるみたいだけど…?
866nobodyさん:04/11/22 04:23:59 ID:???
"?"を使えって事だろ レスがシンプルなだけで要望には応えてないが
867nobodyさん:04/11/22 04:47:42 ID:???
あのレスだけで理解できたらここで質問なんぞしない希ガス
868nobodyさん:04/11/22 05:42:53 ID:/gdSyseW
>>847
>>852

>print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";

hostを入れたら違う反応が返ってきて次のメッセージが表示されました。

HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html

ただ、期待したトップページは相変わらず表示されませんでした。
このメッセージからソケットが使えるって判断できるでしょうか?
869nobodyさん:04/11/22 06:30:29 ID:/gdSyseW
>>868
トップページにはフレームを使っているので、表示されないみたいです。
取得したいログファイルを指定したら、見事に表示されたので、ソケットは使えることは確認できました。

ただ、次の応答メッセージが頭にくっついてくるので、これを取得しないようにすることはできるでしょうか?

HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
870nobodyさん:04/11/22 06:48:45 ID:???
>>854
>>859の方法だと、システムシェルを利用するからセキュリティに注意。
871nobodyさん:04/11/22 07:06:38 ID:???
>>869
ヘッダの最後は
CRLFCRLF(最低限LFLF)
になってるので、取得した後、そこまでカットすれば問題ないっしょ。
872nobodyさん:04/11/22 07:20:47 ID:/gdSyseW
>>871
取得した後で加工してカットするということですか?できれば、取得時にカットしたいのですが、
不可能であれば、最終手段はそうするしかないですね。
873nobodyさん:04/11/22 07:48:05 ID:???
>>872
<>で読むなら、空行が出るまで別の変数に入れておくとか、空読みするとか。
あと、socketとconnectのエラー処理をした方がいいよ。
874nobodyさん:04/11/22 08:44:18 ID:???
LWP使ったほうが楽じゃないかと...
875nobodyさん:04/11/22 10:28:03 ID:/gdSyseW
>print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";

素人考えで申し訳ないですが、GETのところでオプションなどをつけてその応答メッセージを
出さないようにすることってできないものですかね?

  HTTP/1.1 200 OK 〜〜text/html 取得したログファイルの内容〜

取得した内容は↑のようになっていて、応答メッセージと取得したログの間は半角スペースと
なっています。

応答メッセージを取得時にカットできない場合、取得後にカットするわけですが、シンプルに
カットするには、どういう方法があるでしょうか?perl初心者なもので、たびたびすみません。
876nobodyさん:04/11/22 11:44:54 ID:???
>>875
チミはx68userのページ見て勉強してから出直すといい。
http://x68000.q-e-d.net/~68user/

別の解法: 他の人も言っているがLWPというチミがやりたいことをそのまま提供している
モジュールがあるので、そっちを使うと簡単。
「原理を理解しなくても目的を達成できりゃいい」という事ならばこっちをすすめる。
877nobodyさん:04/11/22 11:48:07 ID:???
>>859
初心者にセキュリティホールのある方法教えるな。クズ。
878806:04/11/22 11:50:53 ID:dylfkRdn
>829さん
print "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
と書いてみました。swf側でファイルサイズを取得できて大喜びだったんですが、
jpg画像が途中から壊れて表示されるようになってしまいました。

>(一旦テンポラリファイルを作らないとだめかも知れないけど)

すみません。調べてみたのですが、ちょっと意味が。。。
879nobodyさん:04/11/22 12:00:44 ID:???
>>878
もしContent-lengthをつけただけでそうなったのなら、
$fileseizeの値がおかしい可能性が高いな。
880806:04/11/22 13:03:45 ID:dylfkRdn
>879さん
レス、ありがとうございます!

print "Content-type: image/jpeg\n";
print "Content-length: 100000\n\n";

とかやってみたのですが、やはり画像が壊れて表示されます。
(こんなことしてはいけないのかな。。。)
881806:04/11/22 13:14:51 ID:dylfkRdn
>879さん
できました!!
やはり値がうまく入っていないだけでした。

ただ
($width, $height, $filesize)= $i->Get('width', 'height', 'filesize');
と値をとっただけなのでリサイズ前のファイルサイズがとれているだけなのですが。
テンポラリファイルとは一度このファイルをtmp.jpgとかにしてそのファイルサイズを
を測らなくてはならないという意味だったのでしょうか?
882nobodyさん:04/11/22 14:04:38 ID:/gdSyseW
>>876

http://x68000.q-e-d.net/~68user/
x68userのページで、「HTTP クライアントを作ってみよう」という記事を見ましたが、
どうもヘッダを除いてボディだけを出力するというのはできなさそうに感じました。

LWPについてはx68userのページで一通り見ましたが、掲載されていないように
見受けられるので、いろいろ検索してそれらしい解説ページを見ましたが、
使用方法について内容の濃いページを見つけられませんでした。

一般的にどのサーバーにもLWPのモジュールが入っているのか?、当方のレンタル
サーバーでLWPは使えるのか?といった辺りからよくわかりません。
(見当違いなことを言っていたらごめんなさい。)

結局、ソケットでヘッダー(応答メッセージ)も含めてファイルを取得し、文字列操作
して、わざわざいらない部分を取り除かなければならないことになりそうです。

同じサーバーならopenしてファイルを参照できるのに、他サーバーのファイルを
参照するだけで、えらく苦労しています。
883nobodyさん:04/11/22 14:15:38 ID:???
>>882
ボディだけ欲しいならHTTP/0.9で取れるが、HTTP/0.9はHostを送れないのでチミのホストでは駄目。

でも、ヘッダー読み飛ばすのなんか楽勝でしょ。
http://x68000.q-e-d.net/~68user/net/http-2.htmlだと38-41行
884nobodyさん:04/11/22 14:30:16 ID:C0NQJmHQ
サーバーに新しいメールアカウント(例:abc)を作り
そこに添付されてきた画像ファイルをCGIで読み込み
メインアカウント(例:main)内にあるフォルダに保存させています。

読み込むCGIをgetmail.cgiとするとこれを手動で実行すると
問題なく動作するのですが
crontabを用いて自動実行させると添付ファイルの保存がされません。
crontabによりgetmail.cgiは動作しているものの
保存のみがされないようです。

0-59/2 * * * * cd /home/sites/www.xxx.jp/web && /home/sites/www.xxx.jp/web/mailget.cgi
で実行させています。
環境はRed Hat Linux 7.3
Apache 1.3.27
Sendmail 8.11.6
です。ちなみに、別のレンタルサーバー(FreeBSD)では動作していました。
原因がどこにあるのかご教授ください。
885nobodyさん:04/11/22 14:31:03 ID:???
>同じサーバーならopenしてファイルを参照できるのに、他サーバーのファイルを
>参照するだけで、えらく苦労しています。

いやそれはそういうモノだ
Perlコーディング以前の「コンピュータが動くしくみ」とかいう次元の問題として
886nobodyさん:04/11/22 14:54:17 ID:/gdSyseW
>>882
ひとまず、ご指摘の箇所を適用してヘッダーを読み飛ばし、ボディだけ抽出できました。
ありがとうございました。
887nobodyさん:04/11/22 15:54:59 ID:???
>>877
じゃあ初心者にセキュリティホールの無いやり方を教えてみろクズ。
何も提案できない奴が偉そうな事抜かすな。
888nobodyさん:04/11/22 15:58:18 ID:???
>>884
実行ユーザ名・使用するファイルのパミッション・使用する環境変数等々
チェックすることはいっぱいあるよ。
んでも、エラーを適切に処理してればどこでコケたか分かるでしょ?

>>887
初心者自体がセキュリティフォールです。はい。
889nobodyさん:04/11/22 15:59:51 ID:???
ふぉーる
890nobodyさん:04/11/22 16:04:25 ID:C0NQJmHQ
>>884です。
>>888さん、ありがとうございます。
色々チェックしましたがイマイチ解りません。
ブラウザから実行した場合は正常なのですが
crontabで自動実行した場合のみ保存がなされません。
調べたところ、添付ファイルの取り込みも問題ないようで
問題なのはopenして書き込む部分が実行されていないと言うことです。
ファイルの所有者とグループが違うのかと思ったのですが
これらは変更したりできるのでしょうか?
891nobodyさん:04/11/22 16:06:56 ID:???
>>888
検索方法の話であって初心者云々関係ねーし。おまけにフォールだし。
892nobodyさん:04/11/22 16:12:24 ID:???
子供達を責めないで(by デスラー)を思い出すな。
「私は子供に生まれないで良かったと、胸をなでおろしています!」っての。
>>888は初心者に生まれないで良かった胸をなでおろしてるんだろうな。
893nobodyさん:04/11/22 16:14:31 ID:???
次スレ案
【初心者は】Perlコーディング初心者質問スレ Part 39【セキュリティフォール】
894nobodyさん:04/11/22 16:15:46 ID:???
#! c:/perl/bin/perl

print "Content-type: text/plain\n\n";
print "Hello Perl !";

今日からPerlをはじめまして、本どうりにこれを打ち込んで、表示さしてみると
ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと
メモ張にHello Pealと表示されます、本ではブラウザ上に表示されると
なっているのですが、違うCGIをためしてみるとちゃんとブラウザに表示されます。
本の付属のサンプルでやってもこれだけは、安心できる発信もとからの・・・
ファイルを開く 保存・・がでてブラウザに表示されません。これだけ
なぜかこうなります。
無視して、これは飛ばして次のCGIからやったほうがいいのでしょうか?
原因がわかるかたぜひおしえてください。
895nobodyさん:04/11/22 16:16:36 ID:???
>>887
とりあえず、$keywordをサニタイズするようにぐらい書いておけ
896nobodyさん:04/11/22 16:30:35 ID:???
うーん、grepのシェル起動はやっぱマズイ気がするな。
$keywordが実行されないようにしないと。
バッククォートは確実に殺しとけ。
897nobodyさん:04/11/22 16:36:59 ID:???
そもそもgrep使っても1ファイルずつひらいて舐めるのは
かわらないのでperlの中だけで完結した場合に比べて
劇的に処理が軽くなるとはとは思えないのだが。
898888:04/11/22 16:58:04 ID:???
(((η)
  | |       (っ))) ヒャッホー! オレ様がスレタイに!!
  | |       //
  |∧_∧ // >>890
 (´∀`*//   cgiの実行ユーザ名でcrontab -eを実行してないのでは?
  l     /    その場合ならパーミッション関係でエラーがでて
           保存できないこともありうる。原因を探らないと。
899nobodyさん:04/11/22 17:45:56 ID:???
open() 関数の戻り値が false だったら $! を表示させてみる、とかな
900nobodyさん:04/11/22 17:51:31 ID:TZImgkmI
sendmail時のことで質問です。

subjectはちゃんとmimeエンコードしてるのですがfromに日本語を埋め込む時にも
mimeエンコードする必要がありますか?

JISでそのまま書いても駄目ですよね?

from: "送り先の人間の名前" <[email protected]>

みたいになってますがどうすれば大方のメールソフトで問題なく動作するでしょうか?
901nobodyさん:04/11/22 18:11:55 ID:???
>>887
クズのくせに威勢がいいな。
特別に教えてやろう安全なパイプの使い方だ。二度と初心者に穴コード教えるなよ。ヘッポコ。

$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('grep', $keyword, 'file') || die 'grep';
}

>>900
MIMEエンコードすりゃいいだけだろ。何が聞きたいんだ?
902nobodyさん:04/11/22 18:18:31 ID:???
>>894
.cgiファイル?
まあどっちにしろ
__END__を忘れてないか
あとどんな本だ?
903nobodyさん:04/11/22 18:19:47 ID:???
>>894
ここはコーディングの質問スレなので、それ以前の方はお引き取りください。
904nobodyさん:04/11/22 19:16:13 ID:4/apYG7/
>>901
そんなんで虚勢張られてもなぁ・・・
空しくならない?
905nobodyさん:04/11/22 19:19:21 ID:???
後出しじゃんけん キタ━━━━(゚∀゚)━━━━ッ!!
906nobodyさん:04/11/22 19:34:33 ID:???
っていうか悪意のある入力値のサニタイズとは関係ない気が。
907nobodyさん:04/11/22 20:17:07 ID:???
外野だけど$keyword = quotemeta($keyword)じゃだめ?
908nobodyさん:04/11/23 01:17:07 ID:???
バッククォートとシングルクォートだけで良いと思うけど。
()もマズイか?
いずれにせよ、パイプの使い方云々って話じゃなくて。
909nobodyさん:04/11/23 01:23:12 ID:nMfYIywn
あのね、僕ちゃん達、何のためにサニタイズするの?
shが余計な解釈して、コマンド実行されると困るからでしょ。
>>901の方法でパイプ使えばshは経由しないから、安全なの。
910nobodyさん:04/11/23 02:23:51 ID:7PvclRNn
>>901乙であります(pgr
911nobodyさん:04/11/23 02:54:05 ID:???
まぁまぁ、まぁまあ、

マーライオン       , ―‐ 、 
             /r‐' ,ェェr‐..、
               | l |   ____Y)........
               | l ヽ  ┴‐┬'''''''''' ::::.........
               | l  l `ー‐1      ::::::::.......
             7レヘ!    /        ::::::::::::.....
             l |. |    /           :.:.:.:::::...
             /7ーー7777!             :.:.:.:::::....
            T--l⌒ヽ{ l               :.:.:.:.::::::...
               |vv'レ⌒!'ー!                :.:.:.:.::::::...
              |vv'ヽソー1                 :.:.:.:.::::::.
           _ヽVVVー7__               :.:.:.:.:::::..
         ,〜〜〜〜〜〜〜ヽ  ヽ、             :.:.:.:.:.:..::..
        ∠二二二二⌒二二二二二二ユ            :.:.:.:.:.::::::...
912nobodyさん:04/11/23 07:24:42 ID:???
>>881
出力するデータのサイズを出力しないとだめだよー。

>>894
・IEを投げ捨てて他のブラウザを使う。
・おまじないとして最後に"/"を付ける。
・Windows XP SP2にして、IEをレスポンスヘッダに従うように設定する(できるらしい)。
・HTMLで出力する。
原因はIEの仕様。
913nobodyさん:04/11/23 08:01:40 ID:???
894は拡張子がcglとかなんだってば
914nobodyさん:04/11/23 09:12:03 ID:???
>>913
> ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと
> メモ張にHello Pealと表示されます、
これから察するに、CGIとして動作していると思うが。
915nobodyさん:04/11/23 09:31:30 ID:???
>>894
CGIとして動作しているのはたしかだが
ダイアログを出したくないんだったらこうしなされ。

x print "Content-type: text/plain\n\n";
o print "Content-type: text/html\n\n";
916nobodyさん:04/11/23 10:16:50 ID:???
>>909
ポカーン。

$keyword に

; rm -rf *;

って入れると実行されちゃいますが?
死ねよキチガイ。
917nobodyさん:04/11/23 10:25:43 ID:???
みんな冷静になって>>894を読んでみろよ。
print "Hello Perl !";
なのに「Hello Peal」って表示されるんだぞ。
Perl自体のバグでは?
918nobodyさん:04/11/23 11:00:08 ID:???
>>916
>>909ではないですが、それが実行されるOSを教えてくれませんか。
FreeBSDで確認できなかったので。

それから、一応貼っておきますね。

CGIプログラミングとセキュリティ
http://www.ansi.co.jp/tech/cgi/security/programming.html
> また、以下のように引数が2個以上の exec と組み合わせるとメタキャラクタの解釈が行われない。
> open GREP, "-|" or exec "/usr/bin/grep", "-e", $CGI{str}, "/path/to/data/file" or die;

perlsec - Perl security
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsec.html
> open(FOO,"echo $arg|"); # Not OK, but...
> open(FOO,"-|")
> or exec 'echo', $arg; # OK

# 今のperlsecでは、この方法もAlso not OKにされています。
919nobodyさん:04/11/23 11:08:09 ID:nMfYIywn
>>916
顔真っ赤にして、嘘付くなよ。ヘッポコ

実験すれば実行されないことは簡単にばれちゃうのに、事実を捻じ曲げてまで絡んでくるとは
そんなに馬鹿にされたのが悔しいのかな?
でも、実際馬鹿なんだからしょうがない。親を恨んであきらめることだ。

$keyword=';rm -f *';
$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('/bin/echo', $keyword, 'file') || die 'grep';
}
while(<IN>) {
print $_;
}
920nobodyさん:04/11/23 11:11:35 ID:???
>>919

grepに失敗するだけでrm -rf は実行されるぞ低能
921nobodyさん:04/11/23 11:13:10 ID:???
あとrm -rf *;

だ。;が抜けてる。*fileだったらそんなファイルなけりゃ何も削除されん罠
922nobodyさん:04/11/23 11:27:41 ID:nMfYIywn
>>920
やってから言えよ。ヘッポコ。行末の;を入れたって実行されねーよ。
破壊的な馬鹿だな。
923nobodyさん:04/11/23 12:00:00 ID:???
気になったから試してみた

"test.pl" [New File] 12 lines, 213 characters [E]
[***@***** test]$ chmod +x test.pl
[***@***** test]$ ls
aaaa ahie aisjrioe iruiet test.pl*
[***@***** test]$ ./test.pl
;rm -f *; file
[***@***** test]$ ls
aaaa ahie aisjrioe iruiet test.pl*

コードは>>919に;いれた奴
924nobodyさん:04/11/23 12:24:02 ID:???
>>916は逃亡か?
perlは奴のようなヘッポコでもそれなりのコードをでっち上げる事が出来てしまうので、
「俺ってできるじゃん」と勘違いしてしまったのだろう。

勘違いして玉砕してしまった>>916に「伝説のヘッポコ」のコテを贈ろう。次からはこのコテで出て来い。ゲラゲラ
925伝説のヘッポコ:04/11/23 12:38:20 ID:???
         │ト、l、 /´, '`⌒'´ `ヽ: : .
          ヾヽ!lV/ / ,/ /  ,' ハ、: .
       ,ィニ≧ゝレ' / /  ,./   / , ハ : : .
      く<-‐7´ _」] l l/_,∠/   / / / い : : .
        ̄ノ/: :f r'l l /レ'/、_/‐ト'、/l| li l : : : : .
      . : {ハ : :|{(l|y==ミ   _ノ、/ソリ ll | : : : : :
      : : : :ヽヽ: :|、lハl、゙      ⌒ヾlノリ ll l : : : : : :
      : : : : : : : : V\ヽ、 `ー  ゛ノルんイリノ : : : : : :
      : : : : : : : : : ,.--、_ハ`−r=ニ--、′ノ. : : : : : : :
      : : : : : : : : /  /-ョロ'ヲ´   i l : : : : : : : : : :
      : : : : : : : 〈  ,ハフ'兀「     ! } : : : : : : : : :
      : : : : : : : : ヽ,   ト{‐lハ. ヽ ' ノ : : : : : : : :
926nobodyさん:04/11/23 13:14:57 ID:7PvclRNn
どうせここにいる連中は俺より低脳なんだから、
黙って頭下げて俺の靴でもなめてりゃいいんだよカスどもが(pgr
927nobodyさん:04/11/23 14:23:34 ID:???
↑ 締め付けチカンビーム発射!!
928nobodyさん:04/11/23 14:24:02 ID:nMfYIywn
その中で最下層に位置してるのが>>916である事は間違い無さそうだ。
929nobodyさん:04/11/23 15:22:41 ID:???
おやおや、めずらしく荒れてますな。
そろそろ次スレの頃合かの。
930nobodyさん:04/11/23 16:09:24 ID:???
初めまして。gzipに関する質問です。
gzipの利点は「負荷を削減する」「転送量を減らす」というのは分かりましたが、早さの面ではどうなりますか?

私としては、転送量を減らすので早くなりそうな気もしますが、ブラウザに解凍する処理をさせるので遅くなりそうな気もします。

ご回答を宜しくお願いします。
931nobodyさん:04/11/23 16:30:41 ID:???
無名ハッシュに、ハッシュのスライスで値をセットしてそのリファレンスを
返すことを一度にやりたいんですけどできません。
どうやればいいのでしょうか?
932nobodyさん:04/11/23 16:40:17 ID:???
PerlとPHPってどっちがいいですか?
933nobodyさん:04/11/23 16:48:03 ID:???
ページ全体(例えばyahooのトップなど)を配列に取り込む方法はないでしょうか。
自分のサイトで他ページの情報を一部使いたいのです。
934nobodyさん :04/11/23 16:48:35 ID:???
>>930
自鯖でやらせるんならええけど、レンタルでやったら怒られること間違い無しであろう。
2ch閉鎖みたいに転送量でゴルァされて初めて意味がある処理ではある。
935930:04/11/23 16:51:27 ID:???
>>934
>レンタルでやったら怒られること間違い無しであろう。
それは何故ですか?
936nobodyさん:04/11/23 17:36:00 ID:???
>>931
無名ハッシュのリファレンスを得るなら、先に得ないと無理だと思う。
で、無名のハッシュのリファレンスを得て、ハッシュスライスに値を代入にしてみたけど。

use strict;
use Data::Dumper;

my @pos = qw(msn yahoo google);
my $value = 'search engine.';
my $hash_ref;

@{($hash_ref = {})}{@pos} = ($value) x @pos;

print Dumper($hash_ref);
937nobodyさん:04/11/23 17:52:11 ID:???
>>935
回線の負荷は減らせるが、逆にサーバマシンの負荷は増大する。
938930:04/11/23 17:54:03 ID:???
>>937
そういうことだったんですか。。負荷状況を見ながら導入を検討したいと思います。ありがとうございました。
939nobodyさん:04/11/23 20:55:05 ID:???
940nobodyさん:04/11/23 22:21:01 ID:???
>>930,938
ブラウザの負荷はあまり気にしなくても良いよ。
低スペックのPCでISDNでも体感速度は速くなった。
もし、テーブルを使ったレイアウトをしているなら、
gzipよりもHTMLを変更した方が体感速度は速くなることが多い。

サーバー負荷が心配なら予め圧縮しておくと良いよ。
941nobodyさん:04/11/24 04:36:06 ID:???
execでメタキャラクタを解釈させないようにすると。
でもこれじゃ>>854の言う「データディレクトリでgrepかけて、該当したファイルのみ読み込みたい」
ってのは無理だね。
942nobodyさん:04/11/24 10:14:07 ID:???
結局、grepだって一つ一つファイル開くんだし
スクリプト内で一つ一つ開いてやれ。たいして負荷かわらんってオチか。
943nobodyさん:04/11/24 14:24:18 ID:???
楽にやりたけりゃFile::Searcher使えって話。
944nobodyさん:04/11/24 14:55:14 ID:???
こんにちは。

LWPモジュールだと、テキストデータしか取得できないと思うのですが、
指定したURL自体のスクリーンショットみたいに画像データとして取得を行う様なPerlのモジュールとかってありませんか?
もし存在すればモジュールの名前を教えてください。

こんな感じで指定したURLの画面を表示したいのです。
ttp://sea.search.msn.co.jp/preview.aspx?&q=%e5%85%89%e3%83%95%e3%82%a1%e3%82%a4%e3%83%90%e3%83%bc%e3%80%80%e3%83%97%e3%83%ad%e3%83%90%e3%82%a4%e3%83%80%e3%83%bc

よろしくお願いします。
945nobodyさん:04/11/24 15:56:51 ID:???
@aaa = (['a','b','c'],['A','B','C']);

この['a','b','c']を@bbbに入れたいなんて場合はどうすればいいですか?
946nobodyさん:04/11/24 16:07:21 ID:???
>>944
IEコンポーネントとか使わないと難しいんじゃない?
LWP云々の問題じゃないし
947nobodyさん:04/11/24 16:26:31 ID:???
=@{$aaa[0]};
948nobodyさん :04/11/24 17:04:09 ID:???
>>944
> LWPモジュールだと、テキストデータしか取得できないと思うのですが、
取れるだろ?
949944:04/11/24 17:31:19 ID:???
>> 948
画面のスクリーンショットを取得できるんですか?
もう少しマニュアル読んでみます。
950nobodyさん:04/11/24 17:33:37 ID:???
いや、>>944 の言いたいことは、
HTMLレンダリングしたページイメージを取得したい、
という話らしい。

>>946 の言ってるとおり、それは LWP とか「取得」とかいう問題ではなく、
LWP で取ってきたデータをローカルでレンダリングするにはどうしたら、
という話になるわけだが。

必要なデータを渡すと gecko 使ってレンダリングして
Image::Magick オブジェクトを返してくれる、
とかいうモジュールがあるといろいろ便利そうではあるが、
かなり難しそうだわなあ。
951nobodyさん:04/11/24 20:28:29 ID:???
>>950
http://www.babysimon.co.uk/khtml2png/
こういうのを利用するといいんでは。
モジュールではないし、XやQt、KDEに依存するけど…。
952nobodyさん:04/11/24 22:05:26 ID:???
そこのリンクにある、
http://marginalhacks.com/Hacks/html2jpg/
こっちはPerlスクリプトだね。
X+Mozilla+ImageMagickかな。
953nobodyさん:04/11/24 22:19:47 ID:???
html2[jpg,bmp,png,ps etc.] でググれば結構見つかるよね。
大体がブラウザにレンダリングをさせて画面をキャプチャーするタイプ。
他にも、Windows限定だけど web制作板のCSSでイケてるかも知れないデザインサイトスレで
使っているwebnailとか。
954nobodyさん:04/11/25 00:19:16 ID:???
デスクトップ環境構築してるなら、数行のShellスクリプトで済むけど。
サーバー側で使うとなると、ちょっと敷居高いんじゃないかな。
955nobodyさん:04/11/25 00:33:25 ID:???
あるディレクトリ内のファイル名一覧を取得する時って、
opendir,readdirかFile::Findかどちらを使うべきだろう。
1000ファイルほどあるんですが、パフォーマンス的には変わりませんかね?
(ファイルは階層的に掘り下げる必要は無いんですが)
956nobodyさん:04/11/25 01:11:28 ID:???
@array = ('aaa','bbb','ccc');
$key = 'bbb';
このような変数があるとして、$keyが@arrayの要素に存在するかどうかを
一発で判定する書き方って無いでしょうか?
957nobodyさん:04/11/25 01:12:46 ID:???
(;゚Д゚)
958nobodyさん:04/11/25 01:22:03 ID:???
>>956
釣りですか?
959nobodyさん:04/11/25 01:24:36 ID:???
いえ、ループとか制御構文使わないで、1行ですっきり判定する方法ないかなーと・・・
960nobodyさん:04/11/25 01:27:59 ID:???
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
961nobodyさん:04/11/25 01:46:49 ID:???
map使えば簡潔に書ける。と思うが。
962nobodyさん:04/11/25 01:50:38 ID:???
ていうか連想配列でif($array{$key}){処理;}とかでいいじゃない。
963nobodyさん:04/11/25 01:56:17 ID:???
>>955
単一階層なら readdir 。

>>956
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o

${{ map { $_, 1 } @array }}{$key} ? 'exists' : 'not found';
964nobodyさん:04/11/25 02:08:03 ID:???
>>963
むお!ありがとうございます!
965nobodyさん:04/11/25 08:14:06 ID:???
>>956
my $count = grep{ $_ eq $key } @array;

# 中身はループだけどね。
966nobodyさん:04/11/25 08:26:21 ID:???
最近CGI.pm使い始めたんだけど、もしかして重いですか?
cgi-libでReadParseして%inを取り回してた方が負荷的にも鯖にやさしい?
967nobodyさん:04/11/25 11:25:21 ID:???
さあ?ってか必要なのだけインポートしなよ。
968nobodyさん:04/11/25 12:32:23 ID:???
CGI.pm は実際に呼び出された関数だけコンパイルする仕様なので、
import するかどうかはあんまり負荷に影響しない。
-compile :all とかするとさすがにアレだが。

俺も CGI.pm のコンパイルは若干重めだと思うが、
Template Kit や DBI の重さに比べれば誤差なので、
遠慮なく使っている。
それに mod_perl 環境下ではコンパイル負荷をほぼ無視できるしな。
969nobodyさん:04/11/26 02:05:36 ID:???
Template Kit重いのかー。
ヒアドキュメントだらけでなんとかしたかったんだが、やめとくか。
970nobodyさん:04/11/26 08:03:16 ID:???
掲示板で、データを順番に、任意のハッシュに入れたいのですが、

my @data_list = qw/name date com/;
my %data = ();

〜〜

while (<FILE>) {
 my @temp = split(/<>/);
 $data{$data_list[$_]} = $temp[$_] for (0..$#data_list);

 print '名前:', $data{'name'}, $data{'date'}, $data{'com'}, '<br />';
}

現在はこのように一旦別の配列に格納してからループしてます。
split(/<>/) からストレートにハッシュに格納することは難しいでしょうか。
971nobodyさん:04/11/26 08:28:36 ID:hJWQX2yr
質問させてください。
ActivePerl-5.8.4.810-MSWin32-x86.msi とwin2000を使っています。

my $Name_T = '';
$Name_T =~ s/([\x20(){},+^~%`])/{$1}/g;

いろいろ試してこのような正規表現で以下の文字が$Nameに含まれている場合{}をつけて置換しようとしました。
(){},+^~%` とスペース

+なまえ+ → {+}なまえ{+}
%^なまえ^% → {%}{^}なまえ{^}{%}

こんな感じです。始めは上手くいっていたのですが不具合をみつけました。
"タ"や"ミ"、全角の"+"などです。

"タ"や"ミ"は"ボ^}"と置換されていまい、全角の"+"は"+{}"と置換されてしまいます。
ご指摘、アドバイス等いただければ幸いです。
972nobodyさん:04/11/26 09:55:48 ID:???
>>971
文字コードをEUCにして下さい。
SJISだと他にも同じような事がいっぱい起こります。
973nobodyさん:04/11/26 10:23:37 ID:???
>>970
ハッシュのスライス使って

@data{@data_list} = split(/<>/);

あたりでどうすか?
974970:04/11/26 10:48:29 ID:???
>>973
ありがとうございます。無事考えていた処理ができました。
スライスというものを使えばいいのですね……知りませんでした。
975971:04/11/26 11:00:48 ID:???
>>972
ありがとうございます。
文字コードEUCについて調べてみます。
976972:04/11/26 13:09:04 ID:???
>>971
そういえばSJISでも、
s/\Q([\x20(){},+^~%`])\E/{$1}/g;
だったら大丈夫かも…。

まぁ、EUCにもしておいた方が無難。
977nobodyさん:04/11/26 14:49:02 ID:eKQW3m7f
簡易なアンケート(書く人がフォームに文章を書いて、ボタンを押せばデータに文章が保存される)
と言う事がしたくて教本を見ながらやっていたのですが
#!/usr2/bin/perl
BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); }
#ライブラリ
require 'cgi-lib.pl';
#デコードするサブルーチン
&ReadParse(*form);
#ライブラリ
require 'jcode.pl';
#文字コード変換のサブルーチン
&jcode'convert(*form, 'sjis');
#連想配列から値だけを取り出し、区切りのハイフンを追加
$data="$form{'kansou'}\n\n-------\n\n";
#追加書き込みモード
open(ENQ, ">>enquete.dat") || die "File 'enquete.dat' Open Error."
flock(ENQ, 2);
print ENQ $data;
flock(ENQ, 8);
close(ENQ);
--以下HTML文--
これをサーバー上で実行すると
「syntax error at enquete.cgi line 21, near "flock" Execution of enquete.cgi aborted due to compilation errors.」
と言ったエラーが出ました。
教本についてたサンプルを使ってやっても同じエラーが出てしまうのですが…どこか間違っている部分がありますでしょうか?
ググってもどれが参考になってるのかもよく分からず…お手数ですがご教授お願いいたしますm(_ _)m
978nobodyさん:04/11/26 14:49:58 ID:???
さげ忘れ…すいませんorz
979nobodyさん:04/11/26 14:56:31 ID:???
syntax error at enquete.cgi line 21
と出たときの8割は
20行目の行末のセミコロンを付け忘れている
980nobodyさん:04/11/26 15:01:55 ID:???
>>977
21行目で構文エラーだって書いてあるんだから、どこがその
行か示せよ。そのコピペは20行ないからソースそのままじゃ
ないので意味ナシ。

おおかたopen 〜 || die 〜の行の最後にセミコロンがない
せいだとは思うがナ。
981nobodyさん:04/11/26 15:04:08 ID:???
なんと…三十分も見落とし続けてた…お恥ずかしい●| ̄|_
解決しました、ありがとうございましたorz
982nobodyさん:04/11/26 15:05:38 ID:???
>>980
改行が多すぎると出たので改行も消してました。
重ね重ね申し訳ないorz
983nobodyさん:04/11/26 18:13:14 ID:???
実行ステップ数は変わらない場合、1ソースよりも、ソース分割して必要に応じて
requireしていく方が速いでしょうか?
984nobodyさん:04/11/26 18:17:30 ID:???
use Benchmark;
985nobodyさん:04/11/26 18:46:45 ID:???
実行ステップ数が変わらないんじゃたいして意味無いと思うぞ。
昔は、BBSのスクリプトとかで、表示、書き込み、検索でcgi自体を分けたりしてた頃もあったなぁ。
でも最近はベタ書きばかりだけど。
javaではしっかりモデリングするんだけど、言語によって人格変わる。
986nobodyさん:04/11/26 19:09:23 ID:???
>>971
文字 x があり、x が'\x20(){},+^~%`'のいずれかであった場合、
xを'{}'で囲むということは、言い換えれば(\x7b x \x7d)という文字列を作るということです。

'+'は (\x81\x7b)で、\x7bは'{'なのでマッチし、
'{}'で囲って(\x81\x7b\x7b\x7d)になります。
(\x81\x7b)は'+'で、\x7bは'}'なので、'+{}'になります。

'タ'は(\x83\x5e)で\x5eは'^'なのでマッチし、
'{}'で囲って(\x83\x7b\x5e\x7d)になります。
'ミ'は(\x83\x7e)で\x7eは'~'なのでマッチし、
'{}'で囲って(\x83\x7b\x7e\x7d)になります。
(\x83\x7b)は'ボ'、\x5eは'^'、\x7eは'~'なので、
それぞれ'ボ^}'と'ボ~}'になります。

解決策は
use encoding "shiftjis";
です。

>>976
大丈夫ではありません。
987nobodyさん:04/11/27 08:15:26 ID:???
次スレキボン
988nobodyさん:04/11/27 10:19:32 ID:???
CGI.pmの場合、$query->param(hoge);とかでフォームからの入力データを参照できますが、
タグを無効にしたり文字コード変換したりしますよね?
この場合、新たなハッシュテーブルなりに入れるか、$queryを直接書き換えるか、
どんな風にデータを取り回してますか?
私は色々変換した後に新たなハッシュテーブルに入れて、それを以降の処理で使うようにしてますが、
何だか領域が勿体無い気もします。
989nobodyさん:04/11/27 11:30:32 ID:???
>>988
Perlスクリプトである以上、メモリを使うのはしょうがないよ。
掲示板のログをまるごと配列に入れるのは論外だけど、
通常の操作なら(・ε・)キニシナイ
990nobodyさん:04/11/27 11:38:48 ID:???
新スレ

Perlコーディング初心者質問スレ Part 39
http://pc5.2ch.net/test/read.cgi/php/1101522903/
991nobodyさん:04/11/27 12:39:47 ID:???
cgi-lib使ってた頃は%inを直接いじってたので、CGI.pmに乗り換えた時に
$queryから更に別領域にデータ確保するのは何となく抵抗あったな。
でもやっぱりデコードやらコード変換した後に別領域に入れてるよ。
気にスンナ。
992nobodyさん:04/11/27 18:06:58 ID:???
($hoge) = split(/<>/)



$hoge = substr($_, 0, index($_, '<>')

はどちらが効率が良いでしょうか。100回ぐらい繰り返します。
993nobodyさん:04/11/27 18:17:37 ID:???
>>992
100回ぐらいならどっちでもいいと思うが気になるなら
ベンチ取れよ。$_がどういう文字列かにもよりそうでは
ある。
994nobodyさん:04/11/27 18:21:26 ID:???
100回程度ならまず差は出ないだろう。気にするな、それがパールの世界だ。
995nobodyさん:04/11/27 18:30:26 ID:???
ぱっと見、substrの方が最初の'<>'が見つかった時点で文字列サーチ
終わるから速そう。てことでベンチ。

use Benchmark;
$s = 'foo<>baa';

timethese(undef, {
split => sub {
($hoge) = split(/<>/, $s);
},
substr => sub {
$hoge = substr($s, 0, index($s, '<>'));
},
});

てな感じで結果は

Benchmark: running split, substr for at least 3 CPU seconds...
split: 4 wallclock secs ( 3.21 usr + -0.01 sys = 3.20 CPU) @ 396900.00/s (n=1270080)
substr: 2 wallclock secs ( 3.11 usr + -0.00 sys = 3.11 CPU) @ 1306832.15/s (n=4064248)

予想通りsubstr圧勝。
996992:04/11/27 18:32:47 ID:???
>>993-995
ありがとうございます。ミリ秒を測る手段を探していました……。
997nobodyさん:04/11/27 18:35:15 ID:???
インタプリタが左辺の変数を数えて、splitはその分だけサーチするなんて事を
やるとでも思ったか。
998nobodyさん
ベンチってオモロイから良くやるけど実用上意味が無い場合が多いな。