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

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

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

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

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

過去ログやお勧めサイトは >>2-10
2nobodyさん:2005/10/17(月) 00:47:57 ID:???
関連スレ
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/

Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/

CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/

【 スクリプト改造依頼スレ 】(丸投げ) part4
http://pc8.2ch.net/test/read.cgi/php/1127916965/
3nobodyさん:2005/10/17(月) 00:48:29 ID:???
4nobodyさん:2005/10/17(月) 00:49:52 ID:???
5nobodyさん:2005/10/17(月) 00:50:39 ID:???
6nobodyさん:2005/10/17(月) 00:51:22 ID:???
7nobodyさん:2005/10/17(月) 00:52:36 ID:???
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

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

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.7/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://search.cpan.jp/
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
8nobodyさん:2005/10/17(月) 00:53:16 ID:???
9766:2005/10/17(月) 00:55:59 ID:???
>>997
すいません。。ほんとに。おいらが悪いんです。ごめんなさいです。
10nobodyさん:2005/10/17(月) 01:08:17 ID:???
前スレ999ワラタ
11nobodyさん:2005/10/17(月) 01:42:22 ID:???
全然勉強してないうえ仕事でわかんなくて悩むんだったら、
誰か (ちゃんとしたスクリプトを書いてくれるとこ) に依頼した方が会社もお前もいい判断だろうに。
1〜2週間やそこら悩んでできないくらいだったらそのほうがはるかにコストパフォーマンスがよいハズ。
つかそんなことで雇ってもらえてるのが、何ていうか、うらやましい。
12nobodyさん:2005/10/17(月) 01:48:57 ID:???
同じく、前スレ999ワラタ
13766:2005/10/17(月) 01:57:00 ID:???
>>11

おっしゃるとおりです。おいらもできるってゆっちゃったのがいけなかったんです。ほんとに前スレの999ですね。。。情けないです。
14766:2005/10/17(月) 01:59:05 ID:???
色々調べて何回もいろんなソース試したりしてここまでやったんですが、、もうだめぽ。。泣

今回だけマジで助けてほしい。。お願いします。
15nobodyさん:2005/10/17(月) 02:03:32 ID:xem7pvIg BE:135532883-##
めずらしくこのスレ盛り上がってるじゃん。 うれしいよ。。
16nobodyさん:2005/10/17(月) 02:20:21 ID:???
まだ766はいるのかな?
まだ出来てないなら要点まとめて頂戴。

まずは、送信したフォームの情報が正しく所得できているのか。

POSTでなく、GETで値をみられるようにする。

データを保存する方法はわかっているのか。

変数に入れた文字が保存できたのか調べる。
17nobodyさん:2005/10/17(月) 02:43:10 ID:???
すみません、教えていただきたいのですが。
買い物などのWEBで、検索や完了まで時間がかかるとき、「ただいま検索(登録)中です」のような一時的画面を表示させたいのですが、
perlではどのような方法があるでしょうか?
一定時間(例えば1分とか)は、特定の一時ページを表示して、
完了した時に完了ページを表示するものをイメージしています。
javaなどでは時々このようなページを使っているとこがあるのですが。。。。

一応、小枝とかその他有名なサイトは見たんですが、
こういう点での会報がわからなくて。。。。
18766:2005/10/17(月) 02:50:52 ID:???
>>16

すいません。ありがとうございますです。

・送信したフォームの情報はexcelで開いたとき、名前が文字化け(EUCでやってるからだと思いますが、解決策わからず。。)

・変数にいれた文字(回答番号 1とか2とか)はcsvに数字で保存できています。

【お手上げ】

・前スレ >>981 に書いたような並びでexcelに保存ができなし。。
・名前をいれてなかったらエラー(送信できない)ようにしたい。

です。何卒ご指導お願いいたします。。まじですいません。
1916:2005/10/17(月) 03:04:21 ID:???
まず、先にこれだけいっておきます。
「エクセルは関係ない」。
エクセルで読める表示形式で保存したいって言うのは最後の手段で、今はそこまでいってないので頭から忘れてください。

送信する

データを受け取る

ファイルに保存する

第一段階でHTMLのメソッドをgetに・・・

って現段階のコード、どっかにアップしてもらったほうが早そうね。
もうちょっと常駐しとく。
2016:2005/10/17(月) 03:21:03 ID:???
納期遅れのいいわけ考えながら寝ちゃったのかな?
21nobodyさん:2005/10/17(月) 03:41:01 ID:???
>>19
現段階のコードは前スレに。
参考にやり取りを列挙すると
前スレ http://pc8.2ch.net/test/read.cgi/php/1123777607/
Q >>922-925
A >>931,932
Q >>936-938
A >>950
Q >>954-956
A >>958
Q >>981,982-986 (現状の全ソース)

その要件を実装するのはすぐにできるけれど、
完成物を渡してしまっても766のためにはならないしな…
22nobodyさん:2005/10/17(月) 03:51:17 ID:???
というかまず766は出来ないことは「できない」と言う事を学ぶべきだと思う
じゃないとまた同じ事繰り返す羽目になる
2316:2005/10/17(月) 04:19:43 ID:???
暇でネタもないので、とりあえず作ってみてる。
24nobodyさん:2005/10/17(月) 04:40:35 ID:???
>>23
おまい、いいやつだな
25766:2005/10/17(月) 04:40:42 ID:???
>>21

レス有難うございます。
ヒントだけでも結構です。。後はもちろん自分でなんとか完成させるつもりです。

何卒宜しくお願いいたします。
26nobodyさん:2005/10/17(月) 04:45:09 ID:???
>>17
それ、perlとは関係ないだろう。
meta refresh か JavaScript 使いなされ。
27766:2005/10/17(月) 04:54:56 ID:???
現状のソースをアップしますた。

http://www.nextftp.com/sentobeat/

皆さんに頼りっぱなしなのもわかっております。
ヒントだけでもいただければもちろん自分でもなんとかするようにします。

なんとか宜しくお願いいたします。。マジ泣
2816:2005/10/17(月) 05:03:25 ID:???
最初のファイルを編集してるので。
希望動作は最初のとおりでいいのよね?
2916:2005/10/17(月) 05:12:34 ID:???
アプロダの指定よろ
30766:2005/10/17(月) 05:13:39 ID:???
>>28

まじですか ほんとに有難うございます。。

はい。希望動作は >>18 に書いたものです。

今なんとか自分でもとりあえずエラー機能をつけようと思って
#入力チェック
if ($in{name} eq '') { &error('名前を入力してください',''); }

を頭につけてみたんですが、動きませんでした。。orz

何卒宜しくお願いいたします。
31766:2005/10/17(月) 05:16:11 ID:???
>>29

ありがとうございます。

http://other.free-uploader.com/up/ 

でお願いしますです。
3216:2005/10/17(月) 05:30:28 ID:???
とりあえずあぷ
ソース汚いままだけど保存はちゃんとされるはず。
読みにくかったfont size=2はスタイルに勝手に変えちゃったままですが。
3316:2005/10/17(月) 05:32:40 ID:???
やばっ、フォントの閉じたぐ全部消しちゃってるw
3416:2005/10/17(月) 05:41:52 ID:???
Lintで怒られまくったので、最低限もとのHTMLになるように戻しておきますた。
35766:2005/10/17(月) 05:42:40 ID:???
>>16

有難うございますです。マジで感謝です。

今試してみたんでうが、動かない。。泣
パーミッションもなおしますた。

はじめのはquestion_1.inc っていうふぁいると連動してたんですが、
作っていただいたものは関係ありますか?

question_1.cgiにいきなりアクセスですよね?
3616:2005/10/17(月) 05:44:24 ID:???
あ、1行目戻してないです。
usestrictでエラー追いやすいように一つにまとめました。
37766:2005/10/17(月) 05:53:08 ID:???
>>16

!!!!

でけてるー!!! 感謝です!

こんな朝方まで付き合ってくださって本当にありがとうございます。大泣
ソースみたらやっぱり全然違いますた。。


これは質問をquestion_1.tsvから読み込まなくても、index.html → post でquestion.cgiでももしかしていけますか?
3816:2005/10/17(月) 05:57:15 ID:???
質問を表示したソースをHTMLとして保存すれば出来ます。
perlの中の変数はかなり弄ったけど、フォームの部分は触ってません。
39766:2005/10/17(月) 06:04:44 ID:???
>>16

わかりましたです!やってみますです。
本当に有難うございます。

あと名前をcsvに書き出したいんですが、$in{name}で書き出せるのでしょうか?(配列は自力でやりますです。)

あとその名前が入っていなかったら、エラーにしたいんですが、さっき入れた if ($in{name} eq '') { &error('名前を入力してください',''); } じゃだめでしょうか?

これで最後の質問です。。ご指導おねがいできませんでしょうか?
40766:2005/10/17(月) 06:16:25 ID:???
>>16

すませんです。。せっかく作っていただいたのですが、

1人目の名前: name1
その人の1〜3問目の回答番号: hoge1, hoge2, hoge3,
1〜3問目の正解番号: anser1,anser2,anser3

2人目の名前: name2

とすると

name1、hoge1, hoge2, hoge3,(改行)
”空欄”,anser1,anser2,anser3(改行)
name2、hoge1, hoge2, hoge3,(改行)
”空欄”,anser1,anser2,anser3(改行)

になってませんでした。。。泣

hoge1,anser1(改行)
hoge2,anser2(改行)


になってました。。もう一度みてもらえませんでしょうか、、再度大泣
4116:2005/10/17(月) 06:23:47 ID:???
40をみてないときの39への回答
いつのまにか名前入力とか増えてたのね。

>あと名前をcsvに書き出したいんですが、$in{name}で書き出せるのでしょうか?(配列は自力でやりますです。)
フォームで<input type="text" name="name" value="">としていれば$in{name}に入る。

>あとその名前が入っていなかったら、エラーにしたいんですが、さっき入れた if ($in{name} eq '') { &error('名前を入力してください',''); } じゃだめでしょうか?
cgi-lib.plでのエラー表示用はCgiDie。CgiErrorでもいいけどどっちがいいとかは忘れた。
unless ($in{name}) { &CgiDie('名前を入力してください');}

とりあえず、ヒキなおいらに頼るような仕事は今後受けないようしましょうね。
昔、友達に頼まれたCGIが、これによく似てたから作ってみただけですので。
↑これも、ただ働きだったけど。
42766:2005/10/17(月) 06:36:14 ID:???
>>16さん

レス有難うございます。やってみますです。
はいです。今後出来ない仕事は請けないです。(絶対)

>>40 の内容をいただいたソースもとにいじってみたんですけど
やぱりエラーでした。。

# CSVへの書き出し
open (CSV , '>>file.csv');
flock (CSV,2);
print CSV join(',', $in{name}, $in{'Q'.$i}), "\n";
print CSV join(',', '', $array[1]), "\n";
flock (CSV,8);
close (CSV);


4316:2005/10/17(月) 06:36:39 ID:???
>>40
こゆこと?

my$data;
my@q1;
my@q2;
for (my$i = 1; $i <= @question; $i ++) {
my@array = split("\t", $question[$i - 1]);
push(@q1, $in{'Q'.$i});
push(@q2, $array[1]);
}
$data = $in{name}.','.join(',', @q1)."\n".','.join(',', @q2)."\n";

正解を保存する理由もよく分からないままなんですが。

あと、選択する問題が4つ目とか増えるなら36行めを
for (my$s = 1; $s <= (@array - 2); $s ++) {
にしないとだめです。
44766:2005/10/17(月) 06:46:20 ID:???
>>43

はっ!! できてる!
有難うございますー!! (泣きっぱなし)

名前は今EUCなので、excel開けたときに文字化けすてるんですが、
こいつをcsvに書き出すときに直すソースってありますでしょうか?
(ほんとにこれで最後でございます。。)
45766:2005/10/17(月) 06:53:52 ID:???
unless ($in{name}) { &CgiDie('名前を入力してください');}

をrequire "cgi-lib.pl";の後に挿入したら、名前しれているのに
でっかく 名前を入力してください て出ます。。

いれるとこ間違ってるのかな?
4616:2005/10/17(月) 06:56:07 ID:???
CSV 【カンマ区切り】
読み方 : シーエスブイ
フルスペル : Comma Separated Values
別名 : コンマ区切り

データの保存形式のこと。文字コードの指定はない。
エクセルはShift_jis限定だっけ?
メモ帳じゃないテキストエディターで変換保存すれば読めるはず。
保存時からShift_jisにしたいのならコード変換の処理が必要。

というか、ラジオボタンで値が数字だけだからいらなかったのに、テキストフォームつけるなら、Jcodeとか必要よ?

>>45
&ReadParse;の後
47766:2005/10/17(月) 07:08:46 ID:???
>>46

jcode.pl 入れますた。

下のコードをどっかにいれたりしたらokだったりしますか?


# jcode.plを用いたコード変換
require 'jcode.pl';

open READ, '<sjis.txt';
open WRITE, '>euc.txt';
while(my $data = <READ>){
jcode::convert(*data, 'euc');
print WRITE $data; }
close WRITE; close READ; exit;
4816:2005/10/17(月) 07:17:18 ID:???
なんかもう設計とかあってないようなので、
先頭で
require 'jcode.pl';

さっき変えたところで
$data = $in{name}.','.join(',', @q1)."\n".','.join(',', @q2)."\n";
jcode::convert(\$data、'sjis');
# CSVへの書き出し

というかエクセルは文字コード固定なの?
OOoしか使ってないからエクセルのことは知らないよ。
49nobodyさん:2005/10/17(月) 07:31:39 ID:???
なんていうか…
2ch外でやってもらえません?
50766:2005/10/17(月) 07:49:53 ID:???
>>16さん

長い間ほんとにお手数おかけしました。
無事完成いたしましたです。

本当に感謝です。たすけていただいて本当にうれしくて泣きそうでした。

有難うございました。

これから教えていただいたことを無駄にしないように自分で勉強かさねていきますです。



>>49

すいませんでしたです。
51nobodyさん:2005/10/17(月) 07:52:51 ID:??? BE:56472252-##
めずらしくスレ進行が速いから、荒らしかと思いきや、、、、ある意味荒らしだった。。
5216:2005/10/17(月) 07:53:59 ID:???
お疲れさん。

次の質問どぞー
53nobodyさん:2005/10/17(月) 08:09:02 ID:???
766と16のおんぱれ・・・初めてこんな個人スレ見ました。
54nobodyさん:2005/10/17(月) 08:39:52 ID:???
結局766って仕事がどーとか言うより何一つ知らない上に検索すら出来ない池沼じゃねぇか
55nobodyさん:2005/10/17(月) 09:18:14 ID:???
次の仕事がきたらまた愛の交換日記がはじまるんだろうか...
56nobodyさん:2005/10/17(月) 10:19:11 ID:???
丸投げスレかと思った。
57nobodyさん:2005/10/17(月) 10:41:45 ID:???
>>16は乙だが、正直放置して欲しかった
今後766みたいなのが増えると思うとウンザリする
58nobodyさん:2005/10/17(月) 13:09:39 ID:???
>766だけでなく>16もウザ。
二度と来ないでくれ。
59nobodyさん:2005/10/17(月) 17:49:53 ID:???
戦いは終わった……だが…それは勝利ではなかった……
60nobodyさん:2005/10/17(月) 18:40:37 ID:???
「仕事請負スレ」でも作って、766みたいなのは
そこに誘導(隔離?)するのがいいかもね。
61nobodyさん:2005/10/17(月) 19:11:36 ID:???
■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/

ここに誘導しとけばよかったね
62nobodyさん:2005/10/18(火) 00:10:47 ID:aW0OtyWy
質問です。現在FreeBSD上で、マニュアルページをHTMLに変換するCGIを書いていて、文字化けに困っています。
プログラム名は test.cgi です。手元で、% ./test.cgi > log として、出力されたログを見ると、きちんと
EUC-JPで出力されているのですが、ブラウザでアクセスしたり、fetch コマンドでアクセスしたり、telnet で
直接WebServerと話したり、とにかくApache を通すと、日本語の部分が、&xxx; と、文字実体参照の形に
なってしまいます。どうすれば文字化けを無くせるでしょうか。

(余計な部分を切り詰めた)プログラムを貼ります。

#! /usr/local/bin/perl -w
binmode(STDOUT, ":encoding(euc-jp)");
$filename= "/usr/local/man/ja/man3/strlen.3.gz";
$command = "gzcat $filename | /usr/local/bin/groff -man -Thtml -dlang=ja_JP.eucJP";
open(PIPE, "-|:encoding(euc-jp)", "$command") or die;
@html = <PIPE>;
close(PIPE);
print "Content-type: text/html; charset=euc-jp\n\n";
for $text (@html) {
  print $text;
}
6362:2005/10/18(火) 00:12:05 ID:aW0OtyWy
>>62 の続き。

コマンドライン上で ./test.cgi > log とした時の、ファイル log の中の一部分。
<a href="#名称">名称</a><br>

WebServer にCGIを起動させて結果を得た場合の、上と同じ部分。(アンド記号はわざと全角にした。)
<a href="#&Igrave;&frac34;&frac34;&Icirc;">&Igrave;&frac34;&frac34;&Icirc;</a><br>

環境。
OS: FreeBSD 5.4-RELEASE i386
WebServer: Server version: Apache/1.3.33 (Unix)
Perl: This is perl, v5.8.7 built for i386-freebsd-64int
64nobodyさん:2005/10/18(火) 00:19:06 ID:??? BE:276713377-##
65nobodyさん:2005/10/18(火) 00:27:48 ID:aW0OtyWy
>>64
HTMLにするのはあきらめて、Plain text で我慢しろ、っていう意味ですか?
66nobodyさん:2005/10/18(火) 03:27:49 ID:???
>>65
ちゃんと読めよ。
67nobodyさん:2005/10/18(火) 03:43:48 ID:???
>>62
いちいちCGIで出力するより、htmlで吐いてアップした方が良いとは思うが・・・。

コマンドラインとApacheで動作が異なる場合はまず環境変数を疑う。
とりあえず2行目あたりに

$ENV{'LANG'} = 'ja_JP.eucJP';

を挿入。これで大丈夫だと思う。確かめてないけど。
6867:2005/10/18(火) 03:47:18 ID:???
>>65の件は今回の場合関係ない。
groffが吐いてる時点で実態参照になってると思われ。
69nobodyさん:2005/10/18(火) 13:57:42 ID:???
PealでCGIのちょっとした掲示板を作っているんですが、
フォルダの中身を全て消す処理というのはどうすれば良いのでしょうか?
ファイルの場合は @Test=''; これだけで消せますが、
フォルダの中身全てを消去する方法が判らず製作が滞っています。
何方かお知恵をお貸し下さい。お願いします。
70nobodyさん:2005/10/18(火) 14:03:18 ID:???
Pealで掲示板は作れまい
71nobodyさん:2005/10/18(火) 14:18:33 ID:???
>>69
フォルダにあるファイル一覧を取得して消すとか、
シェルコマンド使うとかいろいろあるお。
72nobodyさん:2005/10/18(火) 14:29:41 ID:???
> ファイルの場合は @Test=''; これだけで消せますが、

ここにツッコミを入れる奴はおらんのか?(笑)
73nobodyさん:2005/10/18(火) 14:48:42 ID:???
フォルダを消すときは
@Test = `del c:\*.*`;
とするんじゃなかったっけ?
74nobodyさん:2005/10/18(火) 15:15:57 ID:???
うーん・・・・・  何からツッコンでいいのかわからん
75nobodyさん:2005/10/18(火) 15:41:11 ID:???
質問の内容からして、>>69が掲示板スクリプトを作れるとは思えん。
また>>16が降臨して、>>69の掲示板スクリプトを全部作ってやればいい。
但し、↓のスレでやってほしい。

■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
76nobodyさん:2005/10/18(火) 17:06:06 ID:???
とりあえず rm -rf / でもしとけ。
77nobodyさん:2005/10/18(火) 17:11:13 ID:???
Web サーバの権限だと初手からコケそうだが。
78nobodyさん:2005/10/18(火) 21:16:25 ID:???
>>67 さん。
> とりあえず2行目あたりに
> $ENV{'LANG'} = 'ja_JP.eucJP';
> を挿入。

で、うまく行きました。

%gzcat /usr/local/man/ja/man3/strlen.3.gz \
  | env -i /usr/local/bin/groff -man -Thtml -dlang=ja_JP.eucJP

と、環境変数無しで実行すると、groff が実体参照を吐くことも確認できました。
ありがとうございました。
79nobodyさん:2005/10/18(火) 22:15:08 ID:???
レンタル鯖がaaacafeでmySQLは使えるのですが、鯖にDBIがないようなのです。
レンタル鯖のCGIで接続したい場合、どういった方法を取ればいいのでしょうか。
CGI自体はローカル起動、ローカルのMySQL、ローカル起動、レンタル鯖のMySQLで正しく動くので、スクリプト上のエラーではないと思います。
80nobodyさん:2005/10/18(火) 22:25:23 ID:???
PerlのCGIで、非常に簡単なコメント保存CGIをつくろうとしてます。

htmlの方で、

<form method="post" action="****.cgi">
コメント<Input Type="text" Name="com" Size="**" Maxlength="**">
<INPUT TYPE="image" SRC="img/send.jpg" align=right>
<form>

としておいてテキストを書込み、SENDボタンを押すと、CGIが動作しコメントがログに書込される、というものです。

でperlのCGIの方で(既存のCGIを自分で修正)

#!/usr/bin/perl -w
use CGI;
変数宣言
$form = new CGI;
$com = $form->param('com');
open (TEXTFILE,">>./log.txt")
print TEXTFILE $com;
print TEXTFILE "\n";
close (TEXTFILE);

としてるのですが、どうにもうまくいきません。
どうすればうまくいくかヒントでもいただけませんでしょうか?


81nobodyさん:2005/10/18(火) 22:27:43 ID:???
>>80
「変数宣言」がコメントになってないとか
あと、何がうまくいかないのか不明。
500エラーなのかファイルに保存されないのか、詳しく書くように。
8280:2005/10/18(火) 22:32:41 ID:???
>81
すみません。
インターナルサーバエラーを起こして動かないという状況です。

ちなみに変数宣言は
my ($form, $com);
としています。
83nobodyさん:2005/10/18(火) 22:41:45 ID:???
>80
ヒント:Content-type(たぶん)
8479:2005/10/18(火) 23:10:34 ID:???
すいません、ム板のほうがよさげなので移動します。
85nobodyさん:2005/10/18(火) 23:16:01 ID:???
>>84
早速マルチポストかよ。

来ないで下さい。
86nobodyさん:2005/10/18(火) 23:42:22 ID:???
マルチポストの意味ちげーよ
87nobodyさん:2005/10/19(水) 00:31:56 ID:???
>>80
use CGI::Carp qw(fatalsToBrowser);
おまじないで二行目に貼って。
88nobodyさん:2005/10/19(水) 00:35:04 ID:???
>>69

unlink(glob("dir/*"));

多分ね。
89nobodyさん:2005/10/19(水) 00:52:35 ID:???
それより「ちょっとした掲示板」で「フォルダの中全消し」という仕様が
何に使われるのかが非常に気になるのだが・・・
90nobodyさん:2005/10/19(水) 01:16:52 ID:???
>>89
スレまたはレス別にログファイルが分かれていて、ログのリセットとかじゃなかろうか
91nobodyさん:2005/10/19(水) 17:01:02 ID:mMzWKjOm
先生質問です。
指定したディレクトリ内にある、ファイルとディレクトリの名前、
そしてそれらのパーミッションを取得して表示させるCGIを作成してます。
stat でファイルのパーミッションは上手く取得できるのですが、
ディレクトリのパーミッションは 000 が返ってきます。
どうやったらディレクトリのパーミッションも取得できますか?

該当部分の今のソースはこんな感じです。
$dir ="cgi-bin";

opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$permis";
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uha:$per<br>\n";
}
}
closedir(DIR);
92nobodyさん:2005/10/19(水) 17:13:00 ID:mMzWKjOm
う、ソース訂正です。

opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$uhaha";
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uhaha:$per<br>\n";
}
}
closedir(DIR);
93nobodyさん:2005/10/19(水) 17:18:56 ID:???
>>91-92
こちらの環境ではちゃんと表示されるよ
問題は他のところにあると思う

関係ないけれど、
> $per = substr((sprintf "%03o", $st[2]), -3);
ここは
$per = sprintf "%03o", $st[2] & 0700;
の方が良いんじゃないかと思ったり
9493:2005/10/19(水) 17:20:55 ID:???
うわ、全角スペースとマスクの値の二重ミスした・・・スマソ。正しくは
$per = sprintf "%03o", $st[2] & 0777;
95nobodyさん:2005/10/19(水) 17:36:12 ID:???
>>91
パーミッションを000にすることは普通ないだろうから、
statに失敗している可能性があるな。

opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$uhaha";
if (@st > 0) {
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uhaha:$per<br>\n";
} else {
print "$uhaha:stat失敗($!)\n";
}
}
}
closedir(DIR);

とでもして試してみたらどうだろうか。
96nobodyさん:2005/10/19(水) 17:57:17 ID:???
あれ、よく読んだらreaddirで返ってくるのはパスじゃなくてファイル名だから・・・
stat "$dir$uhaha"
じゃなかろうかカレントディレクトリでテストしちゃったから気づかなかった
9791:2005/10/19(水) 17:57:31 ID:mMzWKjOm
>>93-94
ありがとうございます。
後述しますが、こちらの環境のせいかもしれません.....
あと、$per = sprintf "%03o", $st[2] & 0777; の方が何故良いのか、
パッと見てまだわからないので、後で調べてみます。

>>95
やってみました。
全部「stat失敗(No such file or directory)」でした。

そして、なんらかの原因でうまく情報を取得できていないみたいだったんで、
情報を取得したいディレクトリの中に、このスクリプトを放り込んで実行した所、
完璧に表示されました。
上位でも下位でも、階層が違うディレクトリを指定すると、
上手く情報が取得出来ないようです。
なんでだ...
9891:2005/10/19(水) 18:00:40 ID:mMzWKjOm
>>96
全て謎がとけましたw
その通りですね。
テンパってるとダメですね.....ありがとうございました!
99nobodyさん:2005/10/19(水) 23:56:03 ID:???
# ID,NAME,ADDRESS,TEL
0,yamada,A32,333
1,tanaka,B22,555

上記のようなCSVファイルから1行ずつ読み込んでハッシュに入れたいのですがどのように
すればいいのでしょうか。問題点がCSVの一行目をカンマごとにばらしたのをハッシュのキー名
にして2行目からをそれぞれの値として入れなくてはいけないのです。
モジュールも使えないのでよりどうしたらいいのかわかりません。
$filename="test.csv";
%arr2 = &COUNT($filename);
foreach $value (values %arr2) {
print "$value\n";
}
sub COUNT{
open (IN, $filename)or die "$!";
while(<IN>){
$buff = $_;
chomp($buff);
@buff = split(/,/, $buff);
%arr2 =();
$arr2[] = @buff[];
$arr2[] = @buff[];
$arr2[] = @buff[];
close IN;
return %arr2;
}
}
whileの前に先に一行だけ読み込んでキーを作ってしまうべき何でしょうか。
ずっと堂々巡りで悩んでしまいました。
100nobodyさん:2005/10/20(木) 00:29:03 ID:???
>>99
>whileの前に先に一行だけ読み込んでキーを作ってしまうべき何でしょうか。

それが一番ラクだと思うけど。むしろ何故ソレを実行しないのかわからん。
101nobodyさん:2005/10/20(木) 00:32:14 ID:???
俺は

@buff = split(/,/, $buff);
%arr2 =();
$arr2[] = @buff[];
$arr2[] = @buff[];
$arr2[] = @buff[];

の意味が分からん。俺の知識不足。つまり

@buff = split(/,/, $buff);
%arr2 =();
$arr2[0] = @buff[0];
$arr2[1] = @buff[1];
$arr2[2] = @buff[2];

ってことなの?
102nobodyさん:2005/10/20(木) 00:36:48 ID:???
いや、普通は

$arr2[0] = shift(@buff);
$arr2[1] = shift(@buff);
...

だろうな。そもそもハッシュ使いたいっぽいからこれでも違うけど。
てか今はどうしていいかわからなくなってる状態だと思われ。
103nobodyさん:2005/10/20(木) 00:36:51 ID:???
>>99
これでいいのか分からんが。

count('test.csv' => \%data) or die 'Failed to count';
print "$_: ", join(' / ', @{$data{$_}}), "\n" for sort keys %data;

sub count {
  -f (my $file = shift) or warn('No such file'), return;
  open IN, '<' . $file or warn($!), return;

  my $hash = shift;
  my @key = <IN> =~ /\w+/g;

  while (<IN>) {
    chomp;
    my $i = 0;
    push @{ $hash->{$key[$i++]} }, $_ for split /,/;
  }

  close IN;
}
10499:2005/10/20(木) 00:47:28 ID:???
一行だけ先に読み込む案は書いてる途中で思いついたからです。
この次の段階としてCSVファイルの任意の部分だけを読み込み、書き換えよう
にしなくてはいけないので、できるだけ汎用性を持たせた関数を作るよう心がけるように
との事なので、悩んでいました。

配列のところはそのようにするつもりです。whileでまわして配列をハッシュに移すのに
途惑っていて流れが整理できなくなっていました。

家の環境ではすぐに試せないのですが皆さんいろいろアドバイスありがとうございます。
105nobodyさん:2005/10/20(木) 00:53:29 ID:???
>>104
そんな時にはActivePerl+AnHTTPDのPerlCGI再現セットがお勧め。
10699:2005/10/20(木) 01:20:15 ID:???
ぐぐって試してみます。情報どうもです。
107nobodyさん:2005/10/20(木) 01:46:11 ID:???
>>99
my @data;

open(IN, $file) or die $!;

(my $key = <IN>) =~ s/^#\s*|\n//g;
my @keys = split(/,/, $key);

for (<IN>) {
  chomp;
  local %_;
  @_{@keys} = split(/,/);
  push( @data, { %_ } );
}

close(IN);

---
結果、以下のように代入される。

@data = (
  { 'ID' => '0', 'NAME' => 'yamada', 'TEL' => '333', 'ADDRESS' => 'A32' },
  { 'ID' => '1', 'NAME' => 'tanaka', 'TEL' => '555', 'ADDRESS' => 'B22' }
);

アクセスは、
print $data[0]{NAME}; # yamada
print $data[1]{TEL}; # 555
108nobodyさん:2005/10/20(木) 02:51:02 ID:???
> モジュールも使えないのでよりどうしたらいいのかわかりません。
と書いてあるのは分かってるが、あえてCPAN モジュール版を。CSVって、
カンマで区切ってるだけと思ってる人も多いけど、泥くさいフォーマットだよ。

use strict;
use warnings;

use IO::File;
use Text::CSV;

my $parser = Text::CSV->new();

my $in = IO::File->new('test.csv', 'r')
or die('test.csv: ' . $!);

(my $field_names_line = <$in>) =~ s/^#\s*//;
$parser->parse($field_names_line)
or die('field keys are not found');
my @field_names = $parser->fields();

my @list = ();

while (1) {
my $row = $parser->getline($in);
last unless 0 < @$row;

my %hash = ();
@hash{@field_names} = @$row;

push(@list, \%hash);
}
@list = (...>>107 と同じ内容...);
109nobodyさん:2005/10/20(木) 17:31:51 ID:jR9yJZEc
質問です。
linuxサーバでパスワードの変更の際(passwdコマンド)に、
推測されやすいと判断をした場合、再入力を求めるようにするプログラムをperlで作る事は可能でしょうか?
可能な場合はどのような設置をすればよいのでしょうか?
110nobodyさん:2005/10/20(木) 19:47:09 ID:???
>>109
単なる興味で聞くが、推測されやすいかどうかという判断を、どんな内容にする予定なの?
111nobodyさん:2005/10/20(木) 19:53:12 ID:???
>>109
passwdコマンドにそのチェックをする機能を追加した
ようなものをperlで書いてもとのpasswdコマンドを
置き換えてしまうのが一番楽じゃないかと思われ。
112nobodyさん:2005/10/20(木) 20:01:43 ID:???
>>111
そのようなものを >>109 が書けるか甚だ疑問な件。
113nobodyさん:2005/10/20(木) 20:31:40 ID:???
>>109
可能。だが、その質問をしている時点で現在の>>109には敷居が高いだろう。

また、いくらシステム側で対処しても、
その手の脆弱性の根本部分はユーザーのセキュリティー意識にある。
「推測されにくいパスワードを使う」ことと教えてあげる方がよい。
114nobodyさん:2005/10/20(木) 20:45:15 ID:jR9yJZEc
>>110
例えば、4桁未満は駄目とか、数字のみは駄目等です

>>112
それはpasswdコマンドを書き換えるのはどこを操作すればよいのでしょうか?
また、perlで無くてもっと簡単にかける方法は無いものでしょうか
(どのファイルをどのように書き換えたらよいか等)

>>113
全くその通りなんですけど、自分の今後の為にと思いまして。
115110:2005/10/20(木) 20:59:52 ID:???
>>114
> 例えば、4桁未満は駄目とか、数字のみは駄目等です

これって既に、生の passwd コマンドが実装している機能では?
同じ機能を Perl で再実装したいって思うのは自由だけどね。

とりあえず、passwd のマニュアルページとソースコードを読んでみることをお勧めします。
116nobodyさん:2005/10/20(木) 21:03:16 ID:???
関係ないけど、 getpass() が欲しいことがよくある。
117nobodyさん:2005/10/20(木) 22:05:06 ID:???
>>114
その質問レベルを見る限りではpasswdコマンドをどうこうしようとか
思う前に基本を勉強した方がよさそうだな...
118nobodyさん:2005/10/20(木) 22:29:24 ID:???
>>117
同感
rootで動くためにはパーミッションに細工した上で実行時にIDを変えてやる必要があるが、
この方法を知らないようなレベルで作ろうとしてもセキュリティホールを作ってしまう危険の方が高いと思う…
11999:2005/10/21(金) 00:50:33 ID:???
質問なのですが>>107さんのソースを実行してみたところ
4つめのキーの部分が出てこないのはどうしてでしょうか?
少しソースを変えていますが、
スカラーで確かめてみるとハッシュのキーは4つ確保されているのにADDRESSの項目だけが
表示されません。よろしくお願いします。
120nobodyさん:2005/10/21(金) 01:18:14 ID:???
>>119
>ハッシュのキーは4つ確保されているのに
じゃあそのキー名出してみ
121119:2005/10/21(金) 01:28:01 ID:???
表示は
print $data[3]->{ID};
print $data[3]->{NAME};
print $data[3]->{TEL};
print $data[3]->{ADDRESS};
のようにやっています。

4つ目のキーがうまくついていないのでしょうか。
122nobodyさん:2005/10/21(金) 01:35:25 ID:???
>>121
たぶん改行コード。shift_jisで書いてない?
123nobodyさん:2005/10/21(金) 01:41:21 ID:???
>>116
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_do_I_ask_the_user_for_a_pass

>>119-122
改行コードが原因なら

- (my $key = <IN>) =~ s/^#\s*|\n//g;
+ (my $key = <IN>) =~ s/^#\s*|\s*\z//g;

ASCII 互換なら文字コードは関係無い。
124nobodyさん:2005/10/21(金) 01:47:44 ID:???
>>107のコードは>>99には難し過ぎやしないか?
結果を出すことよりも動作を理解するほうが先だと思うのだが。
125nobodyさん:2005/10/21(金) 01:59:13 ID:???
いろいろありがとうございます。
改行コードかも知れません。最初の読み込みではずしてしまっているみたいなので。
いろいろ試してみます。
これとは別なcsvなのですがこちらの値は"yamada" のように"とタブでで区切っていていてこれを
=~ s/" //g;
ではずそうといろいろいじてるうちになってしまったみたいです。
こちらは今何とか自分で試行錯誤しています。
ありがとうございました。
126nobodyさん:2005/10/21(金) 02:39:27 ID:???
>>123
修正サンクス。

あと、細かいけどこっちの方がよかった。展開が減るので。

-  push( @data, { %_ } );
+  push( @data, \%_ );

>>125
改行の取り扱い不足でした。sorry。

> これとは別なcsvなのですがこちらの値は"yamada" のように"とタブでで区切っていていてこれを
> =~ s/" //g;

tab 文字も \s でマッチするので

s/"\s*//g;

がおすすめ。
127nobodyさん:2005/10/21(金) 04:21:29 ID:???
>>126
\%_ にするんだったら local %_; じゃないほうがよいのでわ。
Excelなら、クオーテーションは Perlメモ の CSV の項を読むといいと思う。
128nobodyさん:2005/10/21(金) 04:30:43 ID:???
>>127
local $_ は単に global な %_ を壊さないようにしている
のだけど(このコードだと不要だけど)、
それ以外にデメリットってあります?
129nobodyさん:2005/10/21(金) 04:32:11 ID:???
正:local %_ は
130128:2005/10/21(金) 04:40:25 ID:???
というか、>>107 の場合、local をつけないと、以前 push した
値を上書きしまいますね。


まぎらわしいので my 変数の方がいいのでは、ってことですね。
131nobodyさん:2005/10/21(金) 15:03:57 ID:???
sousou
132nobodyさん:2005/10/21(金) 15:24:58 ID:???
local %_ って名前を考えるのが面倒だっただけだろ?
133nobodyさん:2005/10/21(金) 17:35:12 ID:???
しつもんです。
アンケイートをつくっているのですが、

【hoge.html1】
<FORM ACTION="hoge1.cgi" METHOD="post">→送信→log1
【hoge.html2】
<FORM ACTION="hoge2.cgi" METHOD="post">→送信→log2


【hoge.html1】
<FORM ACTION="hoge.cgi" METHOD="post">→次へ→この分をまずlog3へ
【hoge.html2】
<FORM ACTION="hoge.cgi" METHOD="post">→送信→log3→おわり

てしたいんだけど、(2つのフォームの内容繋げて一気に送ってlog残したい)
どんなソース書けばいいですか?




134nobodyさん:2005/10/21(金) 17:38:17 ID:???
そこはかとなくスレ違いのような気がするがいかがか?

javascript でも勉強したら?
135nobodyさん:2005/10/21(金) 20:29:51 ID:???
>>133
一意のIDをcookieか何かで発行する、いわゆる「セッション」を使うのが普通だが、
htmlで、と言われると困る。mod_rewriteでも使って誤魔化すか。
で、言語は何よ?
136nobodyさん:2005/10/21(金) 20:33:21 ID:???
ああ、ここにいるからperlに決まってるのかorz 最後の一文はスルーしておいて
137nobodyさん:2005/10/21(金) 20:49:56 ID:???

=~s/\Eアンケ(イ|ー)ト\Q/アンケ$1ト/g;
138nobodyさん:2005/10/21(金) 20:55:34 ID:???
QとE逆だろw
139nobodyさん:2005/10/21(金) 21:01:40 ID:???
それ以前にマッチしないじゃんw

>>133
元のhoge1.cgiとhoge2.cgiはコピーして2つにしただけでしょ?
1のクエリはすぐに処理せず
2のフォームのhiddenにでも入れておいたら?
140nobodyさん:2005/10/21(金) 21:03:44 ID:???
たしか JSスレの最近の過去スレにあったぞ
141nobodyさん:2005/10/22(土) 15:11:53 ID:m3HcshJv

フォームで入力後、WEBに以下のような感じでフィルに書き出すんですが


if(open(FILE,">>hogehoge.log")) {

$record .= $in{'name'}."\t";
$record .= $in{'kana'}."\t";

                     jcode::convert(\$record,'sjis');

print OFILE $record;
close(OFILE);

 

 name が空白でないかを書き込み前にチェックしたいのですが、うまく動きません。

以下の記述を入れるかと思いますが、どの行に入れたら動作するでしょう?

if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください"); }

以下のエラーが出ます。

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

よろしくお願いします。<(_ _)>
142nobodyさん:2005/10/22(土) 15:15:32 ID:???
143nobodyさん:2005/10/22(土) 15:27:16 ID:G1Q0Ugqh
OFILE なのか FILE なのかはっきりさせよう。
144nobodyさん:2005/10/22(土) 15:33:15 ID:m3HcshJv
>>142

エラー行が表示されました。ありがとうございます。<(_ _)>

>>143

OFILE と FILE の違いがよくわかっておりません。 ご教授下さい <(_ _)>
145nobodyさん:2005/10/22(土) 15:35:19 ID:m3HcshJv
>>142

Undefined subroutine &main::errexit called at /virtual/hogehoge.cgi line 18.


追記した↓この行があかんみたいです 
if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください"); }


146nobodyさん:2005/10/22(土) 15:43:00 ID:???
perlによるプログラミングを始めたところです。
知識レベルとしては、Cで普通にプログラムは書けますが、
perlは本当に始めたばかりです。

<質問事項>
基本の基本ということで以下のコードを書いたのですが
画面上に何も表示されません。(エラー等も表示されません)
printは画面(標準出力)に文字列を表示させると思っています。
コードもしくは認識に誤りがあるのでしょうか?

<コード>
■test.cgi
#!/usr/bin/perl

print "Program start\n";
print "Program end\n";

■実行方法
./test.cgi
■ファイルの属性
-rwxrwxrwx 1 root www 129 10月 22 15:37 test.cgi
■whichの結果
which perl
/usr/bin/perl
147nobodyさん:2005/10/22(土) 15:54:11 ID:???
> 知識レベルとしては、Cで普通にプログラムは書けますが、
・・・
148nobodyさん:2005/10/22(土) 15:55:01 ID:???
>>145
3行目に以下を追加。

sub errexit { print "\n", @_; exit; }
149nobodyさん:2005/10/22(土) 15:55:58 ID:???
>>146
CGIでの Hello World レベルくらい調べろよ。
150nobodyさん:2005/10/22(土) 15:56:02 ID:???
>>146
2行目に以下を追加。

print "\n";
151nobodyさん:2005/10/22(土) 16:01:09 ID:???
>>146
/usr/bin/perl ←これがすぐに終了して何も返さないスクリプトに入れ替えられてる
152nobodyさん:2005/10/22(土) 16:04:32 ID:m3HcshJv
>>148

ご指導ありがとうございます。

文字列が入ってても以下のメッセージが表示されます。

「お名前は必ず入力してください。」
153nobodyさん:2005/10/22(土) 16:10:34 ID:???
>>152
問題が再現する最短のコードを載せるべし。
154nobodyさん:2005/10/22(土) 16:14:10 ID:m3HcshJv
>>153 すいません。

#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
sub errexit { print "\n", @_; exit; }

require "cgi-lib.pl";
require "jcode.pl";

if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください。"); }

if(open(OFILE,">>hogehoge.log")) {

$record .= $in{'name'}."\t";
print OFILE $record;
close(OFILE);

#フォームの表示

print "Content-type: text/html\n\n";
print qq!
<HTML>
<HEAD>



155nobodyさん:2005/10/22(土) 16:17:36 ID:JX8EwRu8
perlで質問です、よろしくお願いします。

「AAA AAAA」と「BBBBBBB」というデータを保存する際にスペースで区切ったために
「AAA\ AAAA BBBBBBB」のようにデータ上のスペースの前には\を置いて保存されています、
またデータ上の\は\\で保存されています。
これを読み出すための簡約化された手順がありましたら教えてください。
とりあえずデータ上で9文字目が区切りであることを検出できればいいです。

それとも、フォーマットについてもっとこうするべきだというものありましたら
いまからでも変更の余地がありますので提案お願いします。
156nobodyさん:2005/10/22(土) 16:20:06 ID:m3HcshJv
>>153

if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください。"); }

↑この行を省くと動作するのですが、空白でも post してしまいますので。
157nobodyさん:2005/10/22(土) 16:22:39 ID:???
>9文字目が区切りである

固定長なら \ でエスケープする必要ないんじゃ?
158nobodyさん:2005/10/22(土) 16:28:45 ID:???
>>154
$in{"name"}
$FORM{"name"}
これはどこで取得してるんだ?
159nobodyさん:2005/10/22(土) 16:34:17 ID:m3HcshJv
>>158 すいません。

<HTML>以下のフォームにて取得してます。

<FORM ACTION="hogehoge1.cgi" METHOD="post" name="FORM" id="FORM">



<td colspan="2" nowrap><font size="3">ご氏名</font></td>
<td height="25"><input type="text" name="name" style="ime-mode: auto;" size="30">
</td> </tr>

160nobodyさん:2005/10/22(土) 16:35:29 ID:???
>>159
それは渡す方だろ。
受け取る方の話。
161nobodyさん:2005/10/22(土) 16:41:24 ID:m3HcshJv
>>160 すいません。

FORM ACTION で name に入力された文字が代入されて

$record .= $in{'name'}."\t";

のところで タブ入りで record に渡されて

hogehoge.log ファイルに書き込むのと違うのですか?
162nobodyさん:2005/10/22(土) 16:44:35 ID:JX8EwRu8
>>157
9文字の固定長ではありません。
サンプルに対して取得したいデータが9であるという、あくまでも例です。

やはり自分で1文字ずつ検証して作るしかないでしょうか?
163nobodyさん:2005/10/22(土) 16:47:54 ID:???
>>161
えーっとだ。
>>152でHTMLから送信してもエラーが出ちゃうと言う問題だろ?
書き込むとかどうでもよい。
受け取りができてないのよ。
cgi-lib.pl使ってるみたいだから↓読んで。
http://www.futomi.com/lecture/form/cgilib.html
164nobodyさん:2005/10/22(土) 16:48:31 ID:???
>>162
区切り文字変えるのが早い。
165nobodyさん:2005/10/22(土) 17:05:01 ID:m3HcshJv
>>163 参照URL迄、すいません。

以下の感じでよろしいんでしょうか?


my %input;
&ReadParse(\%input);

$YourName = $input{'name'};

if ($FORM{'YourName'} eq "") { &errexit("お名前は必ず入力してください。"); }
166nobodyさん:2005/10/22(土) 17:05:32 ID:???
>>154 の頭の中では $FORM{'name'} と $in{'name'}. が同じなのかな。
167nobodyさん:2005/10/22(土) 17:06:19 ID:???
>>165
こいつすげえ・・・。
168nobodyさん:2005/10/22(土) 17:09:47 ID:???
>>165
違う。

my %input;
&ReadParse(\%input);
if ($input{'name'} eq "") { &errexit("お名前は必ず入力してください。"); }
--以下保存処理

あと、試してから聞きなさい。
169nobodyさん:2005/10/22(土) 17:25:59 ID:???
そろそろ釣り宣言
170nobodyさん:2005/10/22(土) 17:30:16 ID:m3HcshJv
>>168 ありがとうございます。

入力文字があっても 以下のメッセが表示されます。(・_・、)

"お名前は必ず入力してください。"
171nobodyさん:2005/10/22(土) 17:38:30 ID:???
>>170
変数に何が入ってるかわからんのなら、printしてみようね。
あと、めんどいからどっかにCGIプログラムとHTMLのソースうpしる。
172nobodyさん:2005/10/22(土) 17:47:29 ID:???
一度ReadParseしないで書いてみては。勉強になるし。
173nobodyさん:2005/10/22(土) 18:02:37 ID:m3HcshJv
>>171 すいません、よろしくお願いします。

http://other.free-uploader.com/up/

hoge_1.cgi です。
174nobodyさん:2005/10/22(土) 18:07:29 ID:???
>>173
Passがかかってて落とせません。
175nobodyさん:2005/10/22(土) 18:14:20 ID:m3HcshJv
>>174

たびたび、すいません。

0123
176nobodyさん:2005/10/22(土) 18:18:44 ID:???
&ReadParse;
if (!$in{'name'}) { &errexit("お名前は必ず入力してください。"); }
177nobodyさん:2005/10/22(土) 18:19:41 ID:???
&ReadParse 呼ぶのは1度だけ
178nobodyさん:2005/10/22(土) 18:27:02 ID:vPMo38wN
これftpソフトで落としたいんですけど、user名とpassのところには何を入力すればいいんですか?
http://allabout.co.jp/career/cgiperl/closeup/CU20040805A/index4.htm
179nobodyさん:2005/10/22(土) 18:30:55 ID:???
>>178
anonymous と きみのメルアド
180nobodyさん:2005/10/22(土) 18:36:12 ID:m3HcshJv
>>177 解析ありがとうございます。

ひとつを消したんですが、結果は

>>170 と同じです。 (×_×)
181178:2005/10/22(土) 18:39:17 ID:???
182nobodyさん:2005/10/22(土) 18:41:13 ID:???
member_1.cgi と hoge_1.cgi は別もの?おなじもの?
hoge.tmpl も見当たらないし。

in っていう名前の hash と input っていう名前の hash が存在してるようだけど、
タイプミスかな?意味があって別な変数名にしてるのかな?

183nobodyさん:2005/10/22(土) 18:42:05 ID:???
>>180

my %input;
&ReadParse(\%input);
if ($input{'name'} eq "") { &errexit("お名前は必ず入力してください。!"); }



if ($in{'name'} eq "") { &errexit("お名前は必ず入力してください。!"); }
184nobodyさん:2005/10/22(土) 18:43:36 ID:???
つか 最初の &ReadParse; の後に↑を書け。
open FILE の中だと、ファイルが開いたまま終わることになるぞ。今はいいとしても。
185nobodyさん:2005/10/22(土) 18:46:02 ID:???
あと
print qq!
 ソース
!;

じゃなくてヒアドキュメントを使え。

print <<__EOT__;
 ソース中に ! をひとつでも書いたらそこで終了しちゃうだろ危うすぎ。
__EOT__
186nobodyさん:2005/10/22(土) 19:27:42 ID:???
>>183
おいおい
187nobodyさん:2005/10/22(土) 19:31:38 ID:m3HcshJv
>>186

すいません、レスが遅れまして

うまくいったと思って、 名前以外に電話番号とメールもチェックをして・・・
って やったら、
お名前は必ず入力してください。!

になりました。(・_・、)
188nobodyさん:2005/10/22(土) 19:55:02 ID:???
そうですか。
189nobodyさん:2005/10/22(土) 20:00:34 ID:???
釣り相手にいくつのレスを使うつもりだおまいら
190nobodyさん:2005/10/22(土) 20:06:29 ID:m3HcshJv
>>188  ほんとうにすいません。

結局うまく、行きません。

別ファイルでもいいので、他に良い方法ないでしょうか?
191nobodyさん:2005/10/22(土) 20:14:21 ID:???
> 他に良い方法
いちからべんきょうしなおす
192nobodyさん:2005/10/22(土) 20:28:02 ID:???
>>191 今まで、レスして頂いた 神様、

解決いたしました。

&ReadParse;
のすぐ下ではなくて、if(open(OFILE," の前の行に
貼り付けたら、いけました。

スレ汚し、すんませんでした。 <(_ _)>
193nobodyさん:2005/10/22(土) 20:44:35 ID:???
たとえば大文字と小文字が混雑している・・・
---test<DIR>----
AfIlE
bFiLe
----------------
というファイルがあるディレクトリがあるとき、
$file = "afile";
open(IN,$file);
〜〜略〜〜
というような形で、大文字小文字関係なくファイルを指定したいのですがどのような方法を使えばよいでしょうか?
194nobodyさん:2005/10/22(土) 20:55:29 ID:???
readdir とか glob とかでファイル読んでから正規表現でマッチさせて正しいファイル名を出すとか。
195nobodyさん:2005/10/22(土) 20:56:04 ID:???
%files = map {lc($_) => $_} glob '*';
open(IN,$files{'afile'});
ハッシュを使ってこんな感じとか。
196nobodyさん:2005/10/23(日) 03:47:54 ID:???
>>193
ファイル名が case sensitive なシステムでは AfIlE と aFiLe が
混在可能なので、afile と指定した時にどちらを指すのか判別
できない。よって正しく AfIlE と指定するか、実際のファイル名の
方を小文字に正規化した方が余計なハマり処を減らす事ができる。

ファイル名が case insensitive なシステムでは AfIlE と afile が
同じファイルを指すので、AfIlE を open する時でも afile と指定
できる。よってプログラム側では正確なファイル名を気にせず
全部小文字で指定してもよい。

それでも尚「大文字小文字関係なくファイルを指定したい」なら、
>>195 のように実際のファイル名と正規化したファイル名の
対応表を作る事になる。
197nobodyさん:2005/10/23(日) 11:32:59 ID:???
>>194-196
了解しました。ファイル名のシステムはよく分かっていないため、>>195さんのような方法をとることにします。
ありがとうございました。
198nobodyさん:2005/10/23(日) 15:14:57 ID:DuuvQiFd
Perl初心者です。
Perlでファイルを読み込む場合は open を使うと思うのですが
外部のファイルを読み込む(http経由)ときはどうすればよいですか?

例えばlinuxでいうと wget なんかは、外部ファイル(実行結果)を取得するのには最適ですよね。

perlだと 内部のindex.cgiをopenするとプログラム内容までもってきちゃいます。あたりまえですがね。

index.cgiの実行結果のみ持ってきたいので、http経由でopenできればとか思っているのですが。

wget http://www.yahoo.co.jp/

と同じようなことが出来るコマンドありませんか。
わかりにくい説明で申し訳ないんですが、要は実行結果部分のみ読み込みたいです。
ちなみにsystemコマンドでwgetという方法はなしで。
199nobodyさん:2005/10/23(日) 15:29:28 ID:???
>>198
LWPでググって見れ
200nobodyさん:2005/10/23(日) 15:29:44 ID:???
>>198
おれの勘ではモジュールを使うとできる。
201nobodyさん:2005/10/23(日) 16:49:13 ID:???
202nobodyさん:2005/10/23(日) 17:54:02 ID:GDjLAzvg
>>198
wgetを使って、そのまま内容を得ることもできる。
203202:2005/10/23(日) 17:57:42 ID:???
↑みすった。wget使わないでね。
socketでやるとモジュール無しでもいける。ヒント↓
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1;
select(STDOUT); $| = 1;
print S "GET $dir HTTP/1.0\r\n";
print S "Host: $host\r\n";
print S "\r\n";
while(<S>){}
close(S);
204nobodyさん:2005/10/24(月) 09:55:17 ID:???
LWP使えよ...
205nobodyさん:2005/10/24(月) 10:32:04 ID:???
>>202-203
こういう奴らが糞みたいな CGI を量産するんですね。
206nobodyさん:2005/10/24(月) 13:18:15 ID:???
>>205
おまいもマシなコードを量産しろ。
207nobodyさん:2005/10/24(月) 13:46:58 ID:???
(HTMLを取得するときにUAをLWPやらなんちゃらUSERAGENTモジュールを使って指定したくても何故かエラーがでて方法が分からない俺。)
208nobodyさん:2005/10/24(月) 15:28:55 ID:???
たまに、>>203みたいにエラーチェックを全くしない人がいるんだけど、
どういう理由でエラーチェックしないの?
209nobodyさん:2005/10/24(月) 16:19:03 ID:???
サンプルコードで、エラーチェックを入れるとポイントがわかりづらくなるときとか。
210mona:2005/10/24(月) 16:40:28 ID:???
かなり悩んでいます。どうかご教授くださいm(__)m 当方、CGIで掲示板を組んでおりまして

◎ファイル構造
・main.cgi(掲示板のトップページ、フォームあり)
・confirm.cgi(書き込み内容確認)
・regist.cgi(書き込み専用 HTMLによる出力はなし)
・finish.cgi(書き込み完了ページ)
・value.pl(独自に作成した変数、サブルーチンのセット)
・jcode.pl
・cgi-lib.pl
・log.cgi(ログファイル)

@main.cgi→ main.cgiのフォームに入力した後、送信ボタン(submit)でPOST送信
Aconfirm.cgi→ main.cgiから$ENV{'CONTENT_LENGTH'}で値を受け取ってsplitで各変数にばらし、
 [この内容で書き込みボタン]が押されたら、それをまたPOST送信でhiddenで1つずつ送信。
Bregist.cgi→ confirmからきた値をAと同じように$ENV{'CONTENT_LENGTH'}で受け取って
 splitでばらし、各変数に値を格納、時刻の取得、トリップ処理、フィルタリング処理(\n\r→<br>など)をした後、
 ログファイルからデータを読みこんで(それまでのデータを読み込んで、すべてを上書きする形を
とっていますので・・)ログファイル書き込み。そのあと、すぐにfinish.cgiへロケーションヘッダで飛ばす。
Cfinish.cgi→ 書き込み完了しました画面が出るので、掲示板へ戻るリンクをクリック。
Dmain.cgi 最初の掲示板に戻ってきます。

という流れなのですが、不明な点が2つありまして、

続く
211mona:2005/10/24(月) 16:41:31 ID:???
まず1つ目は
例えば、@で改行を含む、本文を

あいうえお
かきくけこ

と、フォームに入力して送信した場合に、
confirm.cgiの内容確認で同様に

あいうえお
かきくけこ

と、改行して表示してほしいのですが、うまくいきません。confirm.cgiで画面出力する前に、&data_filter($message); などとすると
書き込むリンクのとなりへ

  かきくけこ
>

などと出力されてしまうのです。そしてそれを書き込んでmain,cgiで見た結果は

無題  New!
名前: 名無し 投稿日: 2005/10/24 (月) 16:15:11

あいうえお<br

です。もちろん改行はされていませんorz

つづく
212mona:2005/10/24(月) 16:42:35 ID:???
データの受け渡しに問題があると思うのですが、うまく改行する方法をご教授ください;

2つ目は、トリップ機能を使って

名前欄に モナー#1234と入力した場合に、 名前: モナー「。tr.t4dJfuU のように文字化けを起こしてしまうのです。
トリップ部分はきちんと10桁 表示されているので、#の部分で不具合が起きているのだとは思いますが・・。

ちなみに、mona-#1234 などと、アルファベットで入力すると、きちんとmona-◆tr.t4dJfuU のように
出力されます。でもひらがな、カタカナ、アルファベット、どの場合の入力でも
◆を◇には置換してくれません。。この機能、ちゃんと動いたんですが…(1つのCGIで入力&出力してたときは)
なので、この#の文字化け&◆→◇の処理がうまくいかない理由を、教えてくださいorz

以下、ソースです。

main.cgi
ttp://imbbs1.net4u.org/1/sr3_bbss/4874isimin/65_1.txt
confirm.cgi
ttp://imbbs1.net4u.org/1/sr3_bbss/4874isimin/66_1.txt
regist.cgi
ttp://imbbs1.net4u.org/1/sr3_bbss/4874isimin/67_1.txt
finish.cgi
ttp://imbbs1.net4u.org/1/sr3_bbss/4874isimin/68_1.txt
value.pl
ttp://imbbs1.net4u.org/1/sr3_bbss/4874isimin/69_1.txt
213nobodyさん:2005/10/24(月) 17:05:43 ID:???
>>208
長くなるんで必要なところだけ出したんですけど・・・
214nobodyさん:2005/10/24(月) 17:11:26 ID:???
>>205
では、socket使ったまともなコードを要約して教えて下せー。
215nobodyさん:2005/10/24(月) 18:31:56 ID:???
>>212
ソースを見たところ、日本語を扱うにあたって、注意を払っている
形跡が何も見当たらない。ここでも読んで、勉強してください。その上で
解らないことを質問するといいでしょう。

http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
216mona:2005/10/24(月) 19:34:09 ID:???
>>215

ありがとうございます。

ちょっと勉強しますorz
217nobodyさん:2005/10/24(月) 19:55:08 ID:???
mona さんへ。

form から post されてくるデータを、&で split するとか、
それをさらに = でsplit するという処理を自分で書いてるけど、
それをやってもらうために cgi-lib.pl を require してるんじゃないのかい?

あ、ReadParse を使ってるところもあるね。。うーん、混乱してる。w
218nobodyさん:2005/10/24(月) 20:05:43 ID:???
>>213-214
エラーチェックも「必要なところ」だという意識の欠落を
指摘されているんだと思うよ。

LWP を使わず自前で HTTP を喋るにしても、最低でも
Socket.pm を使って定数のハードコーディングを避けるべきだろう。
それ以上は趣味の世界で人に勧めるものじゃないよ。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlipc.html#Internet_TCP_Clients_and_Servers

Socket.pm すら用意されていないような環境に対応する必要は無い。
それは管理者がやってほしくなくて故意に削除してあるのだから。

>>217
>>55
219nobodyさん:2005/10/24(月) 20:32:46 ID:???
ハードコーディングな方が多いこと・・・もっとファジーに生きましょう。
220nobodyさん:2005/10/24(月) 21:37:24 ID:t9lvkN6w
すいませんどなたか助けて下さい
ダイス機能のついてるCGIとして
KENTWEBさんのPONNY CHATを再配布されてるサイトさんから
DLさせてもらって、ちょっとチャットを作りたいのですが

↓スクリプトをいただいてきたところ
http://www.big.or.jp/~t-shun/trpg/trpg_cgi/dicechat/dchat03.html

↓自分で作りかけのチャット
http://firemind.maxs.jp/reidai/index.html

↓dicechat.cgiの中身(メモ帳にコピーしたもの)
http://firemind.maxs.jp/reidai/1.txt

よくメールアドレス欄を改造してPBCとかだとキャラクターのプロフィールを入れたり
普通のチャットだと今日の気分とかを入力したりするようにしたいのですが
初心者系のネット講座を見てもいまいち理解できませんでした
似たようなスクリプトを配布しているところがあったので応用できないかと思ったのですが
やはりエラーが出てしまいました
もしよろしければアドバイスをお願いします、
そうでなければ良いアドバイスのサイト、もしくは書籍を教えて下さい
素人の書き込みですいません
221nobodyさん:2005/10/24(月) 21:46:06 ID:???
[ ]で囲まれた単語をURLエンコードするには
どう書けばよいでしょうか。初歩的ですいません
222nobodyさん:2005/10/24(月) 22:18:02 ID:???
>>221

use CGI::Enurl;

$string =~ s/\[((.)+?)\]/[enurl($1)]/eg;

これでどう?
確認してないけど。
223nobodyさん:2005/10/24(月) 22:19:54 ID:???
>>221
ごめん間違えた。

use CGI::Enurl;

$string =~ s/\[((.)+?)\]/"[".enurl($1)."]"/eg;


print $string;
224220:2005/10/24(月) 22:28:03 ID:???
すいません、スクリプト改造スレを見つけました
板違な事を書き込みまして申し訳ありませんでしたスルーして下さい(平伏)
22599:2005/10/24(月) 23:45:35 ID:???
たびたびで申し訳ないですが、以前教えていただいたCSVからのハッシュへの読み出しですが、
ハッシュに入れたものを指定した値を書き換えて別なCSVに出力するにはどうしたらいいのでしょうか。

CSVの中身
ID,NAME,ADDRESS,TEL
0,yamada,A32,333
1,tanaka,B22,555

sub write{
@arr;
open (IN, "+<$file")or die "$!";
#キー作成
(my $key = <IN>) =~ s/^\s*|\s*\z//g;
my @keys = split(/\t/,$key);
#ハッシュ代入
for(my %hash = <IN>){
chomp %hash;
chop;
@hash{@keys} = split(/\t/);
push( @arr, {%hash});
}
でprint $arr[13]->{ID};  print $arr[1]->{NAME};
のように関連付けて扱えるようになったのですが
$arr[2]->{ID} =~ s/$arr[2]->{ID}/5/;
で置き換えをしたものをCSVに入れることが出来ません。
foreach my $buff(@arr){
  print OUT "$buff\t";
}
では無理でこんがらがってしまいました。
アドバイスをお願いします。
226nobodyさん:2005/10/25(火) 00:03:26 ID:???
> たびたびで申し訳ないですが、
そう思うんだったらちょっとは自分で考えろよ。
基本的なアルゴリズムも分からないんだったら出直してこい。
227nobodyさん:2005/10/25(火) 00:36:09 ID:???
Perlコーティングは無関係ですが無償でexe化する方法(コンパイラ)は存在しますか?
228nobodyさん:2005/10/25(火) 00:38:46 ID:???
>>227
perlcc
229nobodyさん:2005/10/25(火) 02:36:58 ID:???
>>225
前から思ってたんだけど、それ宿題か何か?
230mona:2005/10/25(火) 09:26:27 ID:???
>>217

そうです、今まではすべて、cgi-libのReadParseで事を、済ませていたのですが
ReadParse使わなくてもできるようにしておいたほうがいいかなということで
処理を自分で書いています。まだ残ってるReadParseは、その名残です。。
書き換え忘れというか・・・orz

にしても、いまだ正常に動きません…。
231225:2005/10/25(火) 09:37:32 ID:???
はいそうです。課題なんですが、どんどん機能を追加していくので。
ロジックが詰まってどうしたら良いのか進まなくなってしまいます。
発想の転換がうまくできないもので。
すいません
232nobodyさん:2005/10/25(火) 09:56:41 ID:???
>>231
答えを聞いてばかりでは勉強にならないよ。
テキスト読むなり、自分で調べるべし。
233nobodyさん:2005/10/25(火) 10:21:14 ID:???

会員認証ごとの認証をおこなった後にその認証情報に基づいたページを作る場合、クッキーを利用する方法と、都度HIDDENで情報をひっぱる方法のどちらが良いのでしょうか?
ちなみに、携帯でもアクセスする可能性が大なサイトを作ろうと思っています。
やっぱりHIDDENの方が無難なのでしょうか?
234nobodyさん:2005/10/25(火) 10:59:58 ID:???
>>233
携帯だとそもそもクッキーをサポートしてない方が多かったと思う。
235nobodyさん:2005/10/25(火) 12:12:56 ID:???
>>231
課題は自分でやれ。
ここ自助努力をサポートする場所であって、お前の家庭教師じゃないよ。

>>233
携帯は Cookie 使えん機種が多いので NG。セッション管理を Web アプリ側で
行なって、セッション ID を Cookie ではなく type="hidden" で引っ張るのが吉。
236nobodyさん:2005/10/25(火) 15:43:33 ID:???
すみません。引数でhtmlのファイル名を指定し、そのhtmlを読み込んで表示する、
というCGIを作ろうとして、下記のようなものを作ってみました。

#!/usr/bin/perl -w
use CGI;
use CGI::Carp qw(fatalsToBrowser);
my ($form, $ht, $datafile, $data_line, $dir);
$dir = './test';
$form = new CGI;
print "Content-Type: text/plain; charset = shift_jis\n\n";
$ht = $form->param('ht');
$datafile = $dir."/".$ht."html";
open(FH, $datafile);
@list = <FH>;
foreach $data_line( @list ) {
print $data_line;
}
close (FH);

これを実行してhtmlを表示しようとしたのですが、うまく表示されません。
できましたら修正のヒントを教えてもらえますでしょうか?
237nobodyさん:2005/10/25(火) 15:53:37 ID:???
238nobodyさん:2005/10/25(火) 15:56:07 ID:???
>>236
せっかく fatalsToBrowser 使ってるんだから、せめて
openのエラーはチェックしろよ。

open(FH, $datafile) or die "cannot open $datafile: $!";

ぐらいでいいからさ。
239236:2005/10/25(火) 16:16:12 ID:???
>>238
openのエラーチェックしたら、見事にミスってました。

$datafile = $dir."/".$ht."html";

のところで拡張子のピリオド付け忘れてました_| ̄|○

修正したら無事表示されました。

ありがとうございました。
240nobodyさん:2005/10/25(火) 18:33:41 ID:???
241nobodyさん:2005/10/25(火) 20:18:09 ID:acj/FLSv
以下は、プログラムの内容をcat して、プログラムに読ませるデータファイルをhexdump して、
実際にプログラム test.pl を実行している様子です。
なぜ、ファイル data の最後の行が表示されてしまうのでしょうか。
最後の行の末尾には改行文字がないので、最後の行(内容は一文字のゼロ)を $line に読み込んだ直後に、
while を抜けるはずだと予測したのですが。

%cat test.pl
#! /usr/local/bin/perl
while ($line = <>) {
print $line;
}
%hexdump -C data
00000000 33 0a 32 0a 31 0a 30 |3.2.1.0|
00000007
%./test.pl < data
3
2
1
0

# 最後の行に改行文字を持たないファイルは、truncate コマンドを使って作成しました。
242nobodyさん:2005/10/25(火) 20:43:30 ID:???
>>241
perldoc perlop を見るとわかると思うけど、
while ($line = <>) { } は while (defined($line = <>)) { } と等価なので。
243nobodyさん:2005/10/26(水) 03:47:32 ID:WCtFX3bD
画像掲示板を作ろうとしているのですが、
一度アップした画像を、最大記事件数を超えた時点で削除する
プログラムを書いていたのですが、どうしてもうまくいきません。

一個一個の記事に、画像のアドレスが$file_nameとして入っていて、
if($file_name ne ''){ push (@img_dels , "./img/$file_name"); }
で、最大記事件数を超えた分の記事に付いている画像のアドレスを配列に入れて、
unlink @img_dels;
としても、きちんと画像が削除されません。

if(-e )を使って調べてみると、
./img/$file_nameでは、存在しないことになっており、
一方、./img/2005001.jpgというように、具体的な値をプログラム内に入れれば
問題なく削除できるのです。

つまり、変数$file_nameを使っているとうまく作動せず、
その変数の部分を、何か具体的なファイル名を入れてみると、
きちんと動作するのです。

なので、パーミッションの問題ではないかと思うのですが、
他にどういった点が怪しいのでしょうか?

以上、よろしくお願いいたします。
244殿ツー:2005/10/26(水) 03:57:46 ID:LPzVqbnP BE:257687074-
導入法がわからんとです
どなたかお力添えくださればうれしいとです
まずなにをインストールすればいいとですか??
245nobodyさん:2005/10/26(水) 04:58:25 ID:???
>>243
$file_name にファイル名以外の文字が入ってたりとか足り無かったりとかくらいしか思いつかないな。
246nobodyさん:2005/10/26(水) 07:33:22 ID:???
どうせ改行コードとか入ってるんだろ?
247nobodyさん:2005/10/26(水) 10:42:10 ID:???
248nobodyさん:2005/10/26(水) 11:59:37 ID:???
>>243
おかしいと思う部分の変数をprintしてみる。
基本でしょ。
249nobodyさん:2005/10/26(水) 14:39:04 ID:???
元データは
1<>あああ<>
2<>いいい<>
3<>ううう<>

@testに上記データの読込
$hikakuに比較する変数
$bbb_newは$aaaが合致した場合に入れる

foreach (@test) {
    ($aaa,$bbb) = split(/<>/);
    if ($hikaku eq $aaa){
        push(@test_new,"$aaa,$bbb_new");
    } else {
        push(@test_new,"$aaa,$bbb");
    }
}

全上書きで@test_newをデータ書き込み

こんな感じで、要はデータ修正用のものを組んでみたのですがなぜかこれを走らせる都度先頭に半角スペースが入ってしまいます。

1<>あああ<>
 2<>いいい<>
 3<>ううう<>

なぜなんでしょうか?
250nobodyさん:2005/10/26(水) 15:01:26 ID:???
>>249
もしかして出力処理で
print "@test_new"
とかダブルクォーテーションで括ったりしてない?
251nobodyさん:2005/10/26(水) 15:03:54 ID:???
改行コード間違えてんじゃね?
走らせるって@test_newをprintするとってことか?

そもそも

push(@test_new,"$aaa,$bbb_new");



push(@test_new,"$aaa<>$bbb_new");

にしたいんじゃないかと
252249:2005/10/26(水) 15:11:27 ID:???
>>250
>>251
すいません。カキコ時ミスでした。
そうです。
push(@test_new,"$aaa<>$bbb_new<>\n");
です。

保存時は
&Memory2($dataname,"@test_new");

…とし、保存時流用のため、サブに飛ばしています。
そのサブは以下のようにしています。

sub Memory2 {
    local ($param) = @_[0];
    local (@param2) = @_[1];

    open(OUT, "> $param");
    print(OUT @param2);
    close(OUT);
    chmod(0666,$param);
}
253nobodyさん:2005/10/26(水) 15:13:11 ID:???
…お前何の本見ながら勉強してんの?
254nobodyさん:2005/10/26(水) 15:28:49 ID:???
>>252
> &Memory2($dataname,"@test_new");
                ~~~~~~~~~~~~~
しっかり括ってるじゃないか・・・原因はこれ
ダブルクォーテーションで括った場合の配列変数の展開は以下と同等
join(@array, $")
$"のデフォルト値は半角スペースだからこういうことになる。

&Memory2($dataname,@test_new);
とすればよい
255254:2005/10/26(水) 15:30:08 ID:???
うへ、joinの引数順間違えた
join($", @array)
が正解
256249:2005/10/26(水) 16:01:49 ID:???
>>254
&Memory2($dataname,@test_new);
…とすると1行目の変数しか書き込まなかったので、ダブルクォーテーションを付けていました。

サブに飛ばさず、
open(OUT, "> $dataname");
print(OUT @test_new);
close(OUT);
…とすれば、半角スペース問題が解決しました。

本当にありがとうございました!!
257nobodyさん:2005/10/26(水) 16:12:14 ID:???
>>256
ああ、スマソサブルーチンのほうをよく読んでなかった。こっちも間違ってるな
local ($param) = shift @_;
local (@param2) = @_;
とか
local ($param) = @_[0];
local (@param2) = @_[1..$#_];
とかにしないと。
でも、いまさらlocalは古いと思うが・・・
Perl4にも対応しなくてはならないということでなければmyを使うのがお勧め
my $param = shift;
my @param2 = @_;
258249:2005/10/26(水) 16:22:44 ID:???
>>257
ほんと、重ね重ねありがとうございます。
無事、サブルーチンに渡してもうまくいくようになりました!!
259nobodyさん:2005/10/26(水) 18:29:58 ID:???
ファイルから探さずに、ディレクトリ読めばいいだけじゃないの?
260nobodyさん:2005/10/27(木) 18:26:04 ID:MmBYG7yb
すいません。
@flagの中に一つでも1があったら
1を返したいのですがよい方法があったら教えていただけないでしょうか?
今の所
if(@flag == 1 && $flag[0] == 1){
return 1;
}elsif(@flag == 2 && $flag[0] == 1&& $flag[1] == 1){
return 1;
}elsif(@flag == 3 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1){
return 1;
}elsif(@flag == 4 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1&& $flag[3] == 1){
return 1;
}elsif(@flag == 5 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1&& $flag[3] == 1&& $flag[4] == 1){
return 1;
}else{
return 0;
}
とやっているのですが不恰好なので。
261260 :2005/10/27(木) 18:29:10 ID:MmBYG7yb
あ、、、すいません。
>@flagの中に一つでも1があったら
じゃなくて@flagの中全部1だったらです。
262nobodyさん:2005/10/27(木) 18:44:52 ID:???
>>260-261
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o

sub check {
  $_ == 1 || return 0 for @_;
  1;
}

print check(@flag) ? 'OK' : 'NG';
263nobodyさん:2005/10/27(木) 19:43:10 ID:???
return @flag == grep($_ == 1, @flag) ? 1 : 0;
264nobodyさん:2005/10/27(木) 19:50:18 ID:???
>>263
それも思い付いたけど、@flag が (1, 1, 1, ..., 1) とかだと遅い。
265nobodyさん:2005/10/28(金) 01:41:57 ID:bf2gwUIh
foreach (@flag) {
 /(^0^)/;
 /(f^_^)/;
}
266nobodyさん:2005/10/28(金) 01:54:14 ID:???
orz=3;
267nobodyさん:2005/10/28(金) 06:37:45 ID:OMxdiAJ2
>>260
foreach (@flag){
 if($_ == 1){ return 1; }
}
じゃ駄目?

>>257
my($param, @param2) = @_;
ってやっちゃ駄目ですか?
自分のスクリプトではこうやって渡しちゃってるんですが・・・
268nobodyさん:2005/10/28(金) 06:48:30 ID:zLDMG+JK
>261
sub flagcheck{
  my(@flag) = @_;
  foreach (@flag){ if(!$_){ return 0; }}
  return 1;
}
269nobodyさん:2005/10/28(金) 06:49:19 ID:zLDMG+JK
sub flagcheck{
  foreach (@_){ if(!$_){ return 0; }}
  return 1;
}
これでよかったか
270nobodyさん:2005/10/28(金) 07:01:39 ID:???
超好みの問題だけども
if(!$_){ return 0;
より
return 0 unless $_;
の方が……どうでもいいか。
それより、0と1しか入っていないことは保障されてる?
271nobodyさん:2005/10/28(金) 07:11:26 ID:zLDMG+JK
>>270
書きながらそれは思ったけど、質問の段階で 0 と 1 しか出てこなかったので ^^;
1 以外が入ってれば … も考えるなら
if($_ != 1){ return $_; }
かな?
272nobodyさん:2005/10/28(金) 07:20:20 ID:???
unless ($_) { return 0; } または return 0 unless $_;
次の行に return $_;
個人的にだけど、否定だけで分岐する場合にはunlessが見やすいと思う。
273nobodyさん:2005/10/28(金) 07:33:02 ID:FKANG7gP
use strictを使うように心がけようと思い、ここ最近ののソースには書いているのですが、
requireしたファイルの中でグローバルを宣言するにはどうしたらいいのでしょうか?
requireしたソース中でmy宣言したらその中でしか見えず、エラーが出てしまいました
274nobodyさん:2005/10/28(金) 07:52:12 ID:???
>requireしたファイルの中でグローバルを宣言するにはどうしたらいいのでしょうか?
kentのように、1つの変数をずっと使うような設計は止めたほうがいい。

>requireしたソース中でmy宣言したらその中でしか見えず、エラーが出てしまいました
ソースのmyというか、スコープをもう一度勉強して。

むりやりstrictでエラーを出させないようにするなら、qw($hoge);
275nobodyさん:2005/10/28(金) 09:05:27 ID:???
>>273
274の言うように可能なら変数を見せなくてすむように設計を見直した方が
いい場合が多いが、どうしてもやりたいのならモジュールにしてimport/export
するのがいいんじゃないかね。
276nobodyさん:2005/10/28(金) 09:15:21 ID:FKANG7gP
レスありがとです。
requireした先でのグローバル確保したいってのは止めた方がいいというのは分かってはいるのですが・・・

やっぱ面倒くさがりはじめるとエラーが多くなるんでしょうかね。
出来る限り引数、戻り値を設定して呼ぶようソース見直します。

ありがとうございました。
277nobodyさん:2005/10/28(金) 09:23:34 ID:???
悪い癖を覚えないうちにアドバイス。
コーディングはファイルサイズ増えても、半角スペースとタブをうまく使うようにするといいよ。
あと、コメントも適度にあるといいね。
278nobodyさん:2005/10/28(金) 10:43:47 ID:???
>>273
参照/設定専用のサブルーチンを作ってそれでアクセスするようにすればいい。
オブジェクト指向で言うところのアクセサってやつ。
279nobodyさん:2005/10/28(金) 10:59:28 ID:???
my(@flag) = @_;
といったカッコをつけたコードはどういう意味があるのでしょうか?
280nobodyさん:2005/10/28(金) 11:10:09 ID:???
281nobodyさん:2005/10/28(金) 11:14:37 ID:???
多分こういうことを聞きたかったのかとエスパーしてみた。

myをまとめて指定する場合()でくくる必要がある。
別にmy @flag = @_;でも可
my ($hoge,@flag) = @_; としていて、$hogeを消した名残かもしれない。

my (@flag) = @_;
my ($foo, $bar);
my (@age, @sage); と連続して書く場合、見た目の為?に括弧くくりしてあるのも見かける。
282nobodyさん:2005/10/28(金) 11:26:27 ID:3fcMXuGT
my($a, $b);
ってする時に括弧をつけるので、見た目統一のために1つのみの宣言でも括弧を付けてます。
283279:2005/10/28(金) 12:31:13 ID:???
すみません281さんの通りです。
右辺のコンテキストを変えた、もしくはmyの適用範囲を指定したコーディングでもないのに
カッコを付けるのが紛らわしく感じたのです。
284nobodyさん:2005/10/28(金) 13:18:53 ID:???
>>267
> my($param, @param2) = @_;
> ってやっちゃ駄目ですか?
もちろん構わない
shiftを使って引数を取り出すかリストコンテキストで一気に代入するかは好みが現れる所だろうな

しかし、自分でも書いた後、説明とはいえ
> local ($param) = @_[0];
> local (@param2) = @_[1..$#_];
こんな回りくどいやり方は無いなと思った…しかも上間違えてるし$_[0]
285nobodyさん:2005/10/28(金) 13:36:59 ID:???
>>277
それ激しく同感。上手くタブとスペースを使い分けて書かれてるソースってめったに見られないよな

よくあるのがこういうインデントだけど、タブ幅が変わると悲惨なことになる
if (expression) {
____for (range) {
[_TAB__]{ #Some blocks
[_TAB__]____function(multiline,
[_TAB__][_TAB__]_____arguments)
[_TAB__]}
____}
}

漏れの思う理想形はこんな感じ。これならタブ幅がいくら変わっても適切なインデントで見られる
if (expression) {
[TAB]for (range) {
[TAB][TAB]{ #Some blocks
[TAB][TAB][TAB]function(multiline,
[TAB][TAB][TAB]_________arguments)
[TAB][TAB]}
[TAB]}
}
286nobodyさん:2005/10/28(金) 15:23:43 ID:???
>>285
上の例、ひどすぎないか?
tab size を 8 にして、indent size を 4 にしているということ?

> よくあるのがこういうインデントだけど、

よくあるのか・・・?
287nobodyさん:2005/10/28(金) 15:30:15 ID:???
>>286
そういうこと
Perlの標準モジュールとか見てみれ 大半がこんなだよつд`)
CGI.pmとかMemoize.pmとか
288nobodyさん:2005/10/28(金) 15:36:36 ID:???
>>286
同じソースを複数人で弄っていて、コーディング規約も何もない場合
tab と space が混在してもっとひどいことに・・・。
289nobodyさん:2005/10/28(金) 15:58:45 ID:???
>>286
Emacs のデフォルトがそんなんだったような。
漏れの思う理想形は、タブは一切使わず SPACE のみでインデント。
Emacs なら (setq-default indent-tabs-mode nil) しると。
290nobodyさん:2005/10/28(金) 16:52:13 ID:???
>>289
スペースのみか、それも良いな
でも、漏れが読むときは全部タブに置換することが度々
スペースで固定しちゃうと、その人の好みのインデント幅に合わせて
読めないというのがあるんだよなぁ…
# 個人的に、使い慣れてるエディタ上でのタブを表す→を、
# インデントとしてみるように目が慣れちゃってるのもあるのかも

まあ好みは人それぞれ分かれるから、他人のソースを読むときは
PerlTidyを通すのを習慣付けろってことか、これは
291nobodyさん:2005/10/28(金) 17:03:56 ID:???
インデントはタブ、関数など括弧の前後は半角スペースで統一してます。
292nobodyさん:2005/10/28(金) 17:37:38 ID:???
>>287
CGI.pm見たけどタブは使わずスペースのみだった。
293nobodyさん:2005/10/28(金) 17:43:28 ID:???
>>292
何かの間違いじゃ・・・
ttp://search.cpan.org/src/LDS/CGI.pm-3.11/CGI.pm
こことか。133行目付近
unless ($OS) {
unless ($OS = $^O) {
require Config;
$OS = $Config::Config{'osname'};
}
}
294nobodyさん:2005/10/30(日) 20:33:55 ID:???
お願いします。
ファイルハンドルを局所化することは可能でしょうか。
再帰したサブルーチンの中で毎回違うファイルを扱いたいのです。
295nobodyさん:2005/10/30(日) 20:49:09 ID:???
すみません、何も考えずに質問したわけではないのですが、書いた後に
ファイルハンドルへのリファレンスだか型グロブだか(よく理解していない)を
局所化した変数に入れておけば解決できるのではと思いつきました。
その方向で調べてみますが、方向性が間違っていましたら教えてください。
296nobodyさん:2005/10/30(日) 20:51:31 ID:???
オープン、処理、クローズまで一連の動作をするサブルーチンなら、難しいこと考えなくてもいいのでは。
引数にファイルを指定するぐらいかな?
297nobodyさん:2005/10/30(日) 21:05:36 ID:???
ちょっと込み入ったことになってまして、
オープン、処理、クローズの、処理の部分でもう一度再帰的に自分自身を呼び出しているので、
クローズする前に同じハンドルで別ファイルをオープンしてしまってるんです。
298nobodyさん:2005/10/30(日) 21:14:33 ID:???
299nobodyさん:2005/10/30(日) 21:59:42 ID:???
>>298
ありがとうございます!!そのままずばりの質問でしかもFAQということで
まことに恐縮です。おかげさまで解決しました。
300nobodyさん:2005/10/30(日) 22:45:36 ID:???
>>299
FAQに書いて無いようなので補足
モジュールが使える環境ならIO::Fileを使うことをお勧めする
301nobodyさん:2005/10/30(日) 23:02:00 ID:ZWocYOMF
初心者です。
意味を教えて、と言うものです。ごめんなさい。
既存のソースを使って勉強中に、フォームをデコードしたい部分で

read(*******略*******);
undef(%in);

というものが出てきました。
undef とはどういう関数なのでしょうか。
リファレンスで探してみたのですが、名前付き単項演算子として列記されているだけで、
解説が載っていませんでした(初心者向けだから?)
ぐぐってみたものの、他の項目の解説用のソースばかり出てきてしまい、
undef の解説が見つけられず、困っています。よろしくお願いします。
302nobodyさん:2005/10/30(日) 23:06:21 ID:???
見つからないわけねーだろ。
どういう調べ方してんだ。
303nobodyさん:2005/10/30(日) 23:09:40 ID:ZWocYOMF
pear undef
で検索してみたのですが…
何か手がかりがあれば教えていただきたいのですが。お願いします。
304nobodyさん:2005/10/30(日) 23:11:28 ID:???
>>302
まあまあ

>>301
Perlの組み込み関数は
perldoc -f 関数名
でマニュアルが見られる。ただし英語だけど。
日本語訳は
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod
http://www.att.or.jp/perl/man/perlfunc.1.html
このへん

で、undefがどういうものかというと、その変数の値を未定義にする関数。
まあ、その例ならば%inを空にすると考えてもらっても良いと思うよ
305nobodyさん:2005/10/30(日) 23:12:17 ID:???
>>303
ってpearじゃなくてper「l」だヾ(゚Д゚#)ノ゙ゴルァ
306nobodyさん:2005/10/30(日) 23:20:17 ID:ZWocYOMF
ありがとうございます。
(つづりまちがいは、ここに書いたときだけでした;)

ソースに undef(%in); と出てくるものの、 %in は後にも先にもここ一つなのですが…、
どこにも出てこない変数をクリアすることに意味はあるんでしょうか?
(もしかして、悪いモノを見本にしてしまったのでしょうか)
(呼び出しているプログラムは jcode.plのみです)
307nobodyさん:2005/10/30(日) 23:44:37 ID:???
>>306
多分、%in は使っていないけど、$in{.......}
は使っているというオチだろうな。
308nobodyさん:2005/10/30(日) 23:46:23 ID:???
>>306
%inじゃなくて$in{...}の形ででてきてるかもね。

しかし%inをundefして使いまわそうとしている
あたりあまり筋がよさそうではないので、手本に
はしないほうがいいんじゃないかなー。
309nobodyさん:2005/10/30(日) 23:48:12 ID:???
>>306
> (もしかして、悪いモノを見本にしてしまったのでしょうか)
模範的といえるような綺麗なPerlスクリプトって正直なかなか無いからねぇ。
現状良い見本を見て育った人のほうが少ない気もする
310nobodyさん:2005/10/30(日) 23:51:26 ID:???
駱駝本買っとけ
311nobodyさん:2005/10/30(日) 23:52:59 ID:???
>>308
myで宣言してスコープアウトで自動で破棄させるべき、かな
312301:2005/10/31(月) 00:25:50 ID:8r5lDkYL
本屋で買った、初心者用CGIの本を頼りにやっていたので
載っていないことが多かったのですが、
教えていただいたリファレンスとかも読んで、わかってきました。

これまでに、COBOLしかやったことがなかったので、
勘違いしていることもありました(汗

ありがとうございました。
313nobodyさん:2005/10/31(月) 00:27:31 ID:???
%inはcgi-lib.plからreadparseしてる予感!
314nobodyさん:2005/10/31(月) 00:33:54 ID:???
[TAB]ってなんですか?
315nobodyさん:2005/10/31(月) 00:37:35 ID:???
正規表現で使う「\t」の代替文字のことかな?
phpとかrubyでは良くみるけどperlで使えたっけ?
316301:2005/10/31(月) 00:50:00 ID:8r5lDkYL
>>313
cgi-lib.plは使ってないんです。

コボラーとしては、宣言もなしに変数がイキナリ使われていることに慣れません…
317nobodyさん:2005/10/31(月) 00:58:02 ID:???
>>316
use strict;してないのはそんなのばっかりですよ。
大手よりも細々とやってるとこの方が、意外としっかりしたコードかいてることが多いです。
kentのはジンマシン出るかもしれないので注意してください。
318nobodyさん:2005/10/31(月) 01:00:04 ID:???
>>316
英語アレルギーじゃないならCPANにあるソースでも読んでみると良いかもよ
http://www.cpan.org/scripts/index.html
319301:2005/10/31(月) 01:17:17 ID:???
use strict ってなんですか?
てか、[安全ではないコンストラクトを制限]と言われても
具体的にピンと来ないのですが・・・

自分で全部ソース書くよりも、
便利なモジュール使ったほうが間違いがない…ってことですかね。

Kent-webのCGIは、そのまま(改造とかナシで)使ったことがあります。
見た感じでは、ダラダラ〜っと大きいルーチンが書いてあって
読みづらいと思ったのですが(だからあんまり見てない)
見本にするには不向きってことですか?<ジンマシン
320nobodyさん:2005/10/31(月) 01:40:06 ID:???
>>319
use strictは一言で言えば安全にプログラミングするためのプラグマだが…
とりあえず、一番のご利益は宣言の強制かな
my宣言をせずにいきなり変数を使おうとすると
エラーにするなどの機能を有効にする。というようなのがuse strict 'vars';
my $hoge = 'hogehoge';
print $hage; # use strict;すれば$hageは宣言されて無いのでエラー
見たいなミスを予防したりできる。

Kentは・・・まあ見本にはお勧めしないとだけ言っておこうか
321nobodyさん:2005/10/31(月) 02:43:49 ID:???
KENTは悪い見本。最悪レベル。
いい見本は、コアモジュールのコードを読めばいいと思う。あと高いけど駱駝本
322nobodyさん:2005/10/31(月) 02:55:53 ID:???
駱駝本は長い目で見れば高くはないさ。
323nobodyさん:2005/10/31(月) 03:03:40 ID:???
>>321
良いにくいことをはっきり言うね…まあ同感なわけだけど
324名無し募集中。。。:2005/10/31(月) 03:15:06 ID:s3JdPwyc
ラクダ本見辛いって思うのは私だけ?
325301:2005/10/31(月) 03:24:24 ID:???
>>302
ありがとうございます。
VBで言うところの、Option Explicit みたいな役割ってことでしょうか。

またまた質問なんですが、グローバル変数の宣言は、
$hensu;
だけでOKなんですか?
my とか local に相当する言葉はナシで良いのでしょうか。
(my と localについての解説しか見当たらないので)
検索していて our というのも見つかりましたが…
326nobodyさん:2005/10/31(月) 03:42:25 ID:???
>>324
見るんじゃない、感じるんだ。

>>325
文法を 1 から 10 まで習うつもりか?
入門書か、perlsyn と strict.pm の perldoc ぐらい読んでから来いよ。
327321:2005/10/31(月) 10:23:36 ID:???
>>323
ま、ああいう言いにくいことは、自分のblogで書けないからね
ここでなら言っちゃってもいいかなーって思ってぶっちゃけたw
328nobodyさん:2005/10/31(月) 14:02:09 ID:???
かと言って初心者がC-Board見ても仕方無いだろうなあ
329nobodyさん:2005/10/31(月) 16:26:16 ID:mS98tkDz
文字列中の、<div id="aaa">から、それに対応する</div>までを消すにはどのように表せばいいんでしょうか?
<div id="aaa">から</div>までの間には、<div id="bbb">〜</div>とか<div id="cc">〜</div>とかがいっぱい入ってるんですが。。。
330nobodyさん:2005/10/31(月) 17:16:04 ID:???
divの数を数えればいいじゃん。
開きが見つかれば+1
閉じが見つかれば-1
0の時点で閉じがあれば、そこで終了。
331ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/31(月) 17:17:06 ID:???
use strict;
use warnings;

use HTML::TreeBuilder;


my $doc = HTML::TreeBuilder->new_from_file('test.html');

map { $_->delete() } $doc->look_down('_tag' => 'div', 'id' => 'aaa');

print $doc->as_HTML();

こんでいいかね。
332nobodyさん:2005/10/31(月) 17:34:43 ID:???
>>331
<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
戻り値をただ単に捨ててしまうような void 文脈で、grep() や map()、
`backticks` (訳注: `ls`のようにバッククォートで括った実行文のこと) を
使うことは避けましょう。そういった関数はすべて戻り値を持っているの
ですから、それを使うべきです。戻り値に用がないのであれば、代わりに
foreach() を使ったループか system() 関数を使いましょう。
</q>
333ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/31(月) 18:42:21 ID:???
>>332
あぁ、そうね。スマンカッタ。

$_->delete() for $doc->look_down('_tag' => 'div', 'id' => 'aaa');
334nobodyさん:2005/10/31(月) 22:40:16 ID:???
if($test == $sample){
print"OK!!\n";
}
$test =1, $sample =1,
の時変数が数字なのか文字列なのかそれとも両方混じっているのか分からない時の
演算子はどうしたら言いのでしょうか。
eqで事足りると思うのですが、文字列と数字は分けなくて演算子をつかわなくてはいけないそうなのです。

すごく初心者的な質問ですいません。
335nobodyさん:2005/10/31(月) 22:50:00 ID:???
>>334
たぶん宿題かなんかなんだろうが、お前はperlの前に
まず日本語を勉強しろ。何が言いたいのかさっぱり
わからん。
336nobodyさん:2005/10/31(月) 22:56:00 ID:???
>>334
使わなくてはいけない、ではなくて自分がその中身をどう扱いたいか。
数値として扱いたいなら==を使えば良いし、文字列として扱いたいならeqを使えば良い。
数値として扱うというのは、"1.0"と"001"みたいなのも同じ1とする。
文字列として扱うというのは、これらを別のものとして扱うということだ。
337336:2005/10/31(月) 23:01:33 ID:???
>>334 質問にちゃんと答えてなかったかな。補足。
数値として扱えない文字が入っているのに数値として扱おうとする場合、
それ以降は無視される(1q3 => 1)
数値が入っているか文字列が入っているかわからないときに比較したいということは、
1q3と1axが同じ、と判断されちゃまずいということだよな。なら文字列として扱えば良い
338334:2005/10/31(月) 23:43:09 ID:???
レスありがとうございます。
演算子で数字と文字列同じように使えるeqの方が便利だからと言う理由でeqを多く使っていたのですが、
計算するわけでもないので、無理して==を使う必要がなく、「いけないではなくどう扱いたいか」で
凄く納得がいきました。
解りやすく説明していただきありがとうございます。
339nobodyさん:2005/11/01(火) 00:15:10 ID:???
>>334
$hoge = "abc";
$hoge++;

一応こんなのも学んでおくといいかも
340334:2005/11/01(火) 01:06:49 ID:???
いろいろもう一度最初から見なおして見ます。
基礎的過ぎて詳しく説明しているところがあまりなかったので。
ありがとうございました。
341nobodyさん:2005/11/02(水) 15:33:18 ID:lpDOmIjl
2台のサーバーにCSVテキストデータとCGIを別々において
CGIからCSVを読み込むにはどのようにすればよいでしょうか?
お願いします。
342nobodyさん:2005/11/02(水) 16:22:11 ID:???
2台のサーバを統合する。
Socketモジュール系を使う
ftp.plライブラリを使う
343nobodyさん:2005/11/02(水) 16:27:42 ID:???
>>341
nfs, ssh, http, ftp あたりでデータのやりとりすればOK。
344341:2005/11/02(水) 16:38:32 ID:lpDOmIjl
>>342-343
返信ありがとうございます。
ftp.plライブラリはどのようにして使うんでしょうか?
また、テキストファイルを定期的に更新したいんですが
どのようにすればよいでしょうか?
お願いします。
345nobodyさん:2005/11/02(水) 16:41:06 ID:???
>>344
定期的な更新はcronコマンド。
ftp.plの使い方はググルのが吉。
346345:2005/11/02(水) 16:42:13 ID:???
↑我ながら「グルル」は良くないとおもた。
「ぐぐる」か「ググる」方が的確かl。
347nobodyさん:2005/11/02(水) 16:45:10 ID:???
さすがにグルルはだめでしょう
グルルは
348nobodyさん:2005/11/02(水) 17:19:18 ID:???
>>344
も少し詳しく書かないと分からないよ。

> また、テキストファイルを定期的に更新したいんですが
> どのようにすればよいでしょうか?

環境は? win? unix?
また、CGIスクリプトから更新したいの? 他のプログラムから?
349nobodyさん:2005/11/03(木) 17:31:58 ID:???
CGI.pmを使って,スクリプトの状態をファイルに書き出しています.

if($cgi -> param(save)){
open(OUT,"> ./test.dat") || die;
$cgi -> save(OUT);
close(OUT);
}

このように,テキストエリアとチェックボックスのフォームデータを保存して,
別のcgiファイルで,読み込みをしています.

#フォームデータの読み込み
$file = "./test.dat";
open(IN,$file) if (-f $file);
$cgi = new CGI(IN);
close(IN);

テキストエリアはきちんと保存値が表示されたのですが,
チェックボックスが全て未チェックの状態になってしまいます.

なにかチェックボックスでは処理が必要なのでしょうか?
350nobodyさん:2005/11/03(木) 17:50:23 ID:???
>>349
<input type="checkbox" name="hoge" value="hage" checked>
351nobodyさん:2005/11/03(木) 17:51:21 ID:???
>>349
チェックボックスをチェックOn状態にするにはchecked属性が必要というのは理解してる?HTMLの話。
CGI側はvalueを複数受け取るけどね。
352nobodyさん:2005/11/03(木) 17:54:36 ID:???
分かんないかも知れないから書き換え

pirnt $保存値 eq '保存値'
  ? qq|<input type="checkbox" name="hoge" value="hage" checked>
  : qq|<input type="checkbox" name="hoge" value="hage">|
 ;|
353nobodyさん:2005/11/03(木) 17:56:14 ID:???
>>352
事故レスorz

pirnt $保存値 eq '保存値'
  ? qq|<input type="checkbox" name="hoge" value="hage" checked>|
  : qq|<input type="checkbox" name="hoge" value="hage">|
 ;
354nobodyさん:2005/11/03(木) 18:50:59 ID:???
ファイルのオープンエラーをdieで終わらすのか・・
355nobodyさん:2005/11/03(木) 21:48:20 ID:???
チェックボックスのチェックをいれるには,checkedが必要だということは認識しています.
そうやって,デフォルト値を操作して,チェックを入れた状態で表示するのではなく,

$cgi = new CGI (IN);

こうやって,ファイルを渡してあげて,保存値を反映したいのです.
テキストエリアではこの方法が上手く使えたのですが,
チェックボックスでは保存値が反映されなかったのです.
どうにかして,チェックボックスに保存値を反映したいのですが,どうすれば良いのでしょうか?
という趣旨でした.混乱させてもうしわけありませんでした.
356nobodyさん:2005/11/03(木) 23:42:33 ID:???
>>355
ドキュメントを熟読して問題を切り分けよう。
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod

1. フォームから送られてくるデータはプログラムに渡される時点で
コントロールの種別に関係なく name=value の形になっているので、
テキストエリアなら受け取れるがチェックボックスでは受け取れない
という事が起こるならそれはフォームの書き方かブラウザがおかしい。

2. save メソッドはドキュメントにあるように human readable な形で
書き出してくれるので、まず全てのデータが正常に受け取れ、且つ
書き出せているかを確認。更にファイルハンドルを渡して生成した
CGI オブジェクトが全ての保存値を読み込めているかを Vars メソッド
等で確認。ちなみに >>349 の読み込みコードはファイルの読込権限
が無いと open に失敗するのでエラーチェックになっていない。

3. 読み込んだデータは 1. と同じく名前と値のペアの集合でしかない
ので、保存値を反映したフォームを出力したいなら、それらを適切な
要素に当てはめ直す作業が必要。→ >>350-353
357nobodyさん:2005/11/04(金) 01:23:13 ID:???
詳細なアドバイスありがとうございます.
順を追って確認してみます.
特にVarsの使い方を教えていただき感謝いたします.
358nobodyさん:2005/11/04(金) 10:40:02 ID:???
解決しました!
保存値はちゃんと渡せていましたが,チェックボックスの生成方法がオブジェクトを介さずに
CGI::checkbox と行っていたためでした.

みなさんほんとうに有り難うございました.
359nobodyさん:2005/11/04(金) 18:07:49 ID:???
use utf8で文字列内やヒアドキュメント内で変数展開をすると
変数の後ろの文字列も含めて変数と解釈されてしまいます。

"${str}文字列"
"$str\文字列"
$str . "文字列"

などのようにエスケープなり逐一処理するしかないのでしょうか?
360nobodyさん:2005/11/04(金) 18:56:28 ID:???
>>359
そりゃそうだ。

個人的にはソースに直接マルチバイトな文字リテラルを入れるのがそもそも
イカンと思うがね。
361nobodyさん:2005/11/04(金) 22:23:15 ID:???
勉強厨房でサーバー駆動に挑戦してますが
CPAN のエラーが出てモジュールを入れられなくてコマってます。

--01:20:02-- ftp://ftp.perl.org/pub/CPAN/authors/id/M/MS/MSCHWERN/CHECKSUMS.gz
(試行:18) => `-'
ftp.perl.org[163.143.1.21]:21 に接続しています... 接続しました。
anonymous としてログインしています...
サーバの応答にエラーがあるので、接続を終了します。
再試行しています。

こんなのがでて、ずっと先へ勧めません。
いった移動してよいやらこまってます。
FTPへ手動での接続はできているんですけど・・・
  Convert::UUlib
  Convert::TNEF
あたりも、みんな ftp/perl.org への接続で失敗してるようです。
どなたかお知恵を拝借できればと思います。
よろしくおねがいします。
362nobodyさん:2005/11/04(金) 22:45:51 ID:???
363nobodyさん:2005/11/05(土) 03:57:34 ID:???
すいません、質問です。

文字列$commentがあって、
while($comment=~m//g){}を使って<tag>または</tag>を順々にマッチさせたいのです。

んでマッチしてから<tag>と</tag>のどちらがマッチ…

あ、わかった…$&で判定できるんですね…
鬱だ死のう
364nobodyさん:2005/11/05(土) 04:13:08 ID:???
(゚д゚)ポカーン
365nobodyさん:2005/11/05(土) 04:14:32 ID:???
$&使うもよし、()でキャプチャして$1で読むもよし
foreach( $comment =~ /<.*?>/g ){ print "tag = $_\n"; }
みたいに先にリストに展開するもよし
366nobodyさん:2005/11/05(土) 23:49:03 ID:???
たびたびの質問をお許し下さい.CGI.pmを使ってCGIを作成しています.

#保存ボタンが押されたらデータをファイルに保存する
if(($cgi -> param(add)) && ($cgi -> param(yomi)) && ($cgi -> param(kanji))){
open(OUT,">> $file") or die;
$kanji = $cgi -> param(kanji);
$yomi = $cgi -> param(yomi);
$data = "$kanji\t$yomi\n";
$cgi -> delete_all();
print OUT $data;
close(OUT);
}

param(add)には,submitボタンの値,yomiとkanjiにはテキストフィールドの値が入っています.
保存ボタンが押されるとちゃんと,ファイルにデータが追加されるのですが,
保存ボタンを押して,リロード(F5を押す)を行うと,データが繰り返し追加されてしまいます.
delete_all()して,Varsでもパラメータは消去されているのを確かめたのですが,
リロードすると,やはり値が繰り返し追加されてしまいます.
367nobodyさん:2005/11/05(土) 23:53:00 ID:???
途中で送信してしまいました,申し訳ありません.

続き…

delete_allを行ったにもかかわらず,値が追加されるということは,どこかに値が保存されている
ということだと思いますが,それはどこにあるのでしょうか?

よろしくお願いします.
368nobodyさん:2005/11/05(土) 23:56:09 ID:???
ブラウザが覚えてるからリロードするとそうなる
解決策はググルとたぶん見つかる
どっかで見た
369nobodyさん:2005/11/06(日) 04:41:46 ID:???
うん、二重投稿をエラーにすればいい
370nobodyさん:2005/11/06(日) 14:09:39 ID:???
コメントからタグだけを削除したいのですが

$comment =~ s/<.*?>//gs;

これだけでは何か穴がありますか?
371nobodyさん:2005/11/06(日) 15:24:52 ID:???
>>370
モジュール使えば?
372366:2005/11/06(日) 20:09:02 ID:???
ブラウザの機能だったんですね.てっきり自分のコードにミスがあるかと思っていました.
以前のログを参照して,同じ投稿がないかチェックするようにして,二重投稿を防ぐようにして解決しました.

みなさんありがとうございました.
373nobodyさん:2005/11/07(月) 11:47:17 ID:92Mo7mCM
DBI初心者なのですが、Perl+PostgreSQLでWebアプリを作っています。
DBI::Pg使用し、1度の接続で下記要件を満たすSQL文を教えて下さい。
SQLではなく、Perl+DBIのプログラミング方法で可能であれば、その方法を教えて下さい。

顧客テーブルと購入履歴テーブルがあります。
顧客一覧を出力する時に、顧客ごとに購入件数も表示したいです。

顧客一覧をwhile($hash= $sth->fetchrow_hashref){}で取得し、
whileの中でさらに、$hash->{hoge_no}から購入履歴をSELECTしたのですが、
うまくいきません。お願いします。
374nobodyさん:2005/11/07(月) 12:30:03 ID:???
375nobodyさん:2005/11/07(月) 12:36:56 ID:???
http://pc8.2ch.net/db/

それよりこっちでしょ。SQL文一つでできるし。
376nobodyさん:2005/11/07(月) 13:21:51 ID:???
SQLでコケてるのか、ハッシュを見る段階でコケてるのか、切り分けができてない。
Data::Dumperモジュールなどを使ってハッシュ内容をダンプしてみれ。
377nobodyさん:2005/11/07(月) 21:52:51 ID:ErqtfEJb
1:
画像の「横幅」を判別して設定値以上なら縮小
設定値以下ならそのまま表示というのをしたいです。

2:
if文で何とかなると思い、扱えるように勉強しましたが、
「画像の横幅を判別する」というのはどうやってやったらいいのか・・・。

ヒントだけでも構いません。宜しくおながいします。
378nobodyさん:2005/11/07(月) 21:57:05 ID:???
379nobodyさん:2005/11/07(月) 21:59:49 ID:ErqtfEJb
>>378
即レスどうも
と言うことはできるんですね。
勉強してきます。
380nobodyさん:2005/11/07(月) 22:07:40 ID:???
ImageMagic ってすごいよね?
381nobodyさん:2005/11/07(月) 22:16:16 ID:???
鯖負担すごいね
382nobodyさん:2005/11/07(月) 22:22:21 ID:???
GIFは先頭から7,8バイト目が横幅。BMPなら19〜22バイト目。PNGなら17〜20バイト目。JPGはちょいと面倒だから割愛。
横幅取得くらいなら自前コーディングで十分。
383nobodyさん:2005/11/07(月) 23:54:29 ID:???
GDに比べてGIFが遅すぎ
384nobodyさん:2005/11/08(火) 01:03:07 ID:???
>>383
GIF てw
385nobodyさん:2005/11/08(火) 02:46:44 ID:???
>>377
サイズだけ取得するのならImage::Sizeでも。
386nobodyさん:2005/11/08(火) 07:56:18 ID:???
>>384
DoCoMo用にGIFで吐かなきゃならんのだ。
387nobodyさん:2005/11/09(水) 07:29:42 ID:???
質問です。
すごい久し振りにCGIをうPしたら、まったく忘れていたらしくエラーが出てしまいます。
しょうがないので、初心に返ってhello perlを出力しようとしたら、これもエラーです。
むかついたので、別に契約してあるプロバイダにCGIチェッカがついてるので
うPして何がおかしいか調べたら、

ファイルの先頭が

#!/bin/perl
#!/usr/bin/perl
#!/usr/local/bin/perl
でないか、CGI プログラムが ASCII モードで転送されていません

だそうです。????

ちなみにソースは
#!/usr/bin/perl
# HTML表示
print "Content-Type: text/html\n\n";
print "<HTML><HEAD>\n";
print "<BODY>\n";
print "Hello Perl World!\n";
print "</BODY>\n";
print "</HTML>\n";

ASCII モードになってないんですかね?
秀丸でファイル名:hoge.cgi ファイルの種類:その他 文字コード:自動選択
で保存したものです。何年ぶりかなので何か忘れてるのかもしれません。
ど素人で済みませんがお願いします。
388387:2005/11/09(水) 07:30:43 ID:VFhSh5VA
ああ、sageてました。ageときます。
389nobodyさん:2005/11/09(水) 07:47:21 ID:???
>>387
文字コードを euc にしてみ。
390387:2005/11/09(水) 08:05:29 ID:5otQfz0T
EUCで改行LFでもCR+LFでもダメでした。
391387:2005/11/09(水) 08:16:09 ID:5otQfz0T
とおもったら、>>389で元のロリポではできました。
wakwakの解析が逝かれてるのですかね?
392nobodyさん:2005/11/09(水) 08:53:46 ID:???
ひとのせいにする前に勉強しろ
393nobodyさん:2005/11/09(水) 09:06:00 ID:BFWlWPsi
@imglist=grep *.jpg, readdir DIR;
がエラーです。
多分正規表現の指定がおかしいと思います。
394nobodyさん:2005/11/09(水) 09:29:22 ID:???
>>393
正規表現なら
@imglist = grep /\.jpg$/, readdir DIR;

ワイルドカード使おうとしてるところを見るとこのへんと混同してるのかも
@imglist = glob("*.jpg");
@imglist = <*.jpg>;
395nobodyさん:2005/11/09(水) 11:29:02 ID:???
>>387
ちゃんとASCIIモードで転送しているのか?
ファイルの先頭に変なバイナリが付いていないかバイナリエディタ等で確認したのか?(UTF-8保存とかね)
396nobodyさん:2005/11/09(水) 11:51:52 ID:???
>>387
> ファイルの先頭が
> #!/bin/perl
> #!/usr/bin/perl
> #!/usr/local/bin/perl
> でないか、

このメッセージは、列挙された3つの行のうち好きなものを書けば
いい、という意味ではなく、サーバに対して指定された、何れか一つの行を
書かなきゃだめ、ということだと思うが。
#!/usr/bin/perl
は本当に正しいのかな?
397nobodyさん:2005/11/09(水) 18:03:19 ID:???
398nobodyさん:2005/11/09(水) 18:24:22 ID:???
>>387
ASCIIモードかどうかは、文字コードとかの問題じゃなくて
FTP転送の問題ジャマイカ?

ていうかここまで来るともはやスレ違い。
399nobodyさん:2005/11/09(水) 22:36:27 ID:???
どうでもいいのだけど >>387 に一言言いたい。
ヒアドキュメント使え。
400nobodyさん:2005/11/10(木) 00:00:36 ID:???
niku.2ch.netみたいなDNSBLに登録されているか調べるモジュールは何ですか?
PHPでNet_DNSBLを使っていて、PerlでもDNSBLチェックをしたいです。
401nobodyさん:2005/11/10(木) 01:43:05 ID:???
402nobodyさん:2005/11/10(木) 03:41:03 ID:???
ありがとうございます!
入れました
403387:2005/11/10(木) 06:37:47 ID:XPue5Djf
おお、まんまり反応ないし>>392もあるんであきらめてたけど
色々ありがとう。

とりあえず
>>389で、ロリポは動きました。
で、>>395御指摘のutf-8でwakwakも逝けました。
解決できました。

>>396
>サーバに対して指定された、何れか一つの行を
>書かなきゃだめ、ということだと思うが。
そうみたいですね。
#!/usr/bin/perlはダメで、#!/usr/local/bin/perlはいけました。
>>397のリンクで
>スクリプト先頭行には #!/usr/local/bin/perl と記述して下さい。
と書いてありました。
でもあの書き方ではわかんないですよ。僕だけですかね・・・
>FTP転送の問題
でなくてよかったです。

とにかく、supecial thnxです。
404nobodyさん:2005/11/10(木) 06:43:00 ID:???
>>403
>でもあの書き方ではわかんないですよ。僕だけですかね・・・

おまいだけ。あと「supecial thnx」は恥ずかしいからやめておけ。
405nobodyさん:2005/11/10(木) 09:39:09 ID:???
>>403
真性ですね。
406nobodyさん:2005/11/10(木) 10:11:45 ID:???
釣られるなよ
407nobodyさん:2005/11/10(木) 10:52:53 ID:CqV/pVhD
perlの開発ソフトってないですか?
ビルダーとかみたいな
408nobodyさん:2005/11/10(木) 11:38:03 ID:???
>>407
Perl書くのにどんなエディタ使ってる?
http://pc8.2ch.net/test/read.cgi/php/1014357485/
409nobodyさん:2005/11/10(木) 22:41:58 ID:???
質問です。
現在フォームメールを作っているのですが、どうもうまくいきません。
スクリプトの流れとしては、

(サブルーチンA)フォームデータの取り込み、デコード、データをハッシュ(%FORM)に代入。
           ハッシュのデータをソートしてメールボディー用の変数($body。もちろんグローバル変数)へ代入。

(メインルーチン)送信ボタンが押されたかチェック。
           押されたら送信用のサブルーチンへ。

(サブルーチンB)確認ページの表示。ハッシュのデータをソートして表示。

なのですが、確認ページで送信ボタン(キー名はsubmit)を押すとハッシュの中身はsubmitだけになってしまうし、$bodyはどこかへ消えてしまうし、どうにもさっぱりです。
どなたか導いてください。宜しくお願いします。
410nobodyさん:2005/11/10(木) 22:44:24 ID:???
とりあえずソースを全部、どこかのアップローダに上げろ
411nobodyさん:2005/11/10(木) 23:19:21 ID:???
>>409
送信ボタンが押されたかのチェックなんてPerlの範疇じゃないと思うが
412nobodyさん:2005/11/10(木) 23:53:03 ID:???
cgi.pm使ってdumpしてみりゃ
413nobodyさん:2005/11/11(金) 00:15:11 ID:???
そもそもやりたいことがよくわからんのだが。
サブルーチンとか言ってるけど、ページの遷移はないってこと?
414nobodyさん:2005/11/11(金) 04:45:03 ID:???
415nobodyさん:2005/11/11(金) 08:59:41 ID:???
フリーのできるだけシンプルなフォームメール見て勉強するといいよ
416nobodyさん:2005/11/11(金) 18:22:32 ID:???
質問です。

Perlでテキストファイルから1行ずつ読み込んで処理する時には
while(<>){}
で済みますが、
既に変数に入っているテキストを1行ずつ処理する場合、どうしたらよいのでしょうか?
417nobodyさん:2005/11/11(金) 19:03:57 ID:???
改行をsplitでもすればぁ
418nobodyさん:2005/11/11(金) 19:15:49 ID:???
Perl の標準で一行ずつ巡回する方法 (メソッド) って無いんだっけ?

テキストの内容がでかいとでかい配列ができちゃうのがイヤだけど、

foreach my $line (split(/^/, $txt)) {
# $line に何かする
}
419nobodyさん:2005/11/11(金) 19:18:47 ID:???
>>417,418
レスありがとうございます。

>>418
すいません。splitの/^/というのは??
この場合の^は行頭を表す^ですか?
420418:2005/11/11(金) 19:22:14 ID:???
>>419
そうです。
421nobodyさん:2005/11/11(金) 19:26:56 ID:???
>>420
それで改行で切れるんですね。知りませんでした。
ありがとうございます。
422nobodyさん:2005/11/11(金) 20:30:27 ID:???
while (/^(.*)$/smg) { 処理($1) }

とかでも
423418:2005/11/11(金) 20:51:55 ID:???
>>422
うお、そっちの方が無駄な配列生成しない分スマートじゃんね。吊ってくるわ・・・
424nobodyさん:2005/11/11(金) 22:14:13 ID:???
>>422
ありがとうございます。
だいたいどんな事をやっているのか理解するのに
しばらくかかりました。^^;

オプションを使いこなせると便利になりそうですね。
425nobodyさん:2005/11/11(金) 23:15:24 ID:???
WindowsXP、Perl5.8.7でPPMからDBD-SQLiteをインストールしましたが、connectやdisconnectは出来る(ファイルも生成される)ものの、prepareやdoメソッドを呼ぶとPerlインタープリタが強制終了してしまいます。
原因は何でしょうか?
426nobodyさん:2005/11/11(金) 23:23:21 ID:???
よくある
427nobodyさん:2005/11/13(日) 16:57:21 ID:???
$ua->credentials($netloc, $realm, $uname, $pass):
これを使ってBasic認証通過させたいんですが
鯖側の$realmが日本語になってるせい?なのか失敗します
アドバイスお願いします。。
428nobodyさん:2005/11/13(日) 18:56:49 ID:???
>>427
文字コード合わせればええやん
429nobodyさん:2005/11/13(日) 22:03:50 ID:???
>>427
文字コードがわからなければLWP::UserAgentのget_basic_credentialsを再定義して
$realmになに渡ってきてるのか調べてあわせてやればいいと思うよ。
430nobodyさん:2005/11/14(月) 09:03:21 ID:???
>>428-429
通過出来ました。ありがとうございました。
431nobodyさん:2005/11/14(月) 11:00:01 ID:W63Ukjvm
ReadParse()を使用してフォームから取得した変数を
open関数を使用して、UTF-8でテキストファイルに出力したいのですが
その方法がよくわからず困っています。

フォームから取得した変数はSHIFT_JISなので、
そのままopen関数で出力すると、テキストファイルの文字コードは
SHIFT_JISになってしまいます。

どなたか知っておられる方がいましたら、よろしくお願いします。
432nobodyさん:2005/11/14(月) 11:25:42 ID:???
>>431
UTF-8だから
Jcode.pmを使えばいいのかなーとか思ったけど
433nobodyさん:2005/11/14(月) 17:51:10 ID:WMignAMj
PHPでいうところのshuffleにあたる関数ってありますか?
つまり、やりたいことは、配列をランダムに並び替えることです。
434nobodyさん:2005/11/14(月) 18:03:25 ID:???
435nobodyさん:2005/11/14(月) 18:12:42 ID:???
List::Util::shuffle がいいと思う。
パフォーマンスなんて問題になってから考えれば良い。
気になるならそもそも Perl なんか使わんし。
436nobodyさん:2005/11/14(月) 18:39:21 ID:3zfzQPqE
ttp://other.free-uploader.com/up/download/1131960567298904.t6lFKb
DLPass:1234

windowsでActivePerl5.8を使っています。

IO::Socketを使い、コンソールでのチャットを作ろうと思っています。
現在は、サーバー側はechoserverのプログラムを、
クライアント側にはプロセスを受信・送信に分けたものを使おうと思っています。

実行すると文字は入力できるのですが、うまくserver側にデータが行かないようです。
たぶん原因はclient側なんですが・・。

煮詰まってしまいました。。ヒントお願いします(つд⊂)
437nobodyさん:2005/11/14(月) 19:04:07 ID:???
>>436
■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
438436:2005/11/14(月) 21:57:56 ID:3zfzQPqE
ActivePerlでIO::Socketやプロセスについて勉強するには
どんな本やwebページがオススメですか?
439nobodyさん:2005/11/14(月) 22:07:01 ID:???
>>438
とりあえずIO::Socketでググれ
440nobodyさん:2005/11/14(月) 22:09:16 ID:???
perldoc
441nobodyさん:2005/11/14(月) 22:12:01 ID:???
442436:2005/11/14(月) 22:23:16 ID:3zfzQPqE
もしかしてTCP/IPつかったconsoleチャットって難しい?^^;

ラクダもドキュメントも読んだけどよくわかんね^^;

神はー神はいないのかー>w<;
443nobodyさん:2005/11/14(月) 22:33:57 ID:???
とんでもねぇ、あたしゃ神様だよ
444436:2005/11/14(月) 22:59:47 ID:3zfzQPqE
神様がだめなら妖精さんでもいいから降臨たのむ・・・
445nobodyさん:2005/11/14(月) 23:09:56 ID:???
>>442
ラクダもドキュメントも読んだのに分からないのなら、Socket や
ターミナルを扱う為の基本的な知識が君には欠けている。
そしてその解説はこのスレの範疇ではない。
446436:2005/11/14(月) 23:20:04 ID:3zfzQPqE
初心者質問という言葉に甘えすぎました。
出直してきます。
447nobodyさん:2005/11/15(火) 00:24:28 ID:???
つか何がわかんねーのかわからん状態の奴に何を答えりゃいいんだ
448nobodyさん:2005/11/15(火) 13:35:44 ID:???
お前を、殺す!
449nobodyさん:2005/11/15(火) 14:05:37 ID:???
通報、しますた!
450nobodyさん:2005/11/15(火) 15:28:57 ID:???
ソケットを使うならこの辺りかしらん。

Programming UNIX Socket FAQ in Japanese
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/

どちらもCを読めること。
451nobodyさん:2005/11/15(火) 18:19:07 ID:5cRd32ic
WEBページのアクセス数が多くなってきたため、ロードバランサを用いて負荷を分散しようと思います。

現行
インターネット--------WEBサーバ(DBなど含む)

現行↑の単純な構成を
↓の構成(WEBサーバ3台、DBサーバとにしたいのですが、

イメージ
                       WEBサーバ1
インターネット--------ロードバランサ----WEBサーバ2--------Perlプログラム&DBサーバ
                       WEBサーバ3


この時にPerlのプログラム等に関して注意事項、不具合予測等はありますか?
452nobodyさん:2005/11/15(火) 18:20:22 ID:???
>>451
Perlが関わる部分なんて無いよ
大丈夫かおいw
453nobodyさん:2005/11/15(火) 18:20:45 ID:5cRd32ic
WEBページのアクセス数が多くなってきたため、ロードバランサを用いて負荷を分散しようと思います。

現行
インターネット--------WEBサーバ(DBなど含む)

現行↑の単純な構成をロードバランサーを加えて
↓の構成(WEBサーバ3台、Perlプログラム&DBサーバ)にしたいのですが、

イメージ
                          WEBサーバ1
インターネット--------ロードバランサ----WEBサーバ2--------Perlプログラム&DBサーバ
                          WEBサーバ3
454nobodyさん:2005/11/15(火) 18:25:47 ID:???
>>451>>453
板違い。使ってるOSがなにか知らんがUNIX板かLinux板逝け
455453:2005/11/15(火) 18:26:44 ID:???
失礼つかまった。
退散します
456nobodyさん:2005/11/16(水) 00:22:50 ID:F5yPWKpZ
ひろゆきさん、おめっとー
457nobodyさん:2005/11/16(水) 00:53:15 ID:??? BE:90355182-##
手軽にワイルドカードDNSにしとけ
458nobodyさん:2005/11/16(水) 01:49:10 ID:???
すみません、誘導されて来ました。

画像掲示板をCGI-Perlで作ったんですが、
アドレス先に画像が存在しているかどうかを判別する事は可能でしょうか?
459nobodyさん:2005/11/16(水) 02:07:22 ID:???
>>458
アドレス先って何のこと?
ローカル? リモート?
460nobodyさん:2005/11/16(水) 02:26:25 ID:???
ローカルだったら訊いてこねえだろw
461nobodyさん:2005/11/16(水) 03:50:28 ID:???
いや、わからんぞw
462nobodyさん:2005/11/16(水) 11:27:12 ID:???
>458
マルチすんな
463nobodyさん:2005/11/16(水) 13:37:18 ID:???
>>462
誘導されて来た、ってんだからマルチじゃないんじゃないの?そゆことじゃなくて?

>>458
リモートのサーバにある画像なら、HTTP でアクセスして存在確認する必要があるかと。
LWP とか使って HTTP で HEAD とか GET することになると思うけど、
具体的なやり方はまずぐぐって調べてみれ。
464659:2005/11/16(水) 19:05:42 ID:nAWFz8ua
DBI::Pgを使用してPostgreSQL7.3を使用しています。
ページャー機能(ページ送り)を加えたいんどえすが、
DBI::Pagerがレンタルサーバに入っていないため、
簡単は方法はないかと探してます。何か方法はありませんか?
pure perlなモジュールがあれば一番良いのですが。

465nobodyさん:2005/11/17(木) 14:07:26 ID:AgumOSx0
簡単なデータベースのようなCGIを作ろうとしています。
更新記録CGIと検索CGIを別々に見つけてそれを合わせて実現させようとしています。

この中で「○円以内のもの」を抽出するというのをしたいんです。
ドロップダウンリストに
〜100円
101円〜200円
201円〜300円
〜〜
1,000円〜
という設定をしておいて、リストからその価格帯だけを表示させるという物です。

ドロップダウンリストに
<option value="1">〜100円</option>
<option value="2">101円〜200円</option>
<option value="3">201円〜300円</option>
として、普通にif文で

if($FORM{'data'} eq '1'){
if($data =< 100){ ; } else { next; }
}
elseif($FORM{'data'} eq '2'){
if($data => 101 && $data =< 200 ){ ; } else { next; }
}
〜〜
とすればOKなのでしょうか?(データには桁区切りのカンマが入ると思います。)
ほかによい方法がありますか?または、参考となるCGIがあれば同時に教えてもらえるとありがたいです。
466nobodyさん:2005/11/17(木) 14:27:44 ID:???
>>465
>>1
>>7-8

【CGI】こんなCGI探してますver.18
http://pc8.2ch.net/test/read.cgi/hp/1123833110/

■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
467nobodyさん:2005/11/17(木) 14:32:54 ID:AgumOSx0
>>466
回答ありがとうございます。

自分で改造を考えているので、他のCGIを利用するとかすべてを作ってもらうわけでもないのですが、
ここじゃだめなんでしょうか?
468nobodyさん:2005/11/17(木) 14:59:14 ID:???
>>467
>>1 を読めと。未来の話をせず、実際に躓いてから >>7-8
調べた上で質問しろと。

> 更新記録CGIと検索CGIを別々に見つけて
については >>466

> 自分で改造を考えている
については

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/

自作の部分に関してはココ。
469nobodyさん:2005/11/17(木) 15:01:10 ID:???
>>465 >>467

データを array か hash に入れておき、grep 等で取り出せば OK。

ex.

my @data = (
  { name => 'a', price => 100, },
  { name => 'b', price => 200, },
  ...
};

...

my $lower = 100;  # 実際は form から入力された値を検査し、代入。
my $upper = 200;

my @out = @data;
@out = grep { $_{price} >= $lower } @out if $lower;
@out = grep { $_{price} <= $upper } @out if $upper;

...

for (@out) {
  print "$_{name}: $_{price}\n";
}
470nobodyさん:2005/11/17(木) 16:35:00 ID:???
>>469
スレ違いに構わないように。
471nobodyさん:2005/11/17(木) 17:05:22 ID:vCe+doXk
NFSでは使用できないflockの代わりに、lockfという関数があるみたいだけど、
lockfって実際どれくらいの実績があるのでしょう?
バージョンはいくつから使えるのでしょうか?
472nobodyさん:2005/11/17(木) 17:37:43 ID:???
>>471
lockf という組込関数は perl に存在しない。
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlfunc.pod

perl の組込関数である処の flock() は標準 C ライブラリに用意
されている flock(2) か fcntl(2) か lockf(3) で実装されていて、
これらの関数が環境によっては NFS 越しのロック処理に対応
していない。なのでどんな環境で走らせるか決め打ちできない
場合は、システムコールレベルではなくスクリプトレベルでの
排他処理機構を用意する必要がある。

http://search.cpan.org/modlist/File_Name_System_Locking
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
473nobodyさん:2005/11/17(木) 18:11:47 ID:+ypcUw74
すみません。失礼します。行き詰ったので質問させていただきます。
PHPの「setcookie($cookie,$setword,$expire);」で発行したCookieは、
CGI等で読み込めないのでしょうか?
474nobodyさん:2005/11/17(木) 18:32:19 ID:???
>>473
ここは CGI スレではなく Perl のスレです。

△▲ WebProg 初心者の質問 Part12 ▼▽
http://pc8.2ch.net/test/read.cgi/php/1125215604/

CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/
475nobodyさん:2005/11/17(木) 19:10:47 ID:vCe+doXk
>>472
ありがと
476nobodyさん:2005/11/17(木) 21:47:27 ID:7TvwAtma
http://perl.toshinari.net/cgi/bbs/new2ch/
この2ch型掲示板に表示されるIDを環境変数REMOTE_USERに一致させたいのですが
どうしたらよいでしょうか

sub id {
my($id,$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$month,$date,$identify);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$identify = substr($ENV{'REMOTE_ADDR'},-2).substr(crypt($ENV{'REMOTE_ADDR'},$year-$mon*100),2);
$id = crypt($identify,$mday."L");
$id = substr($id,-10);
return $id;


$id = $ENV{'REMOTE_USER'};
if ($id eq '') { $id = ":"; }

にしてみたりしたのですがよくわかりません。。
477nobodyさん:2005/11/17(木) 21:55:58 ID:???
>>476
質問がよく分からん。
また、

> にしてみたりしたのですがよくわかりません。。

の、何がよくわからんのかよく分からん。
478nobodyさん:2005/11/17(木) 22:02:17 ID:???
>>476
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/
479nobodyさん:2005/11/17(木) 23:05:58 ID:???
こんばんは。
携帯用のフォームを作ってるんですけど
フォームから送信したデータって
当然、携帯のメモリ内にあるわけですよね?
あるフォームから送信、その先にもフォームがあり
そこからさらに今受け取ったデータも含めて新たなデータ送信と
要はどんどん送信するデータ増えていくわけですが
こういうのは問題ないのでしょうか?
どなたか教えてください。
よろしくお願いします。
480nobodyさん:2005/11/17(木) 23:12:26 ID:???
>>479
△▲ WebProg 初心者の質問 Part12 ▼▽
http://pc8.2ch.net/test/read.cgi/php/1125215604/
481nobodyさん:2005/11/17(木) 23:20:50 ID:???
ありがとう。移動します。
482nobodyさん:2005/11/18(金) 03:21:21 ID:???
スレ違いのカスどもが多すぎるwwwww
483nobodyさん:2005/11/18(金) 03:52:36 ID:b/mBx1Hf
連想配列に

%hash = (
  'audio' => "オーディオ",
  'video' => "ビデオ",
  'cd' => "CD-ROM",
  'dvd' => "DVD",
  'bench' => "ベンチマーク",
  'text' => "テキスト",
  'bin' => "バイナリ"
);
の様に値をセットして
  while(($k, $v) = each(%hash)){ print "$k = $v\n"; }
とか
  foreach (keys(%hash)){ print "$_ = $hash{$_}\n"; }
ってやっても
  'audio', 'video', 'cd', 'dvd' => "DVD", 'bench', 'text', 'bin'
の順番 (代入した順番) で出力してくれないんですけど、代入順での出力を
希望するなら
  @list = ('audio', 'video', 'cd', 'dvd' => "DVD", 'bench', 'text', 'bin');
の様に“順番”を別で保持しておくしか無いんでしょか?

ちなみに上記のコードだと
audio
cd
bin
dvd
video
text
bench
の順番で出力されます。
484nobodyさん:2005/11/18(金) 04:13:14 ID:???
>>483
そういうモジュールがある。
名前は忘れた。
485nobodyさん:2005/11/18(金) 04:13:25 ID:???
>>483
標準モジュールじゃないからサーバで使えるかは疑問だけどFAQにこういうのがある
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_can_i_make_my_hash_remember_the_order_i_put_elements_into_it

これが使えないならデータ構造の工夫次第だろうな。
まあ、キーの順番を覚えておくのが一番簡単かと思う。
もしハッシュである必要性が無いなら…つまり$hash{$key}の形で使うことが無いなら、
こういう構造が考えられるね。
@list = (
['audio' => "DVD"],
['video' => "ビデオ"],
...
);

486485:2005/11/18(金) 04:24:50 ID:???
>>483
補足
確認してみたらTie::IxHashはPure Perlだった。
そのままディレクトリ下にTie/IxHash.pmとして配置すれば動くよ

http://search.cpan.org/~gsar/Tie-IxHash-1.21/lib/Tie/IxHash.pm
ここのSourceからダウンロードね
487nobodyさん:2005/11/18(金) 04:25:30 ID:???
>>483
tie を使って自分でそういう hash を作ることも可能。
488nobodyさん:2005/11/18(金) 07:56:03 ID:???
%hash = (
  'audio' => {index=>0, value=>"オーディオ",},
  'video' => {index=>1, value=>"ビデオ",},
  'cd' => {index=>2, value=>"CD-ROM",},
);

オレはこれでやってる。。
489nobodyさん:2005/11/18(金) 10:58:48 ID:???
eachの戻り値をキーと値のリストで受け取ってる奴が多いが、
キーだけ受け取って値はハッシュから取った方が効率がいい。
490nobodyさん:2005/11/18(金) 11:09:40 ID:???
>>489
普通に考えるとeachがせっかく返す値を捨てて値をハッシュから
とったらハッシュをひく手間がかかる分損しそうなものだが...
foreach (keys ...)でまわせって意味かな? それならわかる。

とりあえず論よりベンチ。

use Benchmark;
my %h = (1..2000);

timethese(undef, {
foreach => sub {
foreach my $k (keys %h) {
my $v = $h{$k};
}
},
each => sub {
while(my($k, $v) = each %h) {
}
},
each_key => sub {
while(my($k) = each %h) {
my $v = $h{$k};
}
},
});

Benchmark: running each, each_key, foreach for at least 3 CPU seconds...
each: 3 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 594.34/s (n=1890)
each_key: 3 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 470.68/s (n=1525)
foreach: 3 wallclock secs ( 3.21 usr + 0.00 sys = 3.21 CPU) @ 686.60/s (n=2204)
491nobodyさん:2005/11/18(金) 11:32:55 ID:???
ベンチとるときは、できるだけ同じ条件でやらないと

timethese(undef, {
foreach => sub {
foreach $k (keys %h) {
$h{$k};
}},
each => sub {
while(($k, $v) = each %h) {
$v;
}},
each_key => sub {
while(($k) = each %h) {
$h{$k};
}},
undef => sub {
while(($k,undef) = each %h) {
$h{$k};
}},
});
492nobodyさん:2005/11/18(金) 12:18:06 ID:???
>>490-491
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_each_HASH

my($k) = each %h も ($k) = each %h もリストコンテキスト。
my $k = each %h なり $k = each %h として計らないと意味無し。
493nobodyさん:2005/11/18(金) 12:38:34 ID:???
面白い結果が出た
OS : Windows XP
Ver: Active Perl 5.8.7 build 815
CPU: Athlon 1.6GHz -> 1.0GHzにクロックダウン
Mem: 256MB

ベンチマーク部>>491のものに>>492の修正を加えて使用
my %h = (1 .. $data_count*2);

データ数 2^2
Benchmark: running each, each_key, foreach, undef for at least 3 CPU seconds...
each: 4 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 142105.46/s(n=427169)
each_key: 2 wallclock secs ( 3.11 usr + 0.02 sys = 3.13 CPU) @ 138342.29/s(n=432458)
foreach: 2 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 118013.55/s(n=374575)
undef: 4 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @ 124147.58/s(n=390320)

データ数 2^4
Benchmark: running each, each_key, foreach, undef for at least 3 CPU seconds...
each: 2 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 42106.14/s (n=133687)
each_key: 3 wallclock secs ( 3.00 usr + 0.01 sys = 3.01 CPU) @ 40220.63/s (n=120863)
foreach: 4 wallclock secs ( 3.30 usr + 0.00 sys = 3.30 CPU) @ 48033.28/s (n=158750)
undef: 3 wallclock secs ( 3.10 usr + 0.00 sys = 3.10 CPU) @ 35960.05/s (n=111620)

データがごく少ない場合においてはeachでまわしたほうが若干速い。
でも2^3個程度までの話だしkeysをforeachで回したほうが良さそうだな
494nobodyさん:2005/11/18(金) 15:29:22 ID:???
うちじゃ逆だな。キー数が少ないうちはforeach+keysが速いが、
多くなるに連れて遅くなり7000個あたりでeach系に抜かれた。
list eachとscalar eachでは微妙にscalar eachのが速いが、
ループ内で値をたくさん使うならlist eachのがよさそう。
495nobodyさん:2005/11/18(金) 15:42:17 ID:???
496493:2005/11/18(金) 16:18:46 ID:???
>>494
データ数1024よりも多くして実験してなかった・・・こちらでは2050付近で抜かれた

>>495
詳しい検証乙

データ数が増えるとkeysの戻り値の配列の大きさがネックになるわけか
497nobodyさん:2005/11/18(金) 16:44:41 ID:???
>>495
乙。勉強になりますた。
498nobodyさん:2005/11/18(金) 16:49:18 ID:???
CGI::Liteも5.8x系の標準モジュールにしてほしいんだけど、
こういうのはどこで言えばいいんだろ(´・ω・`)
499nobodyさん:2005/11/18(金) 17:03:10 ID:b/mBx1Hf
>>485
@list = (['key' => 'val'], ...);
これで値をセットしたときってどうやって取り出すんでしょうか?
for(my($i) = 0; $i < $#list; $i += 2){
  my($key, $val)= ($list[$i], $list[$i + 1]);
  〜処理〜
}
って感じですか?


>>485, 486
ちょっと使い方を覚えてみようかな


>>488
そうやって値をセットしたときの取り出しはどうやるんでしょか?

500nobodyさん:2005/11/18(金) 17:07:32 ID:???
>>498
その要求が通るとは到底思えないが、弾の人にでもメールしてみたらぁ?

>>499
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
501nobodyさん:2005/11/18(金) 17:25:13 ID:b/mBx1Hf
にゃるほろ2次元配列ってゆう考え方でしたか。
慣れるまでに時間かかりそうですが、ありがとうございました m(_ _)m
502nobodyさん:2005/11/18(金) 17:35:46 ID:b/mBx1Hf
教えてもらった事を比較的自分に分かり易い様にしようと弄ってたらこんな感じになりました。

@list2 = (
{'audio' => "オーディオ"},
{'video' => "ビデオ"},
{'cd' => "CD-ROM"},
{'dvd' => "DVD"},
{'bench' => "ベンチマーク"},
{'text' => "テキスト"},
{'bin' => "バイナリ"}
);

foreach (@list2){
  my($key, $val) = each(%$_);
  print "$key => $val\n";
}

順番を保持しなくちゃならないときはこんな感じでいこうかなって思います。
503nobodyさん:2005/11/18(金) 17:40:35 ID:???
>>502

ちなみに
>>485 みたいに配列使うなら
foreach my $elem (@list) {
 my($key, $val) = @$elem;
}
で行ける。

>>502 のやり方だと要素が1つだけのハッシュがいくつか出来てしまうので
少しだけ空間効率が悪い。
まぁ、小さいから気にならないだろうけど。
504nobodyさん:2005/11/18(金) 17:45:08 ID:b/mBx1Hf
>>503
おぉ〜、そのやり方のほうがスマートな気がする。

いやはや勉強になります。
505nobodyさん:2005/11/18(金) 18:15:21 ID:???
>>499
「ハッシュはリストである」ということを知っていれば、簡単にわかる。

@foo = (1,10,2,20,3,30);
%bar = @foo;
print "$_ -> $bar{$_}\n" foreach keys %bar;
506nobodyさん:2005/11/18(金) 18:15:31 ID:lIGSV4IR
これ↓はどういう意味でしょうか?

【5.1登場】PHP時代到来 他言語終了【Perl即死】
http://pc8.2ch.net/test/read.cgi/php/1129715894/842

842 名前:nobodyさん[sage] 投稿日:2005/11/18(金) 18:05:46 ID:???
PerlはKE★Tの糞コードのせいで全てが終わった

507nobodyさん:2005/11/18(金) 18:29:06 ID:???
>>506
続きはこっちでやって
http://pc8.2ch.net/test/read.cgi/php/1078991985/l50

いちいち解説してられないから
508nobodyさん:2005/11/18(金) 18:30:58 ID:???
>>506
要約すれば「保守性の高い、美しいコードを書く術を学び、書きましょう」ということです。
509nobodyさん:2005/11/18(金) 18:32:14 ID:EJTafLuM
Perl版の新月(P2Pを用いた掲示板)をデバッグしたいのですがPerlでP2Pアプリを作成するチュートリアルのようなものをご存じの方いらっしゃいませんか?
ぐぐっても九行で書かれたP2Pしか出てこなくてorz
510nobodyさん:2005/11/18(金) 18:53:23 ID:???
>>509
デバッグに必要なのは「P2Pアプリを作成するチュートリアル」ではなくて
Perl のマニュアルではないのか? >>7-8
511nobodyさん:2005/11/18(金) 19:03:33 ID:???
>>510
すいません。やりたいことの整理が出来てませんでした。
新月作者がPerl版の開発を放棄してるので、余分な機能を付与しない掲示板だけのP2Pソフトを作りたいんです。
ただP2Pアプリを弄ったことがないものでどうしたものかなと。
ソース読んで改造するのがてっとりばやいにしても概念が分からないので・・
512nobodyさん:2005/11/18(金) 19:09:55 ID:???
nyの技術
pdfで流れてる
513nobodyさん:2005/11/18(金) 19:27:01 ID:???
>>512
ソースコード載ってないぞあれw
514nobodyさん:2005/11/18(金) 19:28:27 ID:???
>>511
概念や基本的な設計に関してはスレ違いだし、Google さんにでも
尋ねた方が早そう。具体的に Perl でのやり方となると改造ベース
が転がってるんだからソース読みながら学んだ方が効率いいわな。
コレだよね?
http://prdownloads.sourceforge.net/shingetsu/shingetsu-0.5b5.tar.gz

あと CPAN にはこういうのがあるね。
http://search.cpan.org/~klimkin/P2P-pDonkey-0.05/
515nobodyさん:2005/11/18(金) 20:00:31 ID:???
>>507
>>508
サンクス。
516nobodyさん:2005/11/19(土) 22:11:13 ID:???
丸一日質問がない
517nobodyさん:2005/11/19(土) 23:26:30 ID:???
そう言う時はageて見ようぜ
518nobodyさん:2005/11/20(日) 00:14:24 ID:???
すみません、パールインストールしたんですけれど、動かないです
インストール成功したかの確認方法ってありますか?
519nobodyさん:2005/11/20(日) 00:16:02 ID:???
>>518
コマンドプロンプトから「perl -v」

ていうか情報が何もかも足り無ぇ出直して来い
520nobodyさん:2005/11/20(日) 00:16:49 ID:???
>>517が上げるから変なのが沸いたんだろ
521nobodyさん:2005/11/20(日) 00:20:29 ID:???
この流れほのぼのしててイイ
522nobodyさん:2005/11/20(日) 00:47:10 ID:???
WebProg板らしくていい
523nobodyさん:2005/11/20(日) 01:29:36 ID:q2W9WK5M
ああん?
524nobodyさん:2005/11/20(日) 01:54:09 ID:???
(・∀・)ニヤニヤ
525nobodyさん:2005/11/20(日) 02:34:35 ID:???
すみません、postのチェックボックスのステータスを大量に変数に格納したいのですが、
変数名をループで作り出すにはどうすればいいのでしょうか?

my $chk0 = param('chk0');
↑の数字をforループでインクリメントして宣言するにはどうしたらいいでしょうか?
526nobodyさん:2005/11/20(日) 02:40:49 ID:???
>>525
配列を使えといいたいが

foreach(0 .. 9){
${'chk'.$_} = 適当;
}
527nobodyさん:2005/11/20(日) 19:45:49 ID:???
名前1->得点1 名前2->得点2 っていうような配列があり、得点でソートする事までは出来た。
で、得点順に順位をつけるんだが、同点の場合同じ順位にし、次の順位は飛ばすって事ができなくて詰まっている。
現在は配列をforループし、$iをインクリメントして順位としている。
何かいい方法は無いだろうか。
528nobodyさん:2005/11/20(日) 19:47:27 ID:???
529nobodyさん:2005/11/20(日) 20:20:46 ID:???
>>528
素直にわかりませんって言えないんですか?
530nobodyさん:2005/11/20(日) 20:30:19 ID:???
>>529
既に回答を用意してる漏れがはっきり言ってやろう
> 名前1->得点1 名前2->得点2 っていうような配列があり
ここが意味不明。
以下に漏れが適していると考えたデータ構造とそのソースを貼ったるから
これで満足できないならちゃんと伝わるように説明汁

my %name2score = (hoge => 100, fuga => 90, hage => 100);

my %score2name;
foreach my $name (keys(%name2score)) {
push @{$score2name{ $name2score{$name} }}, $name;
}
my $rank = 1;
foreach my $score (sort {$b <=> $a} keys(%score2name)) {
foreach my $name (@{$score2name{$score}}) {
printf "%2d: %s(%3dpt)\n", $rank, $name, $score;
}
$rank += @{$score2name{$score}};
}
531nobodyさん:2005/11/20(日) 20:35:37 ID:???
最近質問者の態度が悪過ぎ
532527:2005/11/20(日) 20:46:03 ID:???
>>530
thx
考え方さえわかれば後は自分で弄れると思いましたので、データ構造を適当に書いてしまいました。
申し訳ありませんでした。

あ、>>529は自分ではありませんので、念のため。
533nobodyさん:2005/11/20(日) 20:47:07 ID:???
だな
>>527←こんな口の聞き方も知らない奴に教えなくていいよ
小学校高学年ぐらいの子供だろけど。
534nobodyさん:2005/11/20(日) 20:49:33 ID:???
>>532
ク、クマー 釣られたか。すまんかった
いつの間にか煽り耐性なくなってしまっとるな・・・気をつけなければ
535nobodyさん:2005/11/20(日) 20:51:17 ID:???
>>531 >>533
気に食わないならこんなボランティアさっさとやめな
536nobodyさん:2005/11/20(日) 21:01:02 ID:???
( ´,_ゝ`)プッ
537nobodyさん:2005/11/20(日) 21:23:44 ID:???
WebProg板らしいじゃないか
538nobodyさん:2005/11/20(日) 21:32:49 ID:???
ほんと厨房が多いな
さっさと強制IDにしろよこの板
539nobodyさん:2005/11/20(日) 21:33:46 ID:???
質問者は age ればいいんでないか
540nobodyさん:2005/11/20(日) 21:35:51 ID:???
スレの雰囲気悪くすると自分の首を締める事になるよ >厨房
541nobodyさん:2005/11/20(日) 21:37:37 ID:???
>>535
嫌だ。
私はお前みたいなガキを眺めてるのが好きなのだ。
542nobodyさん:2005/11/20(日) 21:39:20 ID:???
レン鯖板も、インターネット板も、WebProg板も…
543 ◆BDFCNV1.to :2005/11/20(日) 21:39:37 ID:???
ああまた騙りかウゼェな。トリップ付けるから。
544nobodyさん:2005/11/20(日) 21:41:55 ID:???
レン鯖とネットは元からだろw
それよりム板も・・
545nobodyさん:2005/11/20(日) 21:42:34 ID:sql5orzi
厨房スレage
546nobodyさん:2005/11/20(日) 21:44:40 ID:???
>>545
IDがSQLにorzなんて素晴らしいですね
547nobodyさん:2005/11/20(日) 22:45:33 ID:Va/OuDM7
SUGEEEEEEEEEE!
548nobodyさん:2005/11/21(月) 01:50:14 ID:???
次スレのテンプレには「質問者はトリップ推奨」といれよう。
549nobodyさん:2005/11/21(月) 02:08:53 ID:???
釣られた人も必死だなー
550nobodyさん:2005/11/21(月) 02:12:55 ID:???
551nobodyさん:2005/11/21(月) 03:36:00 ID:m9z0lXWM
>>527
純粋に順位を加えていく変数($i)と、状況に応じて順位を加えていく変数($j)の2つをつくる。
$iはループ中でひたすらインクリメントのみ。
$jは直前の人の点数と異なれば$iを採用する。 同じであれば$jをそのまま採用。

で出来ないかな?
552nobodyさん:2005/11/21(月) 07:40:49 ID:HZcu4vs3
はじめまして。
質問があります。

perlで$ENV{'PATH_INFO'}を取得しようとしていますが、
なぜか取得してくれません。

これはサーバー側の設定が影響しているのでしょうか。
ちなみに、他の環境変数については、正常に取得しています。

よろしくお願いします。
553nobodyさん:2005/11/21(月) 07:49:40 ID:???
>>552
それだけじゃ分からん。
取得する辺りのコードと、設置する鯖晒す。
554552:2005/11/21(月) 09:10:44 ID:HZcu4vs3
お返事ありがとうございます。
今やりたいことは、稼動中の掲示板の改造です。
$ENV{'QUERY_STRING'}からGETで取得している値を、
$ENV{'PATH_INFO'}から取得したいと思っています。

◆サーバー:ロリポップです。
◆コード
値を確かめるために、下のようなコードだけを記述したファイルを
アップし、適当な引数を付けてテストしていました。

print"Content-type: text/html\n\n";
print qq(
<HTML><HEAD><meta http-equiv=Content-Type content=text/html; charset=shift-jis>
</HEAD>
<BODY>
$ENV{'PATH_INFO'}
</BODY>
</HTML>
);
exit;

よろしくお願いいたします。
555nobodyさん:2005/11/21(月) 09:19:28 ID:???
>>554
PATH_INFOを勘違いしてるって事は無いよね
テストに使ったURLはどういう形式?実在じゃなくていいから
556nobodyさん:2005/11/21(月) 09:26:41 ID:HZcu4vs3
早速ありがとうございます。

このような形式です。
http://ドメイン/bbs/index.cgi?room=1

よろしくお願いいたします。

557nobodyさん:2005/11/21(月) 09:30:28 ID:???
path_infoって、文字のままでpath情報だけでは?
getメソッドの取得はquery_stringのままでいいと思うけど、変更しないといけない理由は?
558ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/21(月) 09:39:19 ID:???
>>556
それ、PATH_INFO 含まれてないし。とりあえず CGI.pm のドキュメント嫁。

OBTAINING THE SCRIPT'S URL と FETCHING ENVIRONMENT VARIABLES の path_info() のところ。
多分探せば日本語訳もある。
559nobodyさん:2005/11/21(月) 10:31:19 ID:HZcu4vs3
ありがとうございます。

何か私が勘違いをしているのでしょうかね。
ドキュメントを読んで見ます。
560nobodyさん:2005/11/21(月) 11:37:26 ID:5KZiaClr
@abc=split(/\,/,@aaa[0]);
if(@abc[1] eq $name){&error}

@abc=split(/\,/,@aaa[1]);
if(@abc[1] eq $name){&error}

@abc=split(/\,/,@aaa[2]);if(@abc[1] eq $name){&error}

これを一行にしたくて@abc=split(/\,/,@aaa[0,1,2]);
if(@abc[1] eq $name){&error}
にしたんですけど機能しません
どこを直したらよいのでしょうか?
561nobodyさん:2005/11/21(月) 11:44:26 ID:???
>>560
splitは配列を受けられない
見たところその処理はチェックのみで代入は不要?
(split(/\,/, $_))[1] eq $name && &error foreach @aaa[0,1,2];
こんな感じでどうだろ
562nobodyさん:2005/11/21(月) 11:52:25 ID:5KZiaClr
>>561
レスありがとうございます
実際にはサブルーチンで代入します
すみません

使用目的は連続投稿を防ぐためで、ログファイルに同一内容があるのかチェックをしたいのです
563nobodyさん:2005/11/21(月) 12:02:55 ID:???
>>562
@abc=split(/\,/,@aaa[0,1,2]);
のsplit(/\,/,@aaa[0,1,2]);の部分がサブルーチンの戻り値ということかな
期待する内容は(0の名前, 1の名前, 2の名前)という配列ということでOK?
それなら
map { +(split /,/, $_)[1] } @aaa[0,1,2];
とか。
でも、それは構造を考え直したほうが良いかも・・・
564nobodyさん:2005/11/21(月) 12:23:57 ID:???
>>563
もう一度考え直してみます
ありがとうございました
565nobodyさん:2005/11/21(月) 12:29:45 ID:???
566nobodyさん:2005/11/21(月) 15:57:20 ID:???
掲示板のログ検索を導入したのですが、検索対象文字に\を入れるとエラーが出ます。

$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
open (DATA, "<$log");
flock (DATA, 1);
@line = <DATA>;
close (DATA);
# $wordはフォームから受け取った検索対象文字列です
# 検索対象文字列はスペース区切りで複数設定可能にしてあります
$word =~ s/ | /\t/g;
&jcode::convert (\$word, "euc", "sjis");
@words = split (/\t/, $word);
  foreach (@line) {
    &jcode::convert (\$_, "euc", "sjis");
      # ログはタブ区切りです
      @data = split (/\t/, $_);
      foreach (0 .. $#words) {
# &error ($words[$_]);   # ※1
        # $data[6]が記事の本文です
        if ($data[6] =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$words[$_])/) {
# &error ($words[$_]);   # ※2

検索文字に\を入れて※1の部分でエラーを出そうとすると正常にエラー画面に\が表示されるのですが、
※2で出そうとしても、その前にCGIエラーで落ちてしまいます。
下から2行目のif文内の$words[$_]に\が入った時点で落ちると思うのですが、
どのようにしたら正常に検索処理を行なえるでしょうか。
567nobodyさん:2005/11/21(月) 16:06:06 ID:???
quotemeta とか \Q\E とかでエスケープしてないの?
最低限そうしないと、いろいろ死ぬぜ?
568566:2005/11/21(月) 16:19:18 ID:???
>>567
レスありがとうございます。
以下のように修正することで解決できました。
- @words = split (/\t/, $word);
+ @words = split (/\t/, quotemeta ($word));
569nobodyさん:2005/11/22(火) 16:26:52 ID:???
Win+Apacheのローカルサーバで,Perlスクリプトを組んでから,
オンラインのレンタルスペースにアップロードして稼動させようとしています.

ローカルできちんと動くスクリプトを組むまではOKだったのですが,
レンタルスペースで動かそうとすると,様々なエラーがでてしまいます.

レンタルスペースの仕様書を見て,使えないモジュールのチェックなどはもちろんですが,
ファイル名の大文字や小文字の判定など,他に気をつけることはありますでしょうか?
570nobodyさん:2005/11/22(火) 16:36:17 ID:???
レンタルスペースの仕様書通りの、shebangが書かれていない。
571nobodyさん:2005/11/22(火) 17:10:04 ID:???
1行目!
572nobodyさん:2005/11/22(火) 17:18:46 ID:???
さすがに !#/usr/bin/perl はちゃんと記述してあります.
質問が少し漠然すぎたかもしれませんので,具体的な質問に変更します.

$year=2005,$month=11;
@allfiles=(haman200511,Amuro200511);
@persons=(Amuro,Quess,Char);

#指定された年月かつ,存在する人物のファイル名を取得
for my $file (@allfiles) {
for my $person (@persons) {
if($file eq "$person$year$month.dat"){
push(@files,$file);
}
}
}
573nobodyさん:2005/11/22(火) 17:19:42 ID:???
これ↓のPerl版サンプルがXREAで動かないのですが、どこを修正すればいいのでしょうか?

SAJAX
http://www.modernmethod.com/sajax/
574nobodyさん:2005/11/22(火) 17:21:11 ID:???
結果
ローカル @files=(Amuro200511.dat);
レンタル @files=();

この箇所の挙動がレンタルとローカルで異なっています.
ローカルのPerlのVerは5.8で,レンタルのほうは5.6なのですが,
Verによる挙動の違いというようなものがあるのでしょうか?

訂正
@allfiles=(haman200511.dat,Amuro200511.dat);
575nobodyさん:2005/11/22(火) 17:30:48 ID:???
>>574
@allfilesの要素をクォートで括ってないからじゃないの?
576nobodyさん:2005/11/22(火) 17:31:04 ID:???
>>574
「use warnings」を有効にしてから「きちんと動く」と言ってくれ。
577nobodyさん:2005/11/22(火) 17:31:51 ID:???
>>573
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
578nobodyさん:2005/11/22(火) 17:49:44 ID:???
>>577
サンクス
579nobodyさん:2005/11/22(火) 17:53:28 ID:eRlqTFqT
$year=2005,$month=11;
@allfiles=(haman200511,Amuro200511);
@persons=(Amuro,Quess,Char);

my($year, $month) = (2005, 11);
my(@allfiles) = ("haman200511", "Amuro200511");
my(@persons) = ("Amuro", "Quess", "Char");
580nobodyさん:2005/11/22(火) 17:55:35 ID:???
>>579
qw 使えよ。
581nobodyさん:2005/11/22(火) 18:08:43 ID:???
TMTOWTDI :-P
582nobodyさん:2005/11/22(火) 19:46:43 ID:???
タイミング系のデバッグはどうやってやってますか?
583nobodyさん:2005/11/22(火) 20:01:32 ID:???
タイミング系って何のこと言ってますか?
584nobodyさん:2005/11/22(火) 20:08:08 ID:???
まったく同じタイミングのアクセスを意図的にやるにはどうやったらいいでしょうか?
585nobodyさん:2005/11/22(火) 20:22:48 ID:???
>>576
use warningしてみましたが,状況は進展しませんでした.

>>579
実際のスクリプトではクォートしています.
抄写するにあたり,変数の中身を示しておこうと思い,
記述したときの手抜かりで,クオートし忘れました,申し訳ありません.
586nobodyさん:2005/11/22(火) 20:32:03 ID:???
>>585
で、クォートしたらウチでは動くんだけど、そっちでは動かないの?
587nobodyさん:2005/11/22(火) 20:35:50 ID:???
> さすがに !#/usr/bin/perl はちゃんと記述してあります.
なんで誰も突っ込まないw
588nobodyさん:2005/11/22(火) 21:08:47 ID:???
>>586
WInXp&Apacheのローカル環境だと大丈夫なのですが,レンタルスペースだとダメなんです.
ローカルとサーバの違いというものがよく判らなくて,デバッグに四苦八苦という状態です.

>>587
#!/usr/bin/perl ですね.すみません.


もう少し自分で頑張ってみてダメなようでしたら,また質問するかもしれませんが,
そのときはよろしくお願いします.
589nobodyさん:2005/11/22(火) 21:15:52 ID:???
>>588
ローカルがWinってのは先に言おうな。話が全然違ってくるからな。
で、俺が言ってるのは>>572にクォート入れても動かないのか、なんだが。

もういいや。
590nobodyさん:2005/11/22(火) 21:25:32 ID:???
>>569
無駄なやりとりが増えるから落ち着いてから出直してきなさい。

OSが異なれば改行の扱いが変わったりもするし、
スクリプトやデータファイルの文字コードに起因しているかもしれんし、
マルチバイトなファイル名/ディレクトリ名なんて脱力ものな原因かもしれんし、
FTP転送がまずいだけかもしれん。

 typo
 様々なエラーがでてしまいます。
 挙動がレンタルとローカルで異なっています。
・・・神かエスパーじゃなきゃわからんよ。
591nobodyさん:2005/11/22(火) 22:02:19 ID:???
デバッグに関するテンプレ欲しいな。
592nobodyさん:2005/11/22(火) 22:08:49 ID:???
>>569
"Hello World"を表示するような単純なスクリプトを動かしてみれ。
まずはそこから。
593974:2005/11/22(火) 23:14:39 ID:???
借りている鯖がFreeBSDだって事は知っていたんだけど
文字コードなんか気にせずに秀丸で文字コードをshift_jisに設定して書いて
マスタ、所が全角英数字を半角英数字にしようとしたら、プログラム自体は
jcode::tr(\$arg_[$i], '0-9A-Za-z', '0-9A-Za-z');
たったのこれっぽっちなんだけど、これって文字コードがEUC-JPじゃないと
正確に変換出来ないんだよね、やっぱり皆さんもperlのプログラム書くときの
文字コードはEUC-JPデツカ?
594nobodyさん:2005/11/22(火) 23:18:40 ID:???
どこの誤爆?
595nobodyさん:2005/11/22(火) 23:21:51 ID:???
974デツ誤爆スマソ
596nobodyさん:2005/11/23(水) 04:24:57 ID:fNvsPnqm
はじめまして
本のサンプルコードで理解できないところがあるんで教えてください。
$Value =~ /(\w+)\.(\w+)$/;
なんて書くときの、最後の、
$/
って何を表すんですか?
ファイル名を取り出すようなところで使われてるんだけど…。

これなに?
下の例だと$っていらない気がするんだが…。
こんな感じ
例:
if($FileName =~ /(\w+)\.(\w+)$/){
$FileName = "$1\.$2";
}
597nobodyさん:2005/11/23(水) 04:32:09 ID:???
598596:2005/11/23(水) 04:38:15 ID:fNvsPnqm
>>597
ネ申!!
ありがとうございます。
ちゅーか、大喜びするほどじゃない…。基礎ネタ?
修行していつか還元します…。
599nobodyさん:2005/11/23(水) 08:50:52 ID:???
File::Spec や File::Basename を使ってないスクリプトは例外なく糞。
600nobodyさん:2005/11/23(水) 08:56:54 ID:???
んなこたーない
601nobodyさん:2005/11/23(水) 10:33:48 ID:???
File::Spec や File::Basename を使わないとスクリプトを書けない奴は例外なく糞。
602nobodyさん:2005/11/23(水) 11:30:00 ID:???
>>601
あぁ、ここ WebProg 板だったね(わらい
603nobodyさん:2005/11/23(水) 16:24:36 ID:???
File::SpecやFile::BasenameはFile::SpecやFile::Basenameを使って
書かれているんだろうか?
604nobodyさん:2005/11/23(水) 16:45:50 ID:???
目的の処理ができるかどうか。。  ただそれだけだ。
コストが折り合えば使えるものはなんでも柔軟に使い、使えないものは使わない。
これを使わなきゃダメなんて・・・ やり方がいくらでもある以上、口が裂けても言えん
605nobodyさん:2005/11/23(水) 16:52:23 ID:???
そうやって、カスみたいなCGIが量産されていくのですね。
606nobodyさん:2005/11/23(水) 16:57:40 ID:JssfbXnp
ここまで何も作れないカスの妬みレスでした^^
607nobodyさん:2005/11/23(水) 16:59:58 ID:???
>>599=>>602=>>605
異常な執念深さだな。 File::Spec と File::Basename に何かコンプレックスでもあるのか?
608nobodyさん:2005/11/23(水) 17:11:23 ID:???
>>607
>>599>>602は俺じゃないけど。
標準で付いてくるモジュールぐらい、ちゃんと使ったらどうよ。
(不完全な)車輪の再発明を見てると馬鹿かと思う。
609nobodyさん:2005/11/23(水) 17:20:16 ID:???
>>608
ほほう。
元質問が「本のサンプルコード」に関する質問だっていうのに、
File::Spec や File::Basename を持ち出すのが適切だとでも?
610nobodyさん:2005/11/23(水) 17:30:15 ID:QqvL0TVY
 半角カタカナを化けずに表示させたかったので、jcodeg.plというものがあると知り、それを使ってみたのですが、
やはり化けてしまいます。原因として何が考えられるでしょうか?
611nobodyさん:2005/11/23(水) 17:32:10 ID:???
半角カタカナだと、文字コード判別(getcode)で誤判別をしてしまう。
612nobodyさん:2005/11/23(水) 17:34:05 ID:???
>>610
Shift-Jisをやめればいいと思います
613nobodyさん:2005/11/23(水) 17:40:21 ID:???
モジュールは確かに便利なんだけど、infoseekで使うときに困るんだよな。
614nobodyさん:2005/11/23(水) 17:49:16 ID:???
>>610
どうやって使ったのか言うてみい。
615nobodyさん:2005/11/23(水) 18:22:04 ID:???
>>609
糞な本が糞なプログラマを養う。
616nobodyさん:2005/11/23(水) 18:34:04 ID:???
泥の中に蓮の花を開く
617nobodyさん:2005/11/23(水) 19:20:27 ID:???
kent見本にしたコードはひどいよな。
618nobodyさん:2005/11/23(水) 20:04:36 ID:???
>>617
はいはいKENTを超えてから言ってね
619nobodyさん:2005/11/23(水) 20:09:38 ID:???
それはギャグて言っているのか?(AA略
620nobodyさん:2005/11/23(水) 20:10:39 ID:???
妬み乙
621nobodyさん:2005/11/23(水) 20:21:18 ID:???
ちょっと調べものをするのに設置したのですが
良かったらどうぞです

http://user.ftth100.com/mirrorhenkan/perl/
622nobodyさん:2005/11/23(水) 20:57:03 ID:???
>>608
俺様専用スクリプトだって、Unix環境専用スクリプトだってアリなんだし、
必ず使えってことも無いでしょ。

必要要件を満たさないものを自作するよりは、
素直に使った方がいいけどさ。
623nobodyさん:2005/11/23(水) 22:28:38 ID:5cxNyXSu
質問させて下さい。
windowsXPSP2
ActivePerl-5.8.7.813-MSWin32-x86-148120.msi

を使っています。
plファイル自体の文字コード EUC
内部で扱う文字コード EUC
標準出力 Shift-JIS
標準入力 EUC

POSTデータ等で受け取ったデータはshift-jisであれば内部処理用にEUCに変換する。

という構成でプログラムを書きたく、検索した結果、下記の他いろいろ試してみた
のですがうまくいきません。
文字化けで出力されたり、
"\x{fffd}" does not map to shiftjis at〜〜
と出力されたりします。

#STDIN と STDOUT を別々にコード変換する
use encoding 'euc-jp', STDOUT=>'shift_jis';

どうかお力添えをして頂けないでしょうか。
よろしくお願い致します。
624nobodyさん:2005/11/23(水) 22:34:46 ID:???
>>623
いろいろやったんなら試したこと全部書かないと
レスしても 「それはやってみましたがダメでしたとかいわれて」殴ってやりたくなるからな〜
レスつきにくいぞ

とりあえず jcode.pl でも使っとけ


625nobodyさん:2005/11/23(水) 22:48:30 ID:???
utf8フラグ
626nobodyさん:2005/11/23(水) 23:04:32 ID:???
標準出力をEUCにすればええがな。
携帯?
627nobodyさん:2005/11/23(水) 23:07:42 ID:???
>>623
>>8 の [Perl5.8Unicodeメモ] のページを読むべし。
628623:2005/11/23(水) 23:46:19 ID:???
>>624
>>625
>>626
>>627
みなさんアドバイスありがとうございます。

携帯からの入出力を想定しているためこのような仕様で書きたいと思いました。
Perl5.8Unicodeメモのページを読み、記載されてあった
簡単なところから
まず、
use encoding "euc-jp";
print "こんにちわ\n";
としてDOSで実行してみたのですが
「、ウ、ヒ、チ、・」
と表示されてしまいます。

自分なりに
use encoding "euc-jp";
use Encode qw/ encode decode /;
use Encode qw(from_to);

print from_to("あああ", "shift_jis", "euc-jp");
ともしてみたのですが、
Wide character in subroutine entry at C:/Perl/lib/Encode.pm line 186.
と出てしまいます。
おそらくこれはutf8フラグを切り落としていないからだと
思いますが、euc-jpでソースを書いて出力する際には
一つ一つ文字コードを変換していかないといけないのでしょうか?

629nobodyさん:2005/11/24(木) 00:02:56 ID:???
>>628
> 「、ウ、ヒ、チ、・」 と表示されてしまいます。
君が自分で EUC-JP の文字列を Shift_JIS のコンソールへ
出力しているのだから化けて当然。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encoding.html

> 自分なりに(略)ともしてみたのですが、
from_to() の使い方を間違えている。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encode.html
630nobodyさん:2005/11/24(木) 00:46:53 ID:???
>>628
>>623に書かれている
> use encoding 'euc-jp', STDOUT=>'shift_jis';
これでだめなん?
631nobodyさん:2005/11/24(木) 04:22:56 ID:QV+2W1Ju
$hogeを加工;
&sub1;
sub sub1{$hogeをさらに加工;&sub2;return}
sub sub2{$hogeをさらにさらに加工;return}

というようなことをしたいんですが、sub2になるとせっかく加工した$hogeが初期化されてしまってるようなんですが、どう対処すればいいでしょうか?
632nobodyさん:2005/11/24(木) 04:35:08 ID:???
>>631
my宣言でもしてない限り、その書き方なら$hogeは初期化されないけど。
何か間違ってない? つかuse strictやれと小一時間(ry
633nobodyさん:2005/11/24(木) 04:57:27 ID:QV+2W1Ju
ありがとうございます。
よく見てみたら意味もわからずmy宣言してました。
これをとったらうまくうごきました。
これからも御鞭撻のほど宜しくお願いします。
634nobodyさん:2005/11/24(木) 09:21:02 ID:???
>>633
グローバルの$hogeをそのまま複数のサブルーチンからいじるのは一般的にいうとあまり行儀のいい
プログラムではないな。変な癖をつけると大きいプログラム書くようになると苦労するよ。
635nobodyさん:2005/11/24(木) 10:41:05 ID:???
要するに値を渡したり戻したりが全然わかってないと。
636nobodyさん:2005/11/24(木) 11:40:57 ID:???
今期のテーマ:脱KENT"2005"冬の陣
637nobodyさん:2005/11/24(木) 20:39:28 ID:???
変数のアドレスを渡すのら
638nobodyさん:2005/11/24(木) 21:50:23 ID:EJIyCJlG
戻り値を受け取るのら!
639nobodyさん:2005/11/24(木) 22:02:42 ID:???
$hoge = ¥$hoge;
640nobodyさん:2005/11/25(金) 00:36:53 ID:???
sendmail串万歳
641nobodyさん:2005/11/25(金) 06:48:37 ID:s5kWftCO
use strict;
my %data = check('hoge');
if(%data) {print "OK";} else {print "NG";}
exit;
sub check
{
 my ($text)=@_;
 if($text ne 'hoge') {my %data={'text'=>$text}; return %data;}
 return undef;
}
2行目の位置で正常なハッシュ返ってくればエラーが出ないのですが、
undefが返ってくると「Odd number of elements in hash assignment」と
出てしまいます。
こういう、正常ならハッシュ値、異常ならundefみたいな事をしたい
場合には、どういう感じでコーディングすれば良いのでしょうか?
642nobodyさん:2005/11/25(金) 06:53:16 ID:???
>>641
my %data = check('hoge') or ();
643nobodyさん:2005/11/25(金) 07:18:43 ID:???
>>642
ありがとうございます。
それでやってみたのですが、やはり
「Odd number of elements in hash assignment」と
出てしまいます。

「return undef;」の所を「my %data; return %data」にしたら
エラーが出なくなったのですが、なんか書き方が
すっきりしないような気もします…。
644nobodyさん:2005/11/25(金) 07:22:13 ID:???
「my %data = check('hoge') || ();」で解決しました。
'or'と'||'で違うんですね。勉強になりました。
645nobodyさん:2005/11/25(金) 07:34:50 ID:???
>>644
あ、ほんとだ。|| でなければダメだった。
or だと評価が遅すぎたね。
646641:2005/11/25(金) 07:57:32 ID:s5kWftCO
…と思ったら、「my %data = check('hoge') || ();」だと
正常なハッシュ値が返ってきた時に
「Odd number of elements in hash assignment」と
出てしまいます。

もう、何が何だかわからなくなってきました…onz
647ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/25(金) 08:25:17 ID:???
先に結論だけ書いておくけど、入門書か何かでリストやハッシュについて
理解を深めた方がいいかもしれない。

my %data={'text'=>$text};
↓ こう
my %data=('text'=>$text);

return undef;
↓ こう
return ();
648nobodyさん:2005/11/25(金) 08:35:56 ID:???
>>647
>return undef;
>↓ こう
>return ();
これで解決しました。

>my %data={'text'=>$text};
>↓ こう
>my %data=('text'=>$text);
これについては、最初は()の方で書いていたのですが
http://pc8.2ch.net/test/read.cgi/tech/1131286411/223
ここで、正しくは{}と掲示されたのですが…。
どちらにしても、リストやハッシュについて、理解を深めようと思います。
ありがとうございました。
649nobodyさん:2005/11/25(金) 11:39:19 ID:???
650nobodyさん:2005/11/25(金) 13:21:18 ID:???
>>648
それはスカラ変数に無名ハッシュとしてリファレンスを代入する時だけ
651nobodyさん:2005/11/25(金) 15:44:43 ID:63zT9z2i
よろしくオナガイシマス
半角英数字、英字は大文字、小文字も含めて
10桁の乱数を生成しようと思い以下のプログラムを書いてみたのですが
数字の乱数しか生成出来ません、どこを直したらいいでしょうか、ご指摘お願いします。@array = (0..9,'A'..'Z','a'..'z');
foreach (1..10) {
my $bar = (rand scalar(@array));
print qq|"$bar"\n|;
}
652nobodyさん:2005/11/25(金) 15:46:10 ID:63zT9z2i
651です改行を間違えてました
@array = (0..9,'A'..'Z','a'..'z');
foreach (1..10) {
my $bar = (rand scalar(@array));
print qq|"$bar"\n|;
}
ご勘弁です
653nobodyさん:2005/11/25(金) 15:56:15 ID:???
my $bar = (rand scalar(@array));
        ↑  ↑

scalar(@array)の戻り値は@arrayの要素数
randの引数にそれを渡してるんだから、当然数値しか戻ってこない罠
654ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/25(金) 15:56:26 ID:???
- my $bar = (rand scalar(@array));
+ my $bar = $array[rand scalar(@array)];
655nobodyさん:2005/11/25(金) 16:24:41 ID:???
↑分かっててintを略してる?
656nobodyさん:2005/11/25(金) 16:35:51 ID:1cmYWuzn
質問、Encode 使ってUTF8→EUCにすると
「〜」が「?」になるんですが何とかならないでしょうか
657nobodyさん:2005/11/25(金) 16:39:31 ID:???

あなたが無知なだけですね
658ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/25(金) 16:52:52 ID:???
>>655
略してるも何も、必要ないじゃん。わざわざ int() しろと?
659nobodyさん:2005/11/25(金) 16:54:46 ID:???
654
652です
デキマスタ、ありがとう
660nobodyさん:2005/11/25(金) 17:26:20 ID:???
>>656
この辺の絡みなので個別対処。
http://www.opengroup.or.jp/jvc/cde/ucs-conv.html

>>658
じゃあ scalar も外せよ、半端君。
661nobodyさん:2005/11/25(金) 18:02:46 ID:???
>>660
そのまま $array[] 足しただけだろ。
なんでそんなに必死なんだ。
662nobodyさん:2005/11/25(金) 18:10:22 ID:1cmYWuzn
>>660
有難うございますー
これを参考になんとかやってみますです。
663nobodyさん:2005/11/25(金) 18:15:31 ID:???
>>641
>>647

>return undef;
>↓ こう
>return ();

つまり return; だよね

search.cpan.org: Perl::Critic::Policy::Subroutines::ProhibitExplicitReturnUndef
http://search.cpan.org/~thaljef/Perl-Critic-0.13/lib/Perl/Critic/Policy/Subroutines/ProhibitExplicitReturnUndef.pm
664nobodyさん:2005/11/25(金) 18:45:52 ID:???
use strictのメリットって何ですか?
スクリプトが速くなったりするんでしょうか
665nobodyさん:2005/11/25(金) 18:51:59 ID:ykRqgxjm
すいません
asciiファイルに\r\nが含まれることはあっても
バイナリファイルに\rのない\nが含まれていることはありえない、
と考えてバイナリファイルを選別していくやり方は問題ありますか?
666age:2005/11/25(金) 18:55:49 ID:PaUDYDn8
>>665
バイナリーファイルは何でもありだからだめだよ
667nobodyさん:2005/11/25(金) 19:09:11 ID:???
668nobodyさん:2005/11/25(金) 19:18:35 ID:???
>>665
> バイナリファイルに\rのない\nが含まれていることはありえない、

扱うバイナリファイルがその前提なら、
その方法でもいいと思うよ。
669nobodyさん:2005/11/25(金) 19:49:39 ID:???
バイナリかアスキーかなんて、拡張子で判断すればいいんでないの
670nobodyさん:2005/11/25(金) 19:54:43 ID:???
なぜファイルテスト演算子を使わないのかと
671nobodyさん:2005/11/25(金) 19:55:27 ID:???
(´・д・)エー
672nobodyさん:2005/11/25(金) 20:19:10 ID:???
ファイルテスト演算子って\0が含まれてるかどうかだけじゃなかったっけ?
673nobodyさん:2005/11/25(金) 20:21:34 ID:???
すまん、違ったようだ。
674nobodyさん:2005/11/25(金) 20:51:44 ID:???
x0D x0Aで改行ってのはWindows限定だから他のOSじゃ通用しないよ。
自前でチェックするならx00のあり/なしだな。手抜きの場合は。
675nobodyさん:2005/11/25(金) 20:55:26 ID:???
>>664
使用者感想

use strictで肩こりが解消しました。(茨城県 I.・Y様)
もうuse strict無しではコーヒーは飲めません。(北海道 H・N様)
use strictのお陰で宝くじが当り、彼女もできました。(東京都 A・J様)
676nobodyさん:2005/11/25(金) 21:22:52 ID:???
>>664
>>675みたいなおちゃらけじゃなくマジレス

use strictでkentの呪縛から逃れることが出来ますた。(京都府 M・N)
677nobodyさん:2005/11/25(金) 21:31:13 ID:???
問い)xxxのCGIを改造したいのですが。
答え)use strict;の一文を削除してからどうぞ。
678nobodyさん:2005/11/25(金) 21:32:34 ID:???
>>664
残尿感もなく、スッキリです!(東京都 W・C)
679nobodyさん:2005/11/25(金) 21:41:37 ID:???
ヒント:グローバル変数
680nobodyさん:2005/11/25(金) 21:47:22 ID:???
ヒント:グローバル経済
681nobodyさん:2005/11/25(金) 21:48:38 ID:???
バイナリかどうかのチェックとはちょっと違うかも知れないけど File::MMagic とか。
682nobodyさん:2005/11/26(土) 00:24:41 ID:???
>>664
use strictを使う理由は、use strict 'vars';が一番大きいかな。
完全に修飾されてない、宣言の無い変数を使うとエラーになる。
つまり、タイプミスなどで間違った変数名を使うとエラーで教えてくれる。
683nobodyさん:2005/11/26(土) 02:02:52 ID:???
でも use strict; 使っておいて、一番上に my $変数; をずら〜って書いてるひともいるけど、それは文法上 strict だけど、本質的に strict じゃないんじゃないかなー、って思う。
684nobodyさん:2005/11/26(土) 02:32:09 ID:???
strictって名前だけど、機能を若干制限するだけで、
スタイルを強制するわけじゃないからね。
685nobodyさん:2005/11/26(土) 08:54:19 ID:???
>>683
いるいる
その人おっさんじゃない?
686nobodyさん:2005/11/26(土) 09:02:53 ID:???
でも、解って使っていればOKかなと思う。
例えば、上のほうに設定系の変数をわかりやすくまとめておいて、ここまでが
設定ですよ〜、、、みたいな。。
687nobodyさん:2005/11/26(土) 09:07:23 ID:???
極力そんな変数は減らすべきだよ
688ゆーき:2005/11/26(土) 09:27:08 ID:yGTXOsFB
print "Location: mailto:〜でメーラーを開いて、本文に改行交じりの文字を入れることが出来ません。なぜでしょうか? 
print "Location: mailto:aaa\@aaa.com?subject=件名\&body=1行目%0D%0A2行目\n\n";
「%0D%0A」を入れてみましたがだめでした。文字コードや、URLエンコード関係が原因なんでしょうか???
ちなみにPERLのスクリプト自体はShift-jisで書いています。
689愛とゆーきだけが友達さ:2005/11/26(土) 09:33:48 ID:???
もっとスマートなやり方でできないのか?
bodyなんてメーラー依存度が高いわけだし。。
690ゆーき:2005/11/26(土) 09:42:03 ID:yGTXOsFB
メルマガを一斉配信する前に、一旦Outlook Expressでプレビューしたいわけなんですが、他にいい方法ご存知ですか?
691nobodyさん:2005/11/26(土) 11:46:44 ID:???
>>690
一度、自分だけに同じ内容のメールを送ってみる。
692ゆーき:2005/11/26(土) 11:51:53 ID:yGTXOsFB
>>691
それも、最終手段としては考えていますが、
ユーザのひと手間が増えますので、なるべく他の方法を使いたいと思っているのですが...
693nobodyさん:2005/11/26(土) 12:00:07 ID:???
>>692
Outlook を使ってない人、プレビューしたく無い人もいるわけだけど、
そういう人の手間が増えたり、ウザいと感じるのはいいわけ?
694Perl初心者:2005/11/26(土) 12:13:53 ID:???
>>688
”%”の前に”\”がいるとか
695ゆーき:2005/11/26(土) 12:29:09 ID:yGTXOsFB
>>693
今回は、1人のクライアント専用に作っていまして、こちらの要望なんです。
696ゆーき:2005/11/26(土) 12:49:51 ID:yGTXOsFB
>>694
print "Location: mailto:aaa\@aaa.com?subject=件名\&body=1行目\%0D\%0A2行目\n\n";
としてみましたが、だめでした。
697nobodyさん:2005/11/26(土) 13:18:09 ID:???
<head>
<meta http-equiv="refresh" content="0; url=mailto:[email protected]?subject=件名&body=1行目%0d%0a21行目">
</head>

HTMLタグで飛ばしてやるのはだめなの?
698nobodyさん:2005/11/26(土) 13:49:44 ID:???
Perlコーディング
699ゆーき:2005/11/26(土) 13:51:51 ID:yGTXOsFB
>>697
完璧です!!!(^^)!
上手くいきました!ありがとうございましたm(_ _)m。
とても丁寧にアドバイス頂きまして、本当にありがとうございました。
おかげさまでクライアントにも顔がたちます。感謝!感謝!感謝!感謝!感謝!
700289:2005/11/26(土) 14:52:54 ID:EqqUKm3R
perl5.8、FreeBSDの環境です。
連想配列をファイルやDBのカラムに保存したいのですが、
可能でしょうか?
可能であれば方法をご教授お願いいたします。
701nobodyさん:2005/11/26(土) 15:26:01 ID:???
>>700
もちろん可能だけどどのあたりがわからないの?
連想配列にどんなキーがあるのか知る方法がわからないとか→keys, each
ファイルへの記録方法がわからないとか→open, print, close
PerlからDBを使う方法がわからないとか→http://search.cpan.org/modlist/Database_Interfaces
それを連想配列に戻す方法がわからないとか→それぞれのキーに対して値を代入
702nobodyさん:2005/11/26(土) 15:35:34 ID:???
そういうモジュールを探してるって事じゃない蟹
703nobodyさん:2005/11/26(土) 16:18:41 ID:???
シリアライズして放り込めば…と思ったけど、
ハッシュをそのままDBのテーブルにマッピングしたいってこと?
704nobodyさん:2005/11/26(土) 16:33:28 ID:???
ああ、一つのカラムの中に連想配列を丸ごと押し込みたい、とも取れるのか…
それならStorableだよな
705700:2005/11/26(土) 17:02:03 ID:EqqUKm3R
>>703
>>704
そういう事です。説明足りなくてすいません。
普通に連想配列をファイルやカラムにinsertしても
読み取りにに失敗したので(当然)。
Storableとはなんでしょうか?ググってみます。
706nobodyさん:2005/11/26(土) 20:35:13 ID:zmLMleB6
Javaのプロパティファイルと同じことをperlでもやりたいのですが、できますか?
2chのSETTING.TXTみたいなのです。
2chってどうやってるんだろう・・・。
707nobodyさん:2005/11/26(土) 20:38:46 ID:???
出来ます
と言うか物凄く初歩です
708nobodyさん:2005/11/26(土) 20:42:51 ID:???
現在CGI経由で画像を表示させる簡単なCGIスクリプトをテストしています。
こんな感じで・・・

open IMAGE, "<:raw", "img.gif";
print "Content-type: image/gif\n\n";
print <IMAGE>;
close IMAGE;

しかしこれを実際にテストしてみると、ブラウザには
画像がシュレッダかけられたみたいなへんてこりんな
画像で、しかも縦の長さが押しつぶされてしまった
感じの画像が表示されます。要は、正しく表示されません。
jpeg画像にしてやってみると、今度はバッテンのアイコンが
でてしまいます。

なぜうまく表示できないのでしょうか?
709nobodyさん:2005/11/26(土) 20:49:30 ID:???
binmode
710nobodyさん:2005/11/26(土) 20:51:22 ID:???
>709
:rawだから違うんじゃね?
711710:2005/11/26(土) 20:52:06 ID:???
何アホなこと言ってんだオレ…
STDOUTに対してbinmodeか
712nobodyさん:2005/11/26(土) 21:15:24 ID:???
>>708
まぁ、違うと思うけど
ASCIIモードでFTPうpしたとか
713708:2005/11/26(土) 21:19:39 ID:???
レスどうもです。
一応raw指定でbinmodeのつもりです。
あと自鯖でやってます。Apache2です。
714708:2005/11/26(土) 21:29:15 ID:???
あ、たしかにbinmode STDOUTでうまくいきました。
逆にIMAGEに対してはbinmodeにしなくてもいいようですね。
ありがとうございました。
715nobodyさん:2005/11/26(土) 21:29:21 ID:???
>>713
binmodeは2箇所ってこと
716nobodyさん:2005/11/26(土) 21:37:16 ID:zmLMleB6
>707
そんじゃおしえてください
717nobodyさん:2005/11/26(土) 21:41:42 ID:???
ex.

open(FH, 'SETTING.TXT');
while (<FH>) {
chomp;
my($key, $val) = split(/=/, $_, 2);
$set{$key} = $val;
}
close(FH);

print $set{'BBS_TITLE'};
718nobodyさん:2005/11/26(土) 21:47:02 ID:???
>>706
この程度のテキスト処理はどんな Perl の本でも最初の方でやるじゃんよ。
勉強不足なんじゃね?
719708:2005/11/26(土) 21:47:53 ID:???
>>715
それがですね、読み出し元ファイル(IMAGE)に対してはbinmodeにしなくても
いいようなんです。書き出し先ファイル(STDOUT)に対してはやらねば
ならないようです。
それと、1つサンプルコードを見つけたのですが、これは読み出し元ファイルに
しかbinmodeやってないですね。
http://www.aimix.jp/cgi/syohoimgview.html
この辺があやふやというか・・・。
720nobodyさん:2005/11/26(土) 21:55:55 ID:???
Windowsの特徴
721708:2005/11/26(土) 22:10:24 ID:???
いろいろやってみましたが、原因わからずじまいです。
>>720ということで、結論付けてしまいたい気分です。
やってられんです。
ようはI/O両方バイナリにしとけば確実ってことですね。
722nobodyさん:2005/11/26(土) 22:10:48 ID:???
"<:raw" ってしてるから binmode になってんじゃなくて?
723720:2005/11/26(土) 22:12:35 ID:???
"ということ"っていうかそういう仕様なんだけど

ttp://www.sixnine.net/cygwin/translation/cygwin-ug-net/using-textbinary.html
724715:2005/11/26(土) 22:12:44 ID:???
>>719
・テキストモード入力時の変換:0D 0A → 0A
・テキストモード出力時の変換:0A → 0D 0A
・たまたま画像に0D 0Aが無かった
・サイトが間違ってる # コピペして試してみな
725708:2005/11/26(土) 22:16:09 ID:???
なるへそ。
画像ファイルに<CR><LF>がなければ、読み込みでは変換されず
しかし<LF>があれば、書き出しで変換されるという寸法ですかね。
726nobodyさん:2005/11/27(日) 06:03:43 ID:PNI5NdX4
すいません、質問させてください。


unless($codeflag){ &error("不正投稿の可能\性があります。リロードして再投稿して下さい。");}
if ($allow_submit && !$letout_ip) {
if (($cc_time - $last_ctime) { &error("アクセスしてから投稿するまでは$noprx_stime秒以上開けて下さい。");}
}
elsif (($cc_time - $last_ctime) { &error("アクセスしてから投稿するまでは$submit_time秒以上開けて下さい。");}


で構文エラーがでます。

Perlのエラー出力は

syntax error at tmp.pl line 749, near ";}"
syntax error at tmp.pl line 751, near "elsif"
tmp.pl had compilation errors.

でした。

ちょっと原因がわからないんで、おしえてください。
727nobodyさん:2005/11/27(日) 06:22:19 ID:???
  , ‐、     , ─‐ 、 , ‐ 、 ,r─── 、 r───‐ 、 , ───‐、
  |   |(_)(_)l    .l |   | ,'        |│      | |      │
  l  └─‐、 `ー─ ' l  レ   ,'=コ   |└─‐┐   ! `ー─┐   !
  |     ノ     /  lゝ-'ゝ、   l     l   |     /   〈
  l   l ̄ ̄  r─‐ ´  / r─‐´   / ┌─‐┘   ! r─‐´   ヽ
  |   !    │     , r'  l     , r'   |      |│     ,r、  ,!
  └‐┘   └─ ' ´   └─ ''´   └───‐' └─ ' ´ `ー'
                                  /\___/ヽ
    (.`ヽ(`> 、                      /''''''   '''''':::::\
     `'<`ゝr'フ\                 +  |(●),   、(●)、.:| +
  ⊂コ二Lフ^´  ノ, /⌒)                 |  ,,,ノ(、_, )ヽ、,, .::::|
  ⊂l二L7_ / -ゝ-')´                .+ |   `-=ニ=- ' .::::::| + .
       \_  、__,.イ\           +     \   `ニニ´  .:::/    +
        (T__ノ   Tヽ        , -r'⌒! ̄ `":::7ヽ.`- 、   ./|  .
         ヽ¬.   / ノ`ー-、ヘ<ー1´|  ヽ | :::::::::::::ト、 \ (  ./ヽ
          \l__,./       i l.ヽ! |   .| ::::::::::::::l ヽ   `7ー.、‐'´ |\-、
     _,∩_         _,∩_           _,∩_
    (_____)ゝ、     (_____)    y     (_____)
    / :: :: :: ヽ 〉     /-‐:: ::‐-ヽ /       / :: :: :: ヽ
   _./ (・ )ll(・ ) ∨     _/  0) i! 0) ∨      _/ ( ・)i!(・ ) ゙、_
 // :: :: ∈ゝ :: ::ヽ   // ::  ‐-‐ :: ヽ    //  :: ー一 :: ヽ\
728nobodyさん:2005/11/27(日) 06:26:12 ID:C29mLJPM
どこが 749 行目だ?
こちとらエスパーじゃねぇんだ
729nobodyさん:2005/11/27(日) 06:28:08 ID:C29mLJPM
if (($cc_time - $last_ctime) { &e 〜 以下略
elsif (($cc_time - $last_ctime) { &e 〜 以下略

とりあえず文法を学んでみよか?
730nobodyさん:2005/11/27(日) 07:00:10 ID:???
対応するカッコの数くらい数えられんものだろうか
731nobodyさん:2005/11/27(日) 07:59:17 ID:???
まぁなんだ、茶でも飲んで一服するこった。
732nobodyさん:2005/11/27(日) 14:40:13 ID:???
>>726
$cc_timeの左の ( が余分、2箇所
733nobodyさん:2005/11/27(日) 16:58:11 ID:???
いくらなんでもネタだろ
734nobodyさん:2005/11/27(日) 17:21:56 ID:6lDMwL/x
初歩的な質問で申し訳ないのですが、よろしくお願いします。

print "Content-type: text/html; charset=Shift_JIS\n";
print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n\n";

と書いてクッキーを出力しているのですが、画面に

  Content-type: text/html; charset=Shift_JIS

の1行が表示されてしまいます。どうしてですか?一応クッキーは作成されています。
735nobodyさん:2005/11/27(日) 18:01:28 ID:???
print "Content-type: text/html; charset=Shift_JIS\n";
print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n\n";

この2行のあとにさらに Content-type〜 をprintしてるからでしょ。
736nobodyさん:2005/11/27(日) 18:43:40 ID:???
>>734
実行環境を書け。話はそれからだ。
737nobodyさん:2005/11/27(日) 20:48:09 ID:???
>>734
「画面」とは? 標準出力? ブラウザ?
738nobodyさん:2005/11/28(月) 13:58:44 ID:MRaDdba7
>>737
cookieのこと言ってんなら>>734はブラウザのことなんじゃねーの?
739nobodyさん:2005/11/28(月) 17:59:22 ID:cDaON9yM
松島
秩父
hogehoge 癒し系
松本

↓上のテキストを処理後、下のようにしたい↓

松島
秩父→hogehoge 癒し系
松本

処理の1つ先回りをして、対象の1つ前の行の先頭に「hogehoge」がある場合、対象の列とhogehogeが先頭に存在する列に対して指定の処理するようにしたいのですが、

for my $ii (0..$#text) {
if("hogehoge" eq substr($text[$tn+1],0,8)){
$text1 .= "$text[$ii]→$textall[$ii+1]\n";
$ii++;
}else{$text1 .= "$textall[$ii]\n";}
}
↑のように組んで実行したところ

松島
秩父→hogehoge 癒し系
hogehoge 癒し系
松本

のようになってしまいます。
ループのたびにmyで初期化してしまうため$ii++が無駄になってしまうために起こってると思うのですが、$ii++を生かすようにするには、どのように変えたらよいですか?
740nobodyさん:2005/11/28(月) 18:14:59 ID:???
>>739
こっちのforループ。
for(my $ii = 0; $ii < @text; $ii++) {

どうでもいいかも知れないけど、
substr()よりindex()使ったほうがスマートに思う。
741nobodyさん:2005/11/28(月) 18:18:12 ID:???
>>739
その場合、行を無視すると単純になる(sオプションを使う)

松島\n秩父\nhogehoge 癒し系\n松本 が
松島\n秩父→hogehoge 癒し系\n松本 に置換できればいい。

あとn行先読みするときはpush,shiftを一時配列に対して使うのが楽かも。
742nobodyさん:2005/11/28(月) 18:40:40 ID:???
>>740-741
ありがとうございましたっ。
743nobodyさん:2005/11/28(月) 18:44:40 ID:???
配列じゃなくてテキストだったらこんなのでも。

my $test =<<"EOT";
松島
秩父
hogehoge 癒し系
松本
EOT

$test =~ s/\n(?=hogehoge)/→/g;
744nobodyさん:2005/11/28(月) 18:48:54 ID:???
745743:2005/11/28(月) 18:56:49 ID:???
本当だ、質問レスしか見てなかったので気づかなかった。
746741:2005/11/28(月) 19:32:34 ID:???
「(sオプションを使う)」のところは必要なかった。訂正。
747nobodyさん:2005/11/28(月) 20:20:33 ID:???
perl使いを目指しています、最近CGI.pmライブラリなるものを
知り使うようになりました、今までPOSTやGETメッソッドによる
変数の受け渡しなんか、フォームのデコード処理とか、その逆とか
ゴリゴリ書いていましたが、これを使うようになって
なんとなく、あまりにあっけなくて
( ゜д゜)ポカーン状態なのですが
こんなヌル湯に漬かって漏れは一人前のperl使いに成れるでしょうか?
それと、CGI.pmの弊害とかってありますか?
748nobodyさん:2005/11/28(月) 20:31:37 ID:???
そんなもんです
わざわざ内部までさぐるのは時間の無駄ですので
その調子でモジュールを使いまくりましょう
749nobodyさん:2005/11/28(月) 20:33:10 ID:???
その勢いでphpを知ると更にポカーン、な予感
750747:2005/11/28(月) 20:52:10 ID:???
perl使いの諸兄ども、どうもです
ライブラリ使うと確かに内部で何をやってるのか、全く分からないが
良い点としては、コードが少ない!見やすい!読みやすい!ですね
ゴリゴリ時代は自分でプログラム組んでいても3日もすればハァ?ってな
事がたまにありましたが今は逆なのらー、
ライブラリにおまかせする部分はおまかせして
簡単に正規表現による、文字処理とかハッシュによる構造体の変数の受け渡しや
参照の仕方等がスラスラできるように禿げみます。
751nobodyさん:2005/11/28(月) 20:52:24 ID:???
おれは未だに自作のURLデコードや文字コード変換だな。
使うモジュールは strict, vars, lib ぐらいかな。
752nobodyさん:2005/11/28(月) 20:52:31 ID:???
弊害というか、標準モジュール付いてない古いPerlの入っているサーバで動かないくらいかな。
753nobodyさん:2005/11/28(月) 21:03:26 ID:???
既存モジュールの再利用のうまさも実力の内。
754nobodyさん:2005/11/28(月) 21:04:41 ID:???
CGI.pmは要らないメソッド大杉。
無駄にコンパイルする時間を食ってる。
755nobodyさん:2005/11/28(月) 21:10:10 ID:???
>>754
ほかに lightweight なおすすめがあればおしえてぷりーず。
756nobodyさん:2005/11/28(月) 21:15:18 ID:???
CGI::Lite(笑)
757nobodyさん:2005/11/28(月) 21:38:42 ID:???
(笑)
758nobodyさん:2005/11/28(月) 22:22:30 ID:???
759nobodyさん:2005/11/28(月) 23:17:50 ID:???
CGI::Liteはデフォでついてくる?
760nobodyさん:2005/11/28(月) 23:21:46 ID:???
ノンノン
761nobodyさん:2005/11/28(月) 23:33:07 ID:jymxeugY
ちわ。
テキストエリア(<TEXTAREA></TEXTAREA>)から送信されたテキスト内容を受け取って、
ファイルに書き出す処理を書いてます。

各行に、例えば、<BR>なんてタグをつけて出力しなおしたくて書いているんですが、どうも
意図しない改行がきてしまいます。

こいつはどこからやってきているのか。
あるいは、ここコードこうだろなんて教えていただけないでしょうか。
($buffの取得の時点でおかしい?)

コード:
#$buff取得したマルチラインのテキスト
@s_text = split(/(\r\n|r\|\n)/, $buff, 20);
open(FN, ">new.htm");
foreach $mod_line (@s_text){
$mod_line = "$mod_line" . "<BR>\n";
print FN "$mod_line";
}

元データ:
1行目
2行目
3行目

結果:
1行目<BR>

2行目<BR>

3行目<BR>
↑改行が一個多い。
762761:2005/11/28(月) 23:38:52 ID:jymxeugY
761の書き込みの結果嘘ついた。
出来たファイルの中身をコピペすると、以下のようになります。
コピペするとなんか改行増えてる?とにかく欲しいのは3行のデータなんです。
1行目<BR>


<BR>
2行目<BR>


<BR>
3行目<BR>
763nobodyさん:2005/11/28(月) 23:41:43 ID:???
>>761
- @s_text = split(/(\r\n|r\|\n)/, $buff, 20);
+ @s_text = split(/\r\n|r\|\n/, $buff, 20);

ではどう?
764nobodyさん:2005/11/28(月) 23:46:41 ID:???
765nobodyさん:2005/11/28(月) 23:52:08 ID:LjPWibfY
766761-762:2005/11/29(火) 00:25:17 ID:???
>>763
>>764
ありがとう!
>>763
一発で動きました。ただし理解できんかったです…。
括弧のあるなしっていったい…?
良かったらどう違うのか教えていただけたら幸いです。

>>764
勉強になります。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_2BR
<BR>変換のコードは使えたら使いたいですね。
(自分のコードは
元のテキストの前後に修飾処理する用途で使いますので、
すぐに構文書けません…。)
>ちゅーか、s///の基本の利用方法ですね。
>>こんな書き方あり?
s/\x0A/後方修飾\x0A前方修飾/g;
↓こんなんなっちゃうよな…。
1行目後方修飾
前方修飾2行目後方修飾
前方修飾3行目後方修飾
前方修飾

ちゅーか、いずれにせよ、ありがとう!
767nobodyさん:2005/11/29(火) 00:29:06 ID:???
>>763
r\ になってる
768nobodyさん:2005/11/29(火) 00:39:01 ID:???
>>766
() があれば、マッチしたものが 返されるリストに含まれるのよ。

If the PATTERN contains parentheses, additional list elements
are created from each matching substring in the delimiter.

split(/([,-])/, "1-10,20", 3);

produces the list value

(1, '-', 10, ',', 20)
769nobodyさん:2005/11/29(火) 00:46:31 ID:???
>>768
761じゃないけれど勉強になりました。splitはcapturingに意味があったのか・・・
770761-762:2005/11/29(火) 00:50:25 ID:???
>>767
細かいとこまでみてもらってありがとう

>>768
な、なにょー!?
そうだったんですか…。
なんかのときに、splitに関する質問をするところでした…。
ちゅーか、split勉強しなおせって言う感じですか。
あるいは、正規表現の項目に書いてありそうですね。

ありがとうございました。
771761-762:2005/11/29(火) 00:54:53 ID:???
>>769
突っ込みすぎかもしれませんが、
capturingって、
どんなことに使うつもりになったんですか?

また、しばらくperlから離れちゃいそうなので教えてもらいたいのですが。
772nobodyさん:2005/11/29(火) 01:08:01 ID:???
>>771
どんなことに使うつもりになったって言うと…
splitの中でグルーピングする必要性が出た場合は、
?:をつけてclusteringにするのを忘れないようにしないとな、という話です。
773771:2005/11/29(火) 01:16:34 ID:???
>>772
やっべえ、なんとなくしかわからんです。
修行が足りん、出直してきます。
サンクスです。
774nobodyさん:2005/11/29(火) 01:24:46 ID:???
後方参照を作成しません。
775nobodyさん:2005/11/29(火) 01:33:40 ID:jT6RPKnv
改行コードの統一は
s/¥x0D¥x0A|¥x0D|¥x0A/¥n/g
がおすすめ
776nobodyさん:2005/11/29(火) 01:41:13 ID:???
全角に
イラッとした

                 ハ_ハ
               ('(゚∀゚∩ イラッとした!
                ヽ  〈
                 ヽヽ_)
777nobodyさん:2005/11/29(火) 02:35:33 ID:???
>>775
それは遅いから云々ってのが>>764先のPerlメモにあったね。
778nobodyさん:2005/11/29(火) 10:55:30 ID:jT6RPKnv
改行置換なんて投稿時だけで、読み込み時は置換されてることが前提だから\nでやるし、
そんなにパフォーマンスに影響しなうのでは?
って思う。
書き込みよりも読み込みの回数のが多いのがほとんどだと思うし…
779nobodyさん:2005/11/29(火) 12:08:00 ID:???
たいした弊害もなく速くなる方法があるなら、普通はそっちを選択するものでしょ。
ついでに、>>766は改行コード統一それ自体の話をしているわけではないし、
投稿時以外にも膨大なデータで改行コードを統一する必要がある場合もあるだろう。
わざわざ突っかからないで…
780nobodyさん:2005/11/29(火) 13:13:40 ID:???
ぶっちゃけどっちでもいい。
どうしても気になるなら、Cで書くべき。

そして、先につっかかってるのは>>777
781nobodyさん:2005/11/29(火) 13:40:53 ID:???
Perlでやる範囲であっても、遅いより速いほうがいいだろうに。
つか>>777って、ただの参考情報じゃん。
782nobodyさん:2005/11/29(火) 13:54:21 ID:skNvEddZ
改行コードの統一は
s/¥x0D¥x0A/¥n/g;
tr/¥x0D¥x0A/¥n¥n/;
がおすすめ
783nobodyさん:2005/11/29(火) 14:07:54 ID:???
                 ハ_ハ
               ('(゚∀゚∩ イラッとした!
                ヽ  〈
                 ヽヽ_)
784nobodyさん:2005/11/29(火) 14:11:20 ID:???
全角に
イラッとした!
785nobodyさん:2005/11/29(火) 14:49:06 ID:???
apache2 , active perl5.8.2 でやってるんですが、You don't have permission to access *****.
みたいなメッセージが出ます。

Permission解除するのってconfのどこでしょうか。。
786nobodyさん:2005/11/29(火) 15:18:19 ID:???
>>785
<Directory />
Options Indexes
</Directory>
787nobodyさん:2005/11/29(火) 15:50:53 ID:???
>>785
PerlじゃなくてApacheの質問だね…まあいいや、OptionsにExecCGIを設定
それにしても5.8.2って随分古いものを使ってるな…最新版は5.8.7だぞ
788nobodyさん:2005/11/29(火) 17:51:42 ID:???
うーむ、だめです。500errorとか出たり・・・。
win2kやwinxp proの時はすんなり言ったんですが。xp homeだと何か
先にインストール必要なものがあったりしますかね。
789nobodyさん:2005/11/29(火) 17:57:25 ID:???
エラーをキャッチするか、プロンプトで走らせましょう。
790nobodyさん:2005/11/29(火) 18:26:02 ID:???
コピーして読み取り専用になったとかユーザー権限でインストールしたとかでしょ
791nobodyさん:2005/11/29(火) 19:46:51 ID:???
読み取り専用になってて今解除して、ユーザー権限は管理者権限にしたままです。
コマンドプロンプトからはtest.cgi動くんですが・・・うーむ。
apacheの設定であることまでは絞れたけど相変わらず
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

・・・でadministratorに聞けって俺?
792nobodyさん:2005/11/29(火) 19:51:28 ID:???
>791
>this error may be available in the server error log.
って出てるだろーが。
793nobodyさん:2005/11/29(火) 19:52:03 ID:???
いい加減スレ違いだから消えろ~

http://pc8.2ch.net/test/read.cgi/php/1043851302/
794nobodyさん:2005/11/29(火) 20:13:28 ID:???
>>791
スレ違いっていうか根本的にわかっとらんな。
administrator=管理人なんだからお前さんに決まってるだろうがよ。

で、エラー内容がわからんとこっちも答えようが無い。
エラーログ見るなり use CGI::Carp qw(fatalsToBrowser); 使うなりしてくれ。
795nobodyさん:2005/11/29(火) 20:34:16 ID:???
一番初歩的に #!/usr/bin/perl のパスが違うとか print "Content-type: text/html\n\n"; 書いてないとかかもね。
796nobodyさん:2005/11/29(火) 20:36:20 ID:???
別の環境では動いてたらしいので Content-Type: は無さそうだけどね。
797nobodyさん:2005/11/29(火) 20:56:33 ID:???
エラーログみてぐぐったりしてたら半分解決しました。みなさんどうもありがとうございました。とりあえずapacheスレへ移動しようと思います。
http://72.14.203.104/search?q=cache:NDE5CiEokLAJ:pc5.2ch.net/test/read.cgi/mysv/1087514426/101-200+apache2+%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E3%83%91%E3%82%B9%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93&hl=ja
http://72.14.203.104/search?q=cache:-QDvNjZ_4LoJ:sakaguch.com/PastBBS/0034/B0017459.html+apache2+%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E3%83%91%E3%82%B9%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93&hl=ja

こちらのとおり#!perlだけにしたら動きました。でもレンタル鯖にうpするときにいちいち書き換えるの面倒なので引き続き試行錯誤っす。
798nobodyさん:2005/11/29(火) 21:19:22 ID:jT6RPKnv
かわいそうになってきたので助言。

ホームページの管理ディレクトリ → d:\www\my_web\
Perl のインストール先 → d:\usr\

こうすれば #!/usr/bin/per って書ける。
借りてるサーバーが /usr/local/bin/per であれば、ローカルでの Perl の
インストール先は /usr/local ってなる。
799nobodyさん:2005/11/29(火) 21:23:39 ID:???
お前の頭がperだよ
800nobodyさん:2005/11/29(火) 21:24:42 ID:jT6RPKnv
l が抜けてた orz
801nobodyさん:2005/11/29(火) 22:17:45 ID:???
         -─=三=- 、
       /イイイ   ヽ三\ヽ\
      ///イ   ___    ヽ トトト
      i:|:/ミ  -_-__--_−_-_ トト|:i
      |:|:|イ   へ、 ̄ /ヽ   |:|:|
      |:|:||   _、   ,.-_、 |:|:|
      ト:!:|  ヽ´´´ノ ヽ´´´ノ |:|リ
      ヽ_|    ̄ ノ  丶 ̄  |_ノ
         | \/ (_i  i_)\/ |
        |  | /  ̄  \ | | <売り上げ120億、利益20億ある。どんな弁護士使ってでも潰す!
         \ -=^^=- /
           ヽ   ̄  ノ
802nobodyさん:2005/11/30(水) 00:15:31 ID:???
>>801
「潰す」じゃなくて「叩く」だ、ボケ。
803nobodyさん:2005/11/30(水) 00:17:24 ID:???
>>802
「叩く」じゃなくて「追求させていただきます」だ、ボケ。
804nobodyさん:2005/11/30(水) 12:15:39 ID:BadrrQNs
>>801-803
ここはPerlスレだ、ボケ。
805nobodyさん:2005/11/30(水) 12:36:29 ID:???
>>804
さげろ、ボケ。
806nobodyさん:2005/11/30(水) 13:27:40 ID:???
ぜったいageてなんかあげないんだからねっ!!
807nobodyさん:2005/11/30(水) 14:38:09 ID:???
下げたお
808nobodyさん:2005/11/30(水) 14:47:51 ID:???
(;^ω^)・・・
809nobodyさん:2005/11/30(水) 15:33:38 ID:???
ネタでもいいけど、せめて何かperlishなネタを書けよ…
810nobodyさん:2005/11/30(水) 16:05:54 ID:???
$ichi $ni

このふたつの変数を足し算した結果を出力したいのですが、どうすればよいのでしょうか
811nobodyさん:2005/11/30(水) 16:37:17 ID:???
真ボスキタ━━━━━(゚∀゚)━━━━━!!
812nobodyさん:2005/11/30(水) 17:27:28 ID:BWMdiBVJ
print $san;
813nobodyさん:2005/11/30(水) 18:47:17 ID:???
print $ichini;
814nobodyさん:2005/11/30(水) 20:25:37 ID:???
やべwwwwクソワロタwwwwwww
815nobodyさん:2005/12/01(木) 00:24:08 ID:0lJ9PdU1
$pring
816nobodyさん:2005/12/01(木) 01:33:14 ID:???
そろそろ面白くないからもういいよ。
817nobodyさん:2005/12/01(木) 03:20:18 ID:???
$twelve
818!omikuji:2005/12/01(木) 04:22:29 ID:???
!omikuji
819nobodyさん:2005/12/01(木) 07:44:14 ID:???
>>816
$omaegana
820nobodyさん:2005/12/01(木) 07:45:09 ID:???
>>816
$kukiyome
821nobodyさん:2005/12/01(木) 07:45:42 ID:???
>>816
$chin kasu
822nobodyさん:2005/12/01(木) 08:22:49 ID:???
空気読めてないのはお前らだろ。
823!omikuji:2005/12/01(木) 08:23:34 ID:???
!omikuji
824nobodyさん:2005/12/01(木) 08:55:16 ID:???
>>822
$kukiyome chin kasu
825nobodyさん:2005/12/01(木) 08:55:48 ID:???
816=822

↑$pugya-
826nobodyさん:2005/12/01(木) 08:56:22 ID:???
>>822
$pan katte koi
827!omikuji:2005/12/01(木) 09:09:32 ID:???
!omikuji
828nobodyさん:2005/12/01(木) 09:12:14 ID:???
複数の戻り値を得たい時に

my ( $hoge1, $hoge2, $hoge3 ) = hogehoge();

とする事はできるのですが

my ( $hoge1, %hoge2, @hoge3 ) = hogehoge();

な感じで違う種類の戻り値を得たい場合は
どのように書けば良いのでしょうか?
829nobodyさん:2005/12/01(木) 09:31:46 ID:???
830828:2005/12/01(木) 10:11:00 ID:???
>>829を見ました。
つまり、1発で取り出すのは無理で、
リファレンスの配列を作り

my @tmp = hogehoge();
my $hoge1 = $tmp[0];
my %hoge2 = %{$tmp[1]};
my @hoge3 = @{$tmp[2]};

上記のような感じで
取り出せって事で良いですか?
831nobodyさん:2005/12/01(木) 10:34:52 ID:???
グローバル変数を使うといいお( ^ω^)
832nobodyさん:2005/12/01(木) 11:18:37 ID:???
>>830
それでもいいし、

sub hogehoge {
  my($scalar, $array, $hash) = @_;
  ${$scalar} = 'hoge';
  @{$array} = (0..5);
  %{$hash} = (foo => 1, bar => 2);
}
hogehoge(\$hoge1, \@hoge2, \%hoge3);

でもいいよ。
833nobodyさん:2005/12/01(木) 11:40:24 ID:6Wvm5Rjx


グラフ表示に、GD使ってかいてんですけど、
モニタで見るには、気にならないのですが、
プリントアウトすると、結構荒くてもひとつなんですが。
他に、綺麗にperlでグラフ表示させるのってなんかあります?
834nobodyさん:2005/12/01(木) 11:52:22 ID:???
>>833
綺麗かどうかは知らんけど、GDを使わないものも色々あるよ。
http://search.cpan.org/search?m=all&q=Graph&s=1&n=100
835nobodyさん:2005/12/01(木) 12:27:34 ID:kcqRAlrr
FTPサーバにHTMLファイルをアップロードするCGIというのは実現可能でしょうか?
836nobodyさん:2005/12/01(木) 12:30:35 ID:???
>>833
GDの使い込みが足りない。
設定次第で驚愕するほど美麗なグラフも出力できるぞ。
837nobodyさん:2005/12/01(木) 12:33:39 ID:???
>>835
CGI経由でやらなきゃいけない事か考え直した方がいいと思うけど。
http://search.cpan.org/~gbarr/libnet-1.19/Net/FTP.pm
838nobodyさん:2005/12/01(木) 12:39:03 ID:???
>>837
ありがとうございます。
どうしてもCGI経由でやりたいので助かります。
839566:2005/12/01(木) 16:30:41 ID:???
以前メタ文字関連で質問させて頂いた者です。

$word = quotemeta("a b c");
print $word;

このようにすると、出力文字列が
a\ b\ c
となってしまいます。
quotemetaは/[A-Za-z_0-9]/にマッチしない全ての文字の前にバックスラッシュをつけるようですが、
$wordに\または.がある場合のみ、この2文字の前にバックスラッシュを入れるということは可能でしょうか。

掲示板のログ検索機能なのですが、
検索対象文字に\を入れるとエラーが出て、
.を入れると全記事がヒットしてしまう状況に悩んでいます。
>>566も併せて参照していただけると有り難いです。
840nobodyさん:2005/12/01(木) 16:50:23 ID:???
掲示板で検索って言ったらマルチバイト文字も来るだろうから、
入力された文字に対してquotemetaを使ったら\が入りまくって意味不明なことになるからNG
841566:2005/12/01(木) 17:39:55 ID:???
\Q\Eについて調べました。
>>566のソースから
- if ($data[6] =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$words[$_])/) {
+ if ($data[6] =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:\Q$words[$_]\E)/) {
こうする事で解決できました。
842nobodyさん:2005/12/01(木) 21:07:49 ID:???
かなり説明わかりにくいのですが、わかるかたヘルプです。
.pl から .pl に飛ばしたいと思っています。
 Location: test.pl
とやって read( STDIN, $hoge, $ENV{'CONTENT_LENGTH'} );
で、$hoge に情報がくっ付いてくる(&nama=boku)のようにしたいのですが
どのようにすれば出来るのでしょうか?
843nobodyさん:2005/12/01(木) 21:53:39 ID:???
if ($AAA =~ /$BBB/) {・・・

$AAAが$BBBという文字列を含んでいるなら・・・
としたいのですがこのままだとエラーがでてしまいます。
どのように修正すればいいのでしょうか?
844843:2005/12/01(木) 21:57:30 ID:???
Perlコーディング・・・もしかしてスレ違い?失礼しました
845nobodyさん:2005/12/01(木) 21:57:44 ID:???
if ($AAA =~ /\$BBB/) { foo(); }
846nobodyさん:2005/12/01(木) 21:58:15 ID:???
>>842
Locationで飛ばしてPOST送信にしたいということになるのかな。
それは不可能。POSTで送らないとならない理由があるの?
単に情報を付けたいだけならQUERY_STRINGを使うべし

>>843
if ($AAA =~ /\Q$BBB\E/) {
847843:2005/12/01(木) 22:03:36 ID:???
>>845-846
ありがとうございます。
>>846さんの方法で解決できました。
848nobodyさん:2005/12/01(木) 23:34:13 ID:6Wvm5Rjx
>>834
うーむ、いろいろとありますな・・・。
今は、時間がないので、チェックできませぬ。

>>836
GD::Graph使ってるんで、
ttp://www.linkclub.or.jp/~ma3ki/webutil/gdgraph/howtograph.html
これぐらいは、できるんだけど、円グラフなんか、印刷すると枠や、ラインがガタガタで、
設定とかあります?
とりあえず、最新バージョンに上げてみましたが、なにもかわらずでした。orz
849nobodyさん:2005/12/02(金) 00:01:04 ID:???
>>846さん
ありがとうございます。見た目的に長いURLになっちゃうのが格好悪いな…
って思っちゃったぐらいです。
このたびは大人しく諦めることにします。
850nobodyさん:2005/12/02(金) 00:04:42 ID:???
>>849
一時ファイル作るとか、Cookie使うとか
851nobodyさん:2005/12/02(金) 02:01:48 ID:lZKmMfsr
入力値にa〜z、A〜Z、0〜9、-、_、しか入力されないように
チェックしたいと考えています。

if($abc =~ /[^a-zA-Z0-9]/){ }
大小英字、数字に関しては上記の様にする事で実現できたのですが
-と_の記号を含めてチェックするには上記にどのように含めて
記述したら良いのでしょうか?
852nobodyさん:2005/12/02(金) 02:14:27 ID:???
853849:2005/12/02(金) 02:43:53 ID:???
>一時ファイル作る
なるほど! Cookieは理解不足にしてもこれならいけそうです Thx!!
854nobodyさん:2005/12/02(金) 07:56:04 ID:???
>>853
セッション
855Perl初心者:2005/12/02(金) 09:40:50 ID:???
>>851
あれ、これでダメなの?
\がいるのかな?

/[^a-zA-Z0-9_-]/
856nobodyさん:2005/12/02(金) 12:41:38 ID:zgDZ/Pi8
>>855
/[^a-zA-Z0-9_\-]/
エスケープしてくだちぃ
857nobodyさん:2005/12/02(金) 12:52:02 ID:???
[]内の最後に書く分には必要ないっしょ<エスケープ
858nobodyさん:2005/12/02(金) 12:56:28 ID:???
みんな\dとか使わないの?解りやすいから0-9とか使ってンノ?
859nobodyさん:2005/12/02(金) 13:20:04 ID:???
文字クラス内だと\d使えない(はず)
860nobodyさん:2005/12/02(金) 13:28:19 ID:???
>>859
使えるよ

% perl -e '"ab123cd" =~ /([\d]+)/ and print "match: $1\n";'
match: 123
861nobodyさん:2005/12/02(金) 14:22:38 ID:???
教える側の知識がグダグダなスレ。
862nobodyさん:2005/12/02(金) 14:39:45 ID:???
> 852 名前:nobodyさん(sage) 投稿日:2005/12/02(金) 02:14:27 ID:???
> >>851
> http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html#using_character_classes

> '-'がキャラクタクラスの中の最初か最後のキャラクタであった場合、
> 通常のキャラクタとして扱われます。[-ab]、[ab-]、[a\-b]はすべて等価です。

> \d\s\w\D\S\Wの省略記法はキャラクタクラスの内側でも外側でも使うことができます。
> 以下はその例です:
>
> /\d\d:\d\d:\d\d/; # hh:mm:ss 形式の時間表記にマッチ
> /[\d\s]/; # 数字または空白にマッチ
863nobodyさん:2005/12/02(金) 14:48:03 ID:???
>>861
WebProg板なのでご了承下さい
864nobodyさん:2005/12/02(金) 15:38:16 ID:???
すごいことになってるな。

# 例えば、aだけにマッチなら
/^a+$/ または !/[^a]/
865nobodyさん:2005/12/02(金) 16:09:40 ID:???
どっかのベンチでは\wを使うほうが速かった
866nobodyさん:2005/12/02(金) 16:49:33 ID:???
use Benchmark;
my $count = 2000000;
my %codes = ();
my $wt = 'omaemona-itteyosijisakjen_07211919童貞';
$codes{'code1'} = q{
1 if /[^a-zA-Z0-9_-]/;
};
$codes{'code2'} = q{
1 if /[^a-zA-Z0-9_\-]/;
};
$codes{'code3'} = q{
1 if /[^\da-zA-Z-]/;
};
$codes{'code4'} = q{
1 if /[^\w-]/;
};
timethese($count,\%codes);

結果:激しくバラバラ
867JAPU ◆lVJAPUTeX. :2005/12/02(金) 18:21:04 ID:???
ごきげんよう。

\w はロカールを考慮する (場合がある) という話があったなぁ。sage
868nobodyさん:2005/12/02(金) 18:46:19 ID:McNady6M
置換の正規表現内で、if文を二つ以上使うにはどうすればいいですか?

$hoge =~s/hoge/
条件1 ? 式 a : 式 b ;
条件2 ? 式 c : 式 c ; /e

うまく実行されないみたいなんですが。。
869JAPU ◆lVJAPUTeX. :2005/12/02(金) 18:58:26 ID:b5HKaxNa
はにゃーん

こういうことをやりたいのかな?
$hoge = "creamy fancy magical";
$hoge =~ s{(\w+)}{
if($1 eq "creamy") { "mami" }
elsif($1 eq "magical") { "emi" }
else { "unknown" }
}ge;
870nobodyさん:2005/12/02(金) 19:20:52 ID:McNady6M
よくみたら一つの三項演算子が機能してないだけでした。

$iの先頭に'う'が含まれてたら
$hoge1、ふくまれてなかったら$hoge2を、
$tmpに代入して、$hogeを書換したいんです。
でも、$iがなんであろうと、$hoge1のほうが代入されてしまうんです。
どうすればいいんでしょうか。

$uaaaa = ~s/うあああああああ/
$i = ~m!^う! ?
$tmp=$hoge1 : $tmp =$hoge2;
$tmp
/e;
871nobodyさん:2005/12/02(金) 19:23:07 ID:???
$hogeを書き替えたい→$uaaaaを書き替えたい、の間違いです。
すみません。
872JAPU ◆lVJAPUTeX. :2005/12/02(金) 19:34:04 ID:???
何をやりたいのか解読できないのだけど。

とりあえず気づいた点を指摘。
$foo =~ s/regex/replacement/;
$foo = ~s/regex/replacement/;
この2つは異なる (空白の位置に注意) けどそれは大丈夫かな?
後者は
$foo = (~s/regex/replacement/);
と介錯されるので,99.99%くらいの確率で意図しているものとは違うと思う。

参考演算子は
$var = ($foo eq "bar")? $baz: $zot;
みたいな形に書いたほうがわかりやすいとおもう。


- 実際に実行したコード (それ単体で完結したもの)
- やりたいこと
- 意図した結果/実際の結果
を書けば暇な人が答えるかも。
873nobodyさん:2005/12/02(金) 22:05:38 ID:???
>>872
久々に見た
本物?
874nobodyさん:2005/12/02(金) 22:12:22 ID:???
おれも久々に見た。_gunzipは見ないけど・・
875JAPU ◆lVJAPUTeX. :2005/12/02(金) 23:07:32 ID:???
コードのインデントは乱さないように,変数は命名規則に従うように,きっちりと書くのがここでのたしなみ。もちろん,use strict; しないなどといった,はしたないプログラマなど存在していようはずもない。

【変数の役割】
素直にそのまま解釈すると,
$uaaaa ... 書き換えの対象
$i ... この先頭に "う" が含まれているかどうか (*) で処理を分ける
$hoge1 .., (*) が真 (成り立った) の場合置換する文字列
$hoge2 ... (*) が偽 (成り立たない) の場合に置換する文字列
でいいのかな?

【コード】
$uaaaa = "ふえいとうあああああああもえもえ";
$i = "うる星やつら";
$hoge1 = "せいばー";
$hoge2 = "とおさかりん";

$uaaaa =~ s{うあああああああ}{ ($i =~ /^う/)? $hoge1: $hoge2; }e;
print "$uaaaa\n";

>>873
本物です。:)
http://www.japu.org/ (近況更新しておきました。)
876nobodyさん:2005/12/02(金) 23:55:46 ID:???
>>875
http://www.japu.org/about_japu.html の掲示板が潰れているよ。
877nobodyさん:2005/12/03(土) 00:22:10 ID:???
何この痛いコテ
878nobodyさん:2005/12/03(土) 01:09:43 ID:???
真性だから触るな
879nobodyさん:2005/12/03(土) 01:10:08 ID:IjoTBsN+
「うぐぅ」っておまえはまだ粘着してんのかよ
880nobodyさん:2005/12/03(土) 08:04:29 ID:9ILkhYC5
ありがとうございます。
三項演算子というのがよくわかってないのかも。
/で始まるパスの前には'http://yahoo.co.jp'をくっつけるようにして、
それ以外で始まるパス(../とか)の前には'http://yahoo.co.jp/mail/tegami/letter/'というURLをくっつけるようにしたいんです。
以下の方法だと、パスがなんであろうと後者のほうがくっついてしまうようなんですが、三項演算子の部分、どこが間違ってるんでしょうか。
(これを置換の式に組みこみたかったんです)

#!/usr/bin/perl
print "Content-type: text/html\n\n";

#パス名を /hoge.jpg に設定
$path='/hoge.jpg';

$host="http://yahoo.co.jp";
$directory="http://yahoo.co.jp/mail/tegami/letter/";

#問題の三項演算子
$path=~m/^\// ? $tmp=$host : $tmp=$directory;

# URLにして表示
print $tmp.$path;
exit;

結果
http://yahoo.co.jp/mail/tegami/letter//hoge.jpg
881nobodyさん:2005/12/03(土) 08:08:54 ID:9ILkhYC5
ありがとうございます。
三項演算子というのがよくわかってないのかも。
/で始まるパスの前には'http://yahoo.co.jp'をくっつけるようにして、
それ以外で始まるパス(../とか)の前には'http://yahoo.co.jp/mail/tegami/letter/'というURLをくっつけるようにしたいんです。
以下の方法だと、パスがなんであろうと後者のほうがくっついてしまうようなんですが、三項演算子の部分、どこが間違ってるんでしょうか。
(これを置換の式に組みこみたかったんです)

#!/usr/bin/perl
print "Content-type: text/html\n\n";

#パス名を /hoge.jpg に設定
$path='/hoge.jpg';

$host="http://yahoo.co.jp";
$directory="http://yahoo.co.jp/mail/tegami/letter/";

#問題の三項演算子
$path=~m/^\// ? $tmp=$host : $tmp=$directory;

# URLにして表示
print $tmp.$path;
exit;

結果
http://yahoo.co.jp/mail/tegami/letter//hoge.jpg
882880:2005/12/03(土) 08:14:38 ID:???
おお、すみません。
>>872をよく見て、
$tmp=($path=~m/^\//) ? $host : $directory
と書き直したらちゃんと動作しました。
ただの見た目の問題かと思っていたら、
こういうふうに書かなければ動かないんですね。
ありがとうございました。
883JAPU ◆lVJAPUTeX. :2005/12/03(土) 09:11:41 ID:???
($path =~ m/^\//)? ($tmp = $host): ($tmp = $directory);
または
$tmp = ($path =~ m/^\//)? $host: $directory;

三項演算子として使うなら後者が一般的。前者の書き方をしたければ if/else を使うほうが良いと思う。


>>881 のコードが動かないのは,
$path =~ m/^\//? $tmp = $host: $tmp = $directory;
は演算子の優先順位の関係で
($path =~ m/^\//? $tmp = $host: $tmp) = $directory;
と解釈されてしまうので,条件によらず最終的に $directory が代入されてしまうため。

ちょっと説明不足でしたね。
884nobodyさん:2005/12/03(土) 10:49:25 ID:H4lHBq9R
質問させてください。

$str = q{<span id="hoge">あいうえお</span>あいうえお</span>}

最初のあいうえおだけマッチする正規表現はどう書けばいいのでしょうか?
$str =~ /???/;
885nobodyさん:2005/12/03(土) 11:15:01 ID:???
>>884が考えて失敗した正規表現の .* を .*? にしてみな
886nobodyさん:2005/12/03(土) 11:17:02 ID:H4lHBq9R
出来ましたありがとうございます
887nobodyさん:2005/12/03(土) 23:13:08 ID:???
>>884
Perl関係ないけど言っておこう。

<span>...</span>タグはインライン要素なので、ホントは入れ子にできない。
lattice(で合ってたっけ?)にもできない。
× <span>foo<span>bar</span>hoge</span>

入れ子にできるのはブロック要素。
888nobodyさん:2005/12/03(土) 23:30:02 ID:???
>>887
こらこら、適当なことを言うな。span要素は入れ子にできる。
ttp://www.w3.org/TR/html401/struct/global.html#edef-SPAN

というか所謂インライン要素はXMLで言うところのmixed contentなんだから、
文字データと共に自由に混交できる (他にスキーマで制約されていなければ)。
889nobodyさん:2005/12/03(土) 23:37:38 ID:9N6MOM3Z
連想配列のソートについて質問です。
配列には
@NEW[0]='a,3,C';
@NEW[1]='c,1,B';
@NEW[2]='b,2,A';
のように納まってます。
@NEW[0]='c,1,B';
@NEW[1]='b,2,A';
@NEW[2]='a,3,C';
結果はこのように数字部分をソートする方法を考えてます。

foreach my $data ( @NEW ) {
($youso1,$youso2,$youso3) = split (/\,/,$data);
$xx[$data] = $youso2;
}
%yy = sort values (%xx);
@NEW = keys %xx;
このようなものを考えたのですがうまく動きません・・・
お知恵をください・・・
890889:2005/12/03(土) 23:38:52 ID:???
× %yy = sort values (%xx);
○ %xx = 〜 です

ageてすみません ○| ̄|_
891nobodyさん:2005/12/04(日) 00:09:50 ID:???
>>889
まず @NEW[0]='a,3,C'; は $NEW[0]='a,3,C'; だ。
次に $xx[$data] = $youso2; は配列の添え字部に $data が入ってる。恐らくやりたいのは $xx{$data} だろう。
で、 %yy = sort values (%xx); は値を基準にソートしたつもりだろうが、
valuesを使った時点でキーを含まないリストになってしまうので
このようにする @NEW = sort { $xx{$a} <=> $xx{$b} } keys %xx;
この(889の)方法はハッシュのキーを使うため重複が纏められてしまう。
ついでにハッシュはキーの順番を保持しないので最後に @NEW = keys %xx; こうすると意味が無い。

まあ多少効率は落ちるかも知れないが @NEW = sort { (split',',$a)[1] <=> (split',',$b)[1] } @NEW; の1行でできるんだけどな。
892nobodyさん:2005/12/04(日) 00:11:41 ID:???
基本の Schwartzian Transform なら
my @new = ('a,3,C', 'c,1,B', 'b,2,A');
@new = map{ $_->[0] } sort{ $a->[2] <=> $b->[2] } map{ [$_, split(/,/)] } @new;

ハッシュ使うなら
my @new = ('a,3,C', 'c,1,B', 'b,2,A');
my %hash = map{ (split(/,/))[1] => $_ } @new;
my @new = @hash{sort{ $a <=> $b } keys %hash};
893JAPU ◆lVJAPUTeX. :2005/12/04(日) 00:13:24 ID:???
>>889

まずは,ハッシュ (Perl4まで連想配列と呼ばれていたものは,Perl5でハッシュと呼ばれるようになりました) のキーを指定する方法に誤りがあります。
× $xx[$data] = $youso2;
○ $xx{$data} = $youso2;
前者は (通常の) 配列 @xx の要素にアクセスする際の記法です。

ここで %xx のキーに元データが入っていますので,keys %xx を並べかえればよいということになります。
比較するためのデータはハッシュに値として入っているので,下記の通り記述すれば動くことでしょう。
@ordered = sort { $xx{$a} <=> $xx{$b} } keys %xx;

※ ハッシュ,sort などについては,マニュアルを参照してください。
- http://perldoc.perl.org/
- プログラミングPerl (オライリー)
- Programming (O'Reilly)

----
手段は違いますが,このような処理をする際の定石を示しておきます。
my @ary = ("a,3,C", "c,1,B", "b,2,A");
# @tmp0 = (["a,3,C", 3], ["c,1,B", 1], ["b,2,A", 2]);
my @tmp0 = map { [$_, (split /,/)[1]] } @ary;
# @tmp1 = (["c,1,B", 1], ["b,2,A", 2], ["a,3,C", 3]);
my @tmp1 = sort { $a->[1] <=> $b->[1] } @tmp0;
# @ordered = ("c,1,B", "b,2,A", "a,3,C");
my @ordered = map { $_->[0] } @tmp1;
print "@ordered\n";
----
これを一文にまとまるとこうなります。Schwartzian Transform と呼ばれています。
my @ordered = (map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_, (split /,/)[1]] } @ary);
# 詳細は Effective Perl を読むと良いです。
894889:2005/12/04(日) 00:34:13 ID:???
>>891-893
なるほど・・・よくわかりました。ハッシュには順番がないのですね。
Schwartzian Transformで簡単にできたので、これとハッシュについて学んでみます。
ありがとうございました。
895nobodyさん:2005/12/04(日) 09:41:27 ID:???
Fedora Core 4 + Perl 5.8.6 です。質問お願いします。

Perl ローケルの一時的な変更の方法を教えてください。
strftime( '%d/%b/%Y', localtime() );
で 01/Oct/2005 みたいな結果を期待したのですが、 01/12月/2005 のような日本語に合わせた結果になって困っています。
それとも素直に月名を配列に入れるのが得策でしょうか?

調べたところ i18n ファイルを変更すべしと書いてあるサイトに多数出会ったのですが、
他のアプリケーションには一切影響を与えたくないため何か別の方法があればお願いします。
896nobodyさん:2005/12/04(日) 10:39:23 ID:???
>>895
strftime を使わなければいいんじゃね?

sprintf '%02d/%s/%04d', (split /\s+/, localtime)[2,1,4];
897nobodyさん:2005/12/04(日) 11:30:38 ID:???
ImageMagickをインストールしたいんですが
perl Makefile.PL でエラーになります

Note (probably harmless): No library found for -lMagick
Note (probably harmless): No library found for -ldpstk
Note (probably harmless): No library found for -ldps
Note (probably harmless): No library found for -lXext
Note (probably harmless): No library found for -lXt
Note (probably harmless): No library found for -lSM
Note (probably harmless): No library found for -lICE
Note (probably harmless): No library found for -lX11

先に何か入れとく必要があるのでしょうか?
898nobodyさん:2005/12/04(日) 11:35:01 ID:???
>>897
「たぶん無害です」と言ってくれているのでそういうことなんじゃない?
899nobodyさん:2005/12/04(日) 11:47:37 ID:???
その先のmakeでエラーが出まくりで
コンパイルできないんです
900nobodyさん:2005/12/04(日) 11:49:12 ID:???
じゃあ持ってきてインストールすべし。
901nobodyさん:2005/12/04(日) 11:52:27 ID:???
なにをですか?
902nobodyさん:2005/12/04(日) 11:54:20 ID:???
lMagickとかでググっても何が必要か探せなかったので、、
903nobodyさん:2005/12/04(日) 12:01:54 ID:???
>>897-902
「ImageMagick」は C/C++ で書かれた画像加工ライブラリで、
君が作ろうとしているのは ImageMagick を perl スクリプトから
使う為の Perl モジュールである「PerlMagick」。-lMagick が
見つからんのなら、ImageMagick がインストールされていないか、
ライブラリの在り処を適切に指定していないんだろう。

何にせよスレ違いなんで、続きは以下へ移動してくれ。

Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/
904nobodyさん:2005/12/04(日) 12:04:22 ID:???
>>895
localeまわりの環境変数(LANGとかLC_ほげとか)をあらかじめ設定してから起動するとか、
POSIXモジュールのsetlocaleじゃだめなの? Fedora Coreは知らんのではずしてるかも
しれんけど。
905nobodyさん:2005/12/04(日) 18:01:02 ID:i00gwMB7
デコード処理
sub decode {local($buf,$key,$val);
undef(%in);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
$post_flag=1;
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); }
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} else {$post_flag=0;
$buf = $ENV{'QUERY_STRING'};}
foreach ( split(/&/, $buf) ) {
($key, $val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;

掲示板の最大文字数制限をしたくてソースを見ていました。
上の51200をいじれば最大文字数も変更できるのかと思い
50に変えたのですが、500文字の書き込みも普通に投稿できます。
どうすれば、制限することができるのでしょうか。それともここは関係ないのでしょうか。
他にあやしいところは下あたりです。よろしくお願いします。

記事登録
sub regist {local($flag,$oyaChk,@lines,@data,@new,@tmp);
# フォーム入力チェック &formCheck;
# 時間取得 &get_time;
906nobodyさん:2005/12/04(日) 18:19:15 ID:???
>>905
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/
907nobodyさん:2005/12/04(日) 18:33:59 ID:???
もともと51Kもの投稿を許すような掲示板のソースを改変しようとすること自体間違い
908nobodyさん:2005/12/04(日) 18:37:29 ID:gXJuNnnY
hogehoge.pmのファイルの三行目に
use 5.008001;
と言う記述があるのですが、これはなんでしょうか?

hogehoge.pmを利用しているファイルを動かすとエラーログに↓が返されています。

Premature end of script headers: hello.cgi
Perl v5.8.1 required--this is only v5.8.0, stopped at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.
909nobodyさん:2005/12/04(日) 18:39:46 ID:???
910nobodyさん:2005/12/04(日) 19:08:08 ID:5pWPWSDT
>>896
エエエェェェ(´Д`)ェェェエエエ
911908:2005/12/04(日) 19:24:42 ID:gXJuNnnY
>>909
ありがとうございます。

use 5.008001; と言う記述は、Perlのバージョンが5.8.1以上であれば、
↓のようなエラーは出なくなるのでしょうか?

Premature end of script headers: hello.cgi
Perl v5.8.1 required--this is only v5.8.0, stopped at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.
912nobodyさん:2005/12/04(日) 19:44:31 ID:???
>>895
setlocale(LC_TIME, 'C');
で行けると思う。
もちろんuse POSIX;して。
913905:2005/12/04(日) 20:09:52 ID:???
>>907
51200って文字制限には関係あるのでしょうか?
50に変えて500文字の投稿ができなかったので。
914nobodyさん:2005/12/04(日) 20:14:17 ID:???
915905:2005/12/04(日) 20:23:41 ID:???
解決しました。すみません。
916nobodyさん:2005/12/04(日) 20:57:50 ID:???
しかもマルチだし
917nobodyさん:2005/12/04(日) 21:24:10 ID:???
※低脳な質問はプログラム板でお願いします
918nobodyさん:2005/12/04(日) 21:33:34 ID:???
低脳は質問はWebProg板向きだな
919nobodyさん:2005/12/04(日) 21:50:20 ID:???
>>918
日本語できないヤシはハングル板向きだな
920nobodyさん:2005/12/04(日) 22:12:24 ID:???
※低脳な質問はここでお願いします  ム板住人一同
921nobodyさん:2005/12/04(日) 22:24:33 ID:???
Perllコーディングの質問で>>1をちゃんと読んでくれていれば、なんでもいいよ。
922nobodyさん:2005/12/05(月) 03:13:45 ID:???
日曜ってどうも必死な人間がいるよね
まぁ放置が一番だけど。
923nobodyさん:2005/12/05(月) 08:37:30 ID:???
だってここ実際にレベル低いし(笑)
924nobodyさん:2005/12/05(月) 09:32:44 ID:???
m9(^Д^) プギャー
925nobodyさん:2005/12/05(月) 15:03:00 ID:S1tZNUNq
だって、初心者質問スレって書いてあるじゃん・・・
926nobodyさん:2005/12/05(月) 15:05:05 ID:S1tZNUNq
>>911
Perl v5.8.1 required--this is only v5.8.0, stopped at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.

英文を見る限りこのエラーは、perl5.8.1以前だと出るのだと思う。
927nobodyさん:2005/12/06(火) 22:00:39 ID:???
いま、登録CGIを作ろうとしているのですが、ユーザー名、パスワードのはじめに数字があるとき警告するようにしたいです。
indexで[0-9]を探して、返してきた値が0、つまり文字のはじめだったらエラーを返そうとしたのですが
indexから返される値がどうもおかしいようで、うまくいきませんでした。

どのようにしたらうまくいくのでしょうか?どなたか教えてください。
928nobodyさん:2005/12/06(火) 22:05:56 ID:???
$pass =~ m/^\d/
929927:2005/12/06(火) 22:40:27 ID:???
>>928さん
うまくいきました。

正規表現のリストから見落としていました。
ありがとうございました。
930nobodyさん:2005/12/07(水) 12:18:20 ID:7UCC6Dk6
すっごい、初心者な質問なんですが、
HTMLを出力させる際に

print "(ここにHTMLソース)"

ってかんじでやっていて、HTMLソースの中で変数を表示する際に
普通に $TOTAL とかで数字の変数はうまく、そこに表示されますが、
文字列($TOTALTEXT='あなたの合計点は低いです。')は $TOTALTEXT
と記述しただけでは、うまく表示されません。

どなたか分かる方いませんか?
931nobodyさん:2005/12/07(水) 12:28:37 ID:???
>>930
>>1
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
932nobodyさん:2005/12/07(水) 12:39:51 ID:???
エスパーさーーん
933nobodyさん:2005/12/07(水) 12:45:31 ID:???
>>930
まず、日本語を勉強してきてください。
934えすぱ:2005/12/07(水) 14:16:24 ID:???
>930
Shift_JISではなくEUCでやりなされ。
935930:2005/12/07(水) 14:25:17 ID:7UCC6Dk6
1:変数$TOTALTEXT(文字列が入っている)をHTMLを出力させたいです。

2:print "(ここにHTMLソース、そしてこの中で$TOTALTEXTの文字列を表示したい)"

3:結果として、HTMLは出力されますが、$TOTALTEXTの内容は表示されません。


どうでしょうか
936nobodyさん:2005/12/07(水) 14:27:05 ID:???
表示されない訳がない
実際のコード貼ってみろ
937930:2005/12/07(水) 14:32:23 ID:7UCC6Dk6
すまそ、こんなかんじです

$ALLTOTALTEXT='テスト'


#HTML出力
print "Content-type: text/html; charset=Shift_JIS\n\n";
print "<html>\n<head>\n";
print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n";
print "</head><body>「$ALLTOTALTEXT」</body><html>";
938930:2005/12/07(水) 14:33:03 ID:7UCC6Dk6
ちなみに文字列が数字ならうまく表示されるみたい。。。
939nobodyさん:2005/12/07(水) 14:42:24 ID:???
ふつーに表示されたが
940nobodyさん:2005/12/07(水) 14:42:26 ID:???
941930:2005/12/07(水) 14:48:14 ID:7UCC6Dk6
>>939
えっ?まじ?

>>940
print "Content-type: text/html; charset=Shift_JIS\n\n";
のShift_JISのとこを変えればいいのかな
942930:2005/12/07(水) 14:52:26 ID:7UCC6Dk6
えすぱーさん、くわしく
943nobodyさん:2005/12/07(水) 14:53:44 ID:???
>>937
$ALLTOTALTEXT='テスト' の末尾に ; が抜けているし
突っ込み処満載だが、; さえ入れればそれで問題ない。

>>941
Shift_JIS や x-sjis を変更した上で、ファイル自体も
EUC-JP で保存。
http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP

まぁ盲目的に EUC-JP にすれば OK という事ではなくて、
EUC-JP の方が問題が起きにくいってだけだけどな。
同じ変えるなら UTF-8 にした方がいいし、携帯コンテンツ
だと Shift_JIS しか使えないって事もあるだろうし。
944930:2005/12/07(水) 14:57:06 ID:7UCC6Dk6
>>943
指摘ありがとう。;はただの記述ミスです。
JCODEいれてるんですが、これでは駄目なのかな?

携帯コンテンツではなく、PCオンリーなんですが
おすすめはShift_JIS?
945nobodyさん:2005/12/07(水) 15:04:14 ID:???
>944
>943が貼ってくれたリンク先をよく読め
946930:2005/12/07(水) 15:09:57 ID:7UCC6Dk6
読んでみたんですが、難しいですね。。。
メールも自動生成して出力してるんですが、
メールのほうではちゃんと出力されるのが謎なんですよね
947930:2005/12/07(水) 15:22:01 ID:7UCC6Dk6
できました。みなさん、ありがとう
948nobodyさん:2005/12/07(水) 15:25:45 ID:???
print "<$ALLTOTALTEXT>";
949nobodyさん:2005/12/07(水) 16:54:51 ID:???
print 'もう来るな';
950nobodyさん:2005/12/07(水) 17:21:10 ID:qBdfvq/C
EUC-JP と言ってるのに 「おすすめは Shift_JIS?」 って、まずは小学校に入ってこい。
話はそれからだ。
951分かりません!:2005/12/08(木) 00:23:26 ID:zq2aWK4E
webアプリ初心者です;
調べたけどよくわからなかったんで質問させてください。
やりたいことはperlとDBを使用したアプリ作成です。DBはmysql、mdb
どちらかで考えています。
現在の環境
os:windowsXp
webサーバ:Apache

1:DBの配置場所が分かりません。どこのディレクトリに配置して
  どのような呼び出し方をするのでしょうか。(DBIでデータソース
  を指定するところ)



2:実際インターネットにのっけたとき、サーバはunixになると思うんですが
  そのときのDBの配置場所を教えてください。また、webサーバによって
  dbの配置場所、接続方法は変わるんでしょうか?



952nobodyさん:2005/12/08(木) 00:26:01 ID:???
>>951
>>1を読もうね。
953nobodyさん:2005/12/08(木) 00:54:51 ID:???
>DBの配置場所

メモリ上、又はファイル
954nobodyさん:2005/12/08(木) 01:00:14 ID:/QVLECMb
CSV形式のファイルをダウンロードさせるCGIを構築しています。
主な流れは下記の通りです。

push(@dump, "あ,123,,,,,,,,,,,,\n");
push(@dump, "い,456,,,,,,,,,,,,\n");
push(@dump, "う,789,,,,,,,,,,,,\n");
 :
 :

print "Content-Disposition: attachment; filename=abc.csv\n";

my($sizeTmp);
foreach(@dump){
$sizeTmp .= $_;
}
my($size) = length($sizeTmp);

print "Content-Length: $size\n\n";
print "$downloadCsv";

ダウンロードはできるのですが、
lengthでファイルサイズが正しく取れていない??(おそらく)
それにより、ダウンロードしたCSVファイルを開くと
最後の方が欠けています。
よりよい方法や参考サイト等はございますでしょうか?
ご教授頂けたら幸いです。
955nobodyさん:2005/12/08(木) 01:06:06 ID:???
$downloadCsv の内容を詳しく
956954:2005/12/08(木) 01:10:27 ID:/QVLECMb
>>955
申し訳ありません。一部訂正です。
$downloadCsvは下記の様になります。

my($downloadCsv);
foreach(@dump){
$sizeTmp .= $_;
}
my($downloadCsv) = length($sizeTmp);

print "Content-Length: $size\n\n";
print "$downloadCsv";
957nobodyさん:2005/12/08(木) 01:12:13 ID:???
それだと $downloadCsv に $sizeTmp の長さが入っちゃって
数値だけの変なファイルがダウンロードされる気がするんだけど
958954:2005/12/08(木) 01:14:09 ID:/QVLECMb
申し訳ございません。ご指摘の通りでした。
再修正してみましたが、やはりDLしたCSVファイルが欠けてしまいます。

my($downloadCsv);
foreach(@dump){
$downloadCsv .= $_;
}
my($size) = length($downloadCsv);

print "Content-Length: $size\n\n";
print "$downloadCsv";
959nobodyさん:2005/12/08(木) 01:17:22 ID:???
それだけじゃ原因が分からないなぁ
全体のソースとか無理かな
960954:2005/12/08(木) 01:27:44 ID:/QVLECMb
下記が実際に用いているものです。
内容は繰り返し部分を省いた以外はほぼそのままです。

<IN>:$in{data} = abc;(DLファイル名)

my(@dump);

push(@dump, "更新,$y/$m/$d,,,,,\n");
push(@dump, "記録,$hashDay{$in{'data'}}日分,,,,,\n");
push(@dump, ",,,,,,\n");
push(@dump, "更新,$y/$m/$d,,,,,\n");
 :
 以下繰り返し
 :

print "Content-Type: application/octet-stream\n";
print "Content-Disposition: attachment; filename=$in{data}.csv\n";

my($downloadCsv);
 foreach(@dump){
$downloadCsv .= $_;
}
my($size) = length($downloadCsv);

print "Content-Length: $size\n\n";
print "$downloadCsv";

exit;
961nobodyさん:2005/12/08(木) 01:41:13 ID:VQhX6ruj
改行コードがlength()だと1で
printしたときは\x0D\x0Aの2になるとかじゃない?
ちゃんと調べてないけど

何バイト分足りないのか比べて見たら?
962nobodyさん:2005/12/08(木) 01:44:30 ID:???
Content-Length って別に要らないだろ
進行状況のバーが無くなるぐらいだし
963954:2005/12/08(木) 02:00:29 ID:/QVLECMb
ありがとうございました。
とりあえず、Content-Lengthが無いとローカルでDLできない様なので
付ける方向で行こうと考えています。
DLするCSVのデータ中の改行に\x0D\x0Aを用いる事ができなかったので
下記の様にする事で問題を回避できました。

my($downloadSize);
my($downloadCsv);
foreach(@dump){

 my($downloadSizeTmp) = $_;
 $downloadSizeTmp=~ s/\n/\x0D\x0A/g;
 $downloadSize .= $downloadSizeTmp;

 $downloadCsv .= $_;
}
my($size) = length($downloadSize);

print "Content-Length: $size\n\n";
print "$downloadCsv";
964nobodyさん:2005/12/08(木) 02:05:27 ID:???
ちなみに \x0D\x0A って \r\n のことだからね
965954:2005/12/08(木) 02:18:27 ID:/QVLECMb
なるほど。
\r\nはウィンドウズの改行コードだと思うのですが、
改行コード\nをウィンドウズのローカルにDLすると\r\nに変換されるのでしょうか?
現状では\nでDLしてもContent-Lengthが正しければ正常にDLできています。
966nobodyさん:2005/12/08(木) 02:20:59 ID:???
つーか Content-Length ヘッダ無しでダウンロードできないって
どんなブラウザ使ってるんだ?
967954:2005/12/08(木) 02:23:59 ID:???
ブラウザはSleipnir 2 でIEのエンジンを利用してます。
やはり何度やってもContent-Lengthがないと
Internal Server Errorになります。
968nobodyさん:2005/12/08(木) 02:25:27 ID:???
一部携帯では必須
969nobodyさん:2005/12/08(木) 02:27:15 ID:???
>Internal Server Errorになります。

それ、
>print "Content-Length: $size\n\n";
この行をそのまま消したからだろ

>print "Content-Length: $size\n\n";

>print "\n";
に置き換えてみろ
970954:2005/12/08(木) 02:29:20 ID:???
なるほど。
ご指摘の通り、現環境ではprint "\n";で問題ありませんでした。
971954:2005/12/08(木) 02:38:44 ID:/QVLECMb
改行コードの事で一点気付いたのですが、
\nで処理しているデータは\r\nや\rなどDLする環境向けに
変換する必要があるのでしょうか?

現ローカル環境のWinでDLした際には問題なかったのですが、
その他の環境やMac環境むけにDLさせる場合は
\r等に置換しないと問題となったりする物なのでしょうか?
972nobodyさん:2005/12/08(木) 07:21:12 ID:qoVbfW3N
abcdefgabcdef

こういった文字列が合った場合、2個目の abc にマッチさせたい場合の正規表現がわかりません。
行末にあれば abc$ でマッチできるんですが …
973nobodyさん:2005/12/08(木) 07:38:25 ID:???
>>971
EXCELやある程度の機能があるエディタなんかは各種改行コードに対応しているので問題ない
メモ帳だと\nのファイルは1行で表示されるので問題あり。
974nobodyさん:2005/12/08(木) 09:19:32 ID:???
>>971
何でもかんでも鵜呑みにせずウラを取ろうな。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
http://www.studyinghttp.net/rfc_ja/rfc2616.ja.xhtml.gz#Sec2.2
http://www.nilab.info/docs/cgi/draft-coar-cgi-v11-03-clean-jp.html#7.2.1

まともな HTTP サーバならヘッダ部の改行コードに関しては気を利かせて
くれるので "\n" で問題無い。ボディ部、今回の件だと CSV ファイルの
改行コードは >>973 の言う通りで、ファイルを読む人のソフトが特定できる
なら改行コードを合わせて吐いた方が無難。

>>972
my $str = "abcdefgabcdef\n";
for ('abc', 'def') {
  $str =~ s/(($_).*?)(\2)/ $1 . uc $3 /e;
  print $str;
}
975nobodyさん:2005/12/08(木) 09:23:44 ID:qoVbfW3N
やっぱループさせないと無理ですか・・・
976nobodyさん:2005/12/08(木) 11:18:07 ID:???
MacOSの改行コードが \r なのは9以前で
OSXからは \n だからね
977nobodyさん:2005/12/08(木) 13:24:04 ID:???
>976
改行コードはどのプラットフォームでも\n。
\r→CR
\n→LF
としないと、意味不明。
978954:2005/12/08(木) 13:51:47 ID:/QVLECMb
ありがとうございます。
現状ではDLするのは主にWin環境です。
CSVエクセルファイルであるため、開くソフトはエクセルのみであると
想定出来るためソフト側に改行コードの対応は任せようと思います。
おそらくMacで用いる事はないと思うのですが、
支障があるようであれば改行コードをDL時に選択できるものに変更しようと思います。
979nobodyさん:2005/12/08(木) 14:31:43 ID:???
俺はCSVはまずエディタで開くけどなぁ。
980nobodyさん:2005/12/08(木) 14:55:26 ID:???
同じく
981nobodyさん:2005/12/08(木) 15:04:53 ID:???
csvをダブルクリックすると秀丸が開く
982nobodyさん:2005/12/08(木) 17:02:49 ID:qoVbfW3N
CSVをダブルクリックするとIEがダウンロードはじめるorz
983nobodyさん:2005/12/08(木) 18:00:29 ID:???
そろそろ次スレよろ
984nobodyさん:2005/12/08(木) 18:27:53 ID:???
次スレ立てる人は >>7 の URL を変更してね。

クックブック: http://www.oreilly.co.jp/books/4873112028/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi

Perldoc.com っていつも全然繋がらないんだけど、死んでる?
985nobodyさん:2005/12/08(木) 18:30:40 ID:???
part31 と part32 で、dat がないって言われてるな。
>>984 以外に変更した方がいい URL があったら誰かよろしく。

# 俺は立てれなかった…。
986nobodyさん:2005/12/08(木) 18:53:17 ID:???
テンプレ貼ってくれるなら俺が立てるが
987nobodyさん:2005/12/08(木) 19:21:50 ID:???
988nobodyさん:2005/12/08(木) 22:16:12 ID:7Tka8YnI
たまに覗いてるものです。
スレ立てに失敗しました。orz・・・

で、質問です。
perl5.8.0を使っていたのですけど、perl5.8.5をインストールしました。
ところが、
# perl -v と打ちますと
This is perl, v5.8.0 と返ってきます。

英語だからとテキトーに読み飛ばしてインストールしたせいだとは思うのですが、
後から、perl5.8.5をデフォルトで使用するにはどのようにしたらよいですか??
989nobodyさん:2005/12/08(木) 22:45:53 ID:???
>>988
Perl に関係ない質問なので、ここでは答えない。

ヒント: which
990nobodyさん:2005/12/08(木) 22:47:35 ID:???
スレを立てる
991988:2005/12/08(木) 23:04:14 ID:???
新スレ立てました
http://pc8.2ch.net/test/read.cgi/php/1134049707/


>>989
どこで質問したらいいですかねぇ。
知ってたら、もうちょっと教えてください・・・。
992nobodyさん:2005/12/08(木) 23:28:57 ID:???
>>991

OSがLinuxならLinux板のくだ質スレ辺りで、経緯を説明して古いほうの
Perlをアンインストールしたいと聞けば良いんじゃないかな。保証は出来ないが…
993nobodyさん:2005/12/08(木) 23:29:02 ID:???
>>991
UNIX板の自分が使ってるディストリスレ
つか今のままだとエスパー以外回答できない
994nobodyさん:2005/12/09(金) 00:04:36 ID:???
perl5.8.2、Postgrewsqlを使っとりまして、正規表現に日本語を使いたくなったもんで、
ウェブで調べて、とりあえずuse encoding "euc-jp";と、してみたとです。
そしたら、DBテーブルからもってきた文字列だけ、出力時に
〜does not map to euc-jpと怒られるとです。DBもeuc-jpで作ってあるとです。
スクリプト内の日本語や、openで開くファイルは問題なかです。

どこに原因があるとですか。よろしく、おねげーしますだ。
995nobodyさん:2005/12/09(金) 11:59:04 ID:???
何かむかつくのは俺だけか・・・?
996nobodyさん:2005/12/09(金) 12:14:53 ID:???
>>994
そのDBから持ってきて出力時にエラーになる文字列とやらの
中身とutf8フラグの状態を調べるのが基本だと思うが。
997nobodyさん:2005/12/09(金) 16:30:40 ID:???
Perlコーディング初心者質問スレ Part 45
http://pc8.2ch.net/test/read.cgi/php/1134049707/
998nobodyさん:2005/12/09(金) 16:35:39 ID:???
ちんこー
999nobodyさん:2005/12/09(金) 17:18:03 ID:???
1000取ったやつは死ね
1000nobodyさん:2005/12/09(金) 17:24:52 ID:???
Perlコーディング初心者質問スレ Part 45
http://pc8.2ch.net/test/read.cgi/php/1134049707/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。