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

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

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

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

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

過去ログやお勧めサイトは >>2-10
2nobodyさん:2005/08/12(金) 01:28:01 ID:4W8j9IZT
関連スレ
ウンコがくさい
http://ex11.2ch.net/test/read.cgi/news4vip/1123777673/
3nobodyさん:2005/08/12(金) 01:28:57 ID:4W8j9IZT
4nobodyさん:2005/08/12(金) 01:29:10 ID:4W8j9IZT
4様
5nobodyさん:2005/08/12(金) 01:29:40 ID:4W8j9IZT
5
6nobodyさん:2005/08/12(金) 01:30:39 ID:???
関連スレ
CGIだけど、なんか質問ある? Part 12
http://pc8.2ch.net/test/read.cgi/php/1097334246/

【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/

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc8.2ch.net/test/read.cgi/php/1105046286/
7nobodyさん:2005/08/12(金) 01:31:45 ID:???
8nobodyさん:2005/08/12(金) 01:32:15 ID:???
9nobodyさん:2005/08/12(金) 01:32:45 ID:???
10nobodyさん:2005/08/12(金) 01:33:35 ID:???
11nobodyさん:2005/08/12(金) 01:35:19 ID:???
ム板Perlスレより

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

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

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

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

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/


関連スレ

正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
12nobodyさん:2005/08/12(金) 03:15:49 ID:???
>>2-5
の慌てぶりにワラタ
13nobodyさん:2005/08/12(金) 03:36:54 ID:???
>>11
ム板 Perl スレより。

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

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.7/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
日本語ドキュメント検索: http://search.cpan.jp/

[Perl5.8Unicodeメモ]
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
14nobodyさん:2005/08/12(金) 03:55:32 ID:EAfLwdjf BE:99130043-
「危険だ!」と頭ごなしにしないで、あえて聞いてもらいたい。指摘してもらいたい。

PerlでCGIスクリプト群を作ってるんだけど、新しいバージョンを作る度にユーザー
にインストールしてもらうのが煩雑。そこで、ネットワークアップデート機能はできない
ものか? と思ってるんだけど。

----------------------------
・SuEXEC環境を前提で
・アップデート用CGIを動かすと、現在インストールされているCGIスクリプト群のversion
 を、公式配布サイトの最新版と比較。
・古ければダウンロードしてアップデート。

・アップデートCGI自体のアップデート・・・はとりあえずおいておいて。
・ネットワークごしに持ってきた最新版が、そのWebサーバ環境で動くか?そこらへん
 の設定はうまく別ファイルに隔離したりして対処するとして。
----------------------------

危険ですか? だとしたら理由を教えて欲しい。

もうすでにそういう仕組みある? あったら教えて欲しい・・・。

よろしくお願いします。
15nobodyさん:2005/08/12(金) 04:06:17 ID:4W8j9IZT
>>12
そうだよ
急いで糞スレたてるの大変だったよー
16nobodyさん:2005/08/12(金) 04:52:46 ID:???
>>14
その"公式配布サイト"が、最初はまともなスクリプトだったけど、
後で (アップするとき) 悪質なスクリプトを埋め込んだとしたら、君、潰れるよ?
17nobodyさん:2005/08/12(金) 05:15:08 ID:EAfLwdjf BE:462605478-
>>17 そうですね。そうだと思います。ただそれは「信用」のレイヤーの話になるかと。

18nobodyさん:2005/08/12(金) 05:16:20 ID:EAfLwdjf BE:264346548-
間違えたー! >>16 だった!
19nobodyさん:2005/08/12(金) 05:43:34 ID:???
>>14
漏れフリーでスクリプト配布しているけど
何かしらの改変をして運用してる場合が多いのでかえって迷惑鴨。
商用だとアップデートで動かなかった場合に責任問題で訴えられる鴨。
20nobodyさん:2005/08/12(金) 06:01:01 ID:???
せめて バージョンアップしました のメッセージが流れる程度にしてもらいたい。
21nobodyさん:2005/08/12(金) 06:45:01 ID:EAfLwdjf BE:132173928-
自動的にアップデートしてしまう っていう所までは考えていないんですけどね。
ユーザーが望めばクリック一発で最新版にアップデート!っていう感じなんですけどねえ。
22nobodyさん:2005/08/12(金) 12:38:41 ID:???
重度自己陶酔型論破厨房警報
23nobodyさん:2005/08/12(金) 13:30:02 ID:???
LPWかなんか必要になるけどレンタルサーバーでは悪用を恐れてそれ自体インストール不可だったりする。
配布元でRSS付けて配布BBS内にそのリンクを貼る、じゃだめかい?
で、そのためにXML::RSSを使うと。
24nobodyさん:2005/08/12(金) 14:25:48 ID:???
質問させてください。

Perlを用いてメールを送信するCGIを作成したいのですが、
使っているサーバがSMTP-Authと呼ばれる認証を使っているらしく、
ググって見つけたサンプルソースを利用しても接続できません。
何か特別な方法をしないと無理なんでしょうか。
よろしければご教授願います。

ソースは下にあります。
$send_dataにはメールヘッダ情報を記載しています。
25nobodyさん:2005/08/12(金) 14:26:42 ID:???
/*-----ソース-----*/
#!/usr/bin/perl
use Socket;
$server="***.**.**.**";
$to="***@***.**.**";
$from="***@***.**.**";
$subject="test mail";
$data="test";

$port = getservbyname('smtp','tcp');
$struct = pack_sockaddr_in($port,inet_aton($server));
socket(SH, PF_INET, SOCK_STREAM, 0) || die("ソケットの生成失敗 $!") ;
connect(SH, $struct ) || die("接続失敗 $!") ;
select(SH); $| = 1; select(STDOUT);
$respons = <SH> ;
unless($respons =~ /^220/) { close(SH); die("接続失敗 $!") ; }

$command = "HELO $server\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ close(SH); die("HELOコマンド失敗 $!") ; }

$command = "MAIL FROM:$from\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ print SH "RSET\n"; close(SH); die("MAILコマンド失敗 $!") ; }
26nobodyさん:2005/08/12(金) 14:27:18 ID:???
/*-----続き-----*/
$command = "RCPT TO:$to\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^25[0|1]/){ print SH "RSET\n"; close(SH); die("RCPTコマンド失敗 $!") ; }

$command = "DATA\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^354/){ print SH "RSET\n"; close(SH); die("DATAコマンド失敗 $!") ; }

$command = "$send_data\n";
print SH $command ;
print SH ".\n";
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ print SH "RSET\n"; close(SH); die("本文、ヘッダ部送信失敗 $!") ; }

$command = "QUIT\n";
print SH $command ;
close(SH); select(STDOUT);
print "MAILは正常に送信されました。\n";
27nobodyさん:2005/08/12(金) 18:15:23 ID:???
>>24
頭悪すぎ、SMTP-Authが必要といってるサーバにSMTPでメール投げても駄目に決まってるだろ。
28nobodyさん:2005/08/12(金) 18:50:28 ID:???
>>14
危険という話はおいておくとその機能は便利だね。
ファイルもってくる事自体はLWPもuse Socketも必要とせず出来る。bindする事を制限されていないのであれば。
スクリプト実行中に実行元のスクリプトファイルを書き換えても問題無いです。
上書きなら所有者、パーミッションは引き継がれる。
そもそもsuexecならファイル作成、chmodは問題なく行えます。
一番問題なのは折れない心
29nobodyさん:2005/08/12(金) 18:56:39 ID:???
30nobodyさん:2005/08/12(金) 20:30:29 ID:???
>>28
鯖管やるなら一度は書いてるようなたわいも無いツールだと思うけど‥
31nobodyさん:2005/08/12(金) 21:04:08 ID:???
チラシの裏にでも書いてろ
32nobodyさん:2005/08/12(金) 21:25:21 ID:qS3bR1/B
配布元がクラックされる可能性を考えると、バージョンアップ告知くらいに止めておくのが無難だな。
33nobodyさん:2005/08/12(金) 22:01:46 ID:???
水島広子みたいな例もあるしな。
34nobodyさん:2005/08/13(土) 02:44:52 ID:???
あれはクラックじゃないでしょ
35nobodyさん:2005/08/13(土) 03:06:52 ID:???
んなこた分かってるだろ
36nobodyさん:2005/08/13(土) 07:51:10 ID:???
2ちゃんで自演してる厨のソフトなんか信用できねー
37nobodyさん:2005/08/13(土) 18:42:30 ID:Sjgh6/vt
Cookieって名前=値の部分は複数保存できないんですか?
38nobodyさん:2005/08/13(土) 19:39:09 ID:???
>>37
ここはperlスレだと、何度言ったらわかるんだ?
39nobodyさん:2005/08/13(土) 21:22:32 ID:???
テキストファイルに書かれた文章をある変数で受け取って、
その文章にある変数を展開することって可能ですか?

んーと、つまりはこういうこと。

$a = 10; $b = 20;
open(FILE , "data.dat") or die("Error : $!");
foreach (<FILE>){ $result .= $_; }
print $result; exit;

[data.dat]
a = $a
b = $b

a + b = $a + $b
[EOF]

[出力結果]
a = 10
b = 20

a + b = 30
40nobodyさん:2005/08/13(土) 21:39:57 ID:???
>>39
eval
41nobodyさん:2005/08/13(土) 21:50:52 ID:???
>>39


$a = 10; $b = 20;
open(FILE , "data.dat") or die("Error : $!");
while (<FILE>){
s/\$.+$/eval($&)/e;


$result .= $_; }


print $result; exit;
42nobodyさん:2005/08/13(土) 22:09:28 ID:AxZeVTkQ
かなり初歩的なこと(文法関連のこと)かもしれませんが質問させてください。
環境:OS=FedoraCore3(自宅サーバ) perl=v5.8.5

以下の基本コードを実行しました。
#!/usr/bin/perl

print "content-type: text/html\n";
print "\n";
print "<Html>\n";
print "Test Message";
print "</Html>\n";
正常にTest Messageと表示されました。
次に#!/usr/bin/perl

print "content-type: text/html\n";
#print "\n";
print "<Html>\n";
print "Test Message";
print "</Html>\n";
としたところ「Internal Server Error」となってしまいました。
参考資料には
最初に#のある行はコメント行である。
また、コメント行にしたところはただの改行である。
とありました。
上記より文法として間違ってはいないと思いますが、
なにか誤っているところがあるのでしょうか?
43nobodyさん:2005/08/13(土) 22:23:16 ID:???
>>42
content-typeなどのHTTPヘッダーの区切りは改行2つ。
44nobodyさん:2005/08/13(土) 22:23:36 ID:IY1oZ0HZ
45nobodyさん:2005/08/13(土) 22:23:51 ID:???
>>42
その参考資料は捨てなさい。嘘が書いてあります。

最初の行は、コメント行ではありません。
コメントアウトした所は、ヘッダに必要な改行です。
46nobodyさん:2005/08/13(土) 22:25:49 ID:???
>>42
回答は出たようなので補足だけ。
検索キーワードは「レスポンスヘッダ」とか。
あとhttpdのエラーログも見よう。
4742:2005/08/13(土) 22:30:43 ID:???
>>43>>45
そうなんですか!
確かにそう考えるとコメントアウトしてエラーとなる原因がよく分かりました。

>>44
すみません。perlを用いたwebプログラミングの文法に関するものということで
ここで質問してしまいました。
スレ違いということであればどこが妥当でしょうか?
「CGIだけど、なんか質問ある? Part 12」は微妙に違うような気がしますし...
48nobodyさん:2005/08/13(土) 22:58:25 ID:???
>>41
う、うまく動かない・・・orz
data.datの最後にある「$b」だけ展開されました・・・orz
49nobodyさん:2005/08/13(土) 23:05:20 ID:???
と思ったら、\$.+$になってませんでした・・・orz
お騒がせしましたー・・・
50nobodyさん:2005/08/13(土) 23:06:41 ID:???
>>48
だろうね。
最初に書いた自分のやつ、>>39 で素直に
$result を eval したら?
51nobodyさん:2005/08/13(土) 23:13:47 ID:???
あ、ついでに質問なんですが、
もしdata.datの内容が以下のような場合でも、
きちんと展開されるには、どんな正規表現にすればいいでしょうか。

[data.dat]
a + b = $a + $b です。
52nobodyさん:2005/08/13(土) 23:19:05 ID:???
>>51
そのままで良いのでは…。

つか、>>50 で書いてたこと、勘違いしてました。逝ってきます…。
5339:2005/08/13(土) 23:26:04 ID:???
>>52
\$.+$のままだと、「$a + $b です。」にマッチして、そのままevalかけるらしく、
正確な「30 です。」という結果にならないのです(´・ω・)
変数名のみ(演算子があればそれも)ってのは、やっぱり無理なんでしょうかね・・・

一応、例に出しているのはあくまでも例で、
実際は$data{name}といった内容がかかれているのです・・・。
54nobodyさん:2005/08/13(土) 23:26:59 ID:???
>>47
正確に言えばそこだけど、
違いが分からないんだから初心者向けのこっちのスレが融通利かせてもいいと個人的には思う。

>>51
どの範囲を式として見るか不明瞭。
とりあえず変数と変数に挟まれた+を認識させるなら
s/(\$\w+([ +]+\$\w)*)/eval($1)/ge;
ただし $a + + $b なんてあっても無視。
式として見る範囲に記号付ける方が無難かもね。
「a + b = <$a + $b> です」
s/<([^>]*)>/eval($1)/ge;
5539:2005/08/13(土) 23:34:06 ID:???
>>54
なるほど、変数を記号で囲むという手法もありましたか。
ありがとうございます。
56nobodyさん:2005/08/14(日) 00:18:03 ID:???
んじゃ、別解
$a=10; $b=20;
open(D, "<data.dat");

$data = join("\n", '$result=<<EOS', <D>, "EOS\n");
eval $data;
print $result;
57nobodyさん:2005/08/14(日) 00:57:57 ID:gpI3KnsY
掲示板CGIで、掲示板タイトルをこういう書き方をしています。
$BBS_TITLE="Fighter's BBS 戦士たちの会議室";
これを投稿フォームの上部に表示させているのですが、(投稿フォームのところに$BBS_TITLEと)
投稿すると$BBS_TITLEの部分だけ文字化けします。
"を'に変えてみたり、漢字をエスケープさせてみたりしましたが
直りません。
どこをどうしたら表示できるようになるでしょうか。
スクリプトはS_JISです。
58nobodyさん:2005/08/14(日) 01:13:13 ID:???
59nobodyさん:2005/08/14(日) 01:55:41 ID:???
>>57
HTMLソースから文字化けしている部分をさらすよろし。
よくあるShift-JISうんぬんの話じゃなさそうだから。
60nobodyさん:2005/08/14(日) 02:30:51 ID:RsCEyCku
use encoding 'Shift-jis'
話はそれから。
61nobodyさん:2005/08/14(日) 03:16:43 ID:???
どうでもいい話だが、

IANA 的には "Shift_JIS"
http://www.iana.org/assignments/character-sets

Encode 的には "shiftjis"
http://search.cpan.org/~dankogai/Encode-2.11/JP/JP.pm

Encode だとエイリアスしてくれているので通るとは言え、
ハイフン区切りで書く癖があるなら直した方がいいよ。
62掲示板タイトルの文字化けの件:2005/08/15(月) 02:34:48 ID:B8RuptAe
人大杉で14日PM11時ごろから「大杉」で見られないので代理投稿お願いしました。
名前やレスを下さった方のお名前がわかりませんがお許しください。

>(化けたソースを)UP
・・・しろとのことでしたのでUPします。
Fighter's BBS 戦士達の会議室 となるべきところが↓
Fighter's BBS $B@o;NC#$N2q5D<<(B
このようになっております。
文字列内の'を消しても変化ありません。
投稿したときだけこのように表示され、掲示板へアクセスしただけの時は
正常に表示されます。
63nobodyさん:2005/08/15(月) 02:48:09 ID:???
文字化けってーか JIS になってんじゃね。
64nobodyさん:2005/08/15(月) 08:24:12 ID:I9dGlG0t
>>61
あんがと。
shiftjis /\bshift.*jis$/i Shift JIS (aka MS Kanji)
適当に打っても通るから適当に打って投稿しますた。
65nobodyさん:2005/08/15(月) 08:36:29 ID:???
>>62
文字コードの指定がないか、ばらばらなんでしょ。
自作掲示板ならソースのコードを統一する。
レンタルなら借りた先に文句を言う。
無料DLして設置したのなら作者のページで質問する。
66nobodyさん:2005/08/15(月) 09:04:11 ID:???
>>2
ソースファイルの保存コードがおかしいのかも。
外部ファイルrequireして読み込んでね?

use encoding '****';してその文字コードにソースを統一しる
67nobodyさん:2005/08/15(月) 17:51:57 ID:???
うむ、作者に問うのが一番だな。
68nobodyさん:2005/08/15(月) 18:54:55 ID:VKc1C+7u
教えて下さい。
cookieのセットを以下のように行い、\cookiesフォルダにもファイルが出来ている
のに、$ENV{'HTTP_COOKIE'}にデータが返ってきません。どうしてでしょうか?
ちなみにIEのプライバシー設定は”自動cookie処理を上書きする”にして
います。

print "set-cookie: ", "DI=$FORM{'id'}; ";
print "expires=", "Sat, 31-Dec-2006 23:59:59 GMT; ";
print "domain=", "abcd.jp; ";
print "secure", "\n";

スレ違いだったらすいません。
69nobodyさん:2005/08/15(月) 19:37:06 ID:???
secureとdomainを外してみるよろし。
この2つ。ちゃんと理解してる?

70nobodyさん:2005/08/15(月) 22:44:30 ID:VKc1C+7u
>>69
68です。
ありがとうございます。
みようみまねでやっていたので、理解してませんでした。
おっしゃる通りにやったらうまく行きました。
71nobodyさん:2005/08/16(火) 02:21:29 ID:CqLOGoiC
perl初心者のプログラミング経験者です。
require は if 文の中にもかけますか?

PCと携帯に対応したBBSのソースをダウンロードしたのだけど
1ファイルで if 文でなんとかしようとしてる感じの代物でした。

それよりPC、携帯ごとに同名の関数を別ファイルで定義して
メインのCGIは最初に端末を判断してrequireでファイルを読み込んだ方が
OOP的で保守性もいいと思ったのですが、可能なんでしょうか。

アイディアがどうかも含めてご意見お願いします。
72nobodyさん:2005/08/16(火) 02:30:11 ID:???
お前は試すと言うことを知らんのか。
73nobodyさん:2005/08/16(火) 03:14:09 ID:???
ほんとに経験者なのか全体的に疑問が沸いてくる話し振りアル。
74nobodyさん:2005/08/16(火) 10:26:34 ID:???
自分ではどうにもならなかったので質問します。
cat index.html | nkf -Se -Lu | sed 's/<\/.*>//g; s/<.*>//g; s/^$//; s/ \;/ /g;'
↑このスクリプトを詳しく教えてほしいです。
75nobodyさん:2005/08/16(火) 13:09:30 ID:???
質問です
以下のスクリプトで %temphash を使わずに
無名ハッシュにスライスで代入してそのリファレンスを配列に追加するにはどうしたらいいでしょうか?

my @examplenames = qw/Server Board Key/;

my %temphash;
@temphash{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
push @favorites, \%temphash;
7675:2005/08/16(火) 13:33:31 ID:???
ちょっと冗長な感じがしますが、自己解決しました。すみません。
@{$favorites[++$#favorites]}{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
77nobodyさん:2005/08/16(火) 14:04:58 ID:9v1kpORv
>>74
それはシェルスクリプトだから、マニュアル引くならman。
それほど難しい所は無いから、cat,nkf,sedをググってみては。

>>75
こういうのを知りたかったのかなと思ったのだけど、
スライス使ってないから悩んだ。

push @favorites, {Server=>"pc8.2ch.net", Board =>"php", Key=>"1123777607"};
78nobodyさん:2005/08/16(火) 14:08:50 ID:???
sage忘れスマソ。
79nobodyさん:2005/08/19(金) 14:41:46 ID:E8nv73TY
質問です。
HTML::Templateの使い方です。

プログラム側で、@tmpには
[email protected]
[email protected]
[email protected]
[email protected]
と4つ入っています。

これを
<p>Addr:<select name="userid">
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
</select></p>

いう風にしたくて、テンプレート側で以下のようにループを掛けています。

<p>Addr:
:<select name="userid"><TMPL_IF NAME=USERID>
<option value="<TMPL_VAR NAME=ADDR>"><TMPL_VAR NAME=ADDR></option></TMPL_IF>
</select></p>


プログラム側で
$template->param(USERID => @tmp);

で、当然のことながらうまくいかないのですが、HTML::Templateの日本語訳を読んでも
このような使い方の例がありません。
どのようにすればいいのか、教えていただければと思います・・・。
80nobodyさん:2005/08/19(金) 14:47:40 ID:???
わからなかったら使わなければいいと思うんだが。
普通にforeachでまわせば?
8179:2005/08/19(金) 15:00:33 ID:???
>>80

「HTML::Templateを使え」とは言われていないのですが、

H T M L 部 分 は 必 ず 外 部 フ ァ イ ル に し ろ

というお達しがあるので、CGI側で丸ごと<option>〜</option>を吐き出すことができません。
これができれば簡単なのですが・・・。


・デザインはデザイナーがやる
・デザイナーにはCGIの部分は「一切」触らせない
・だからCGIからHTMLを丸ごと吐き出すような作りにはできない

で、HTML::Templateに行き着いたわけでして。

82nobodyさん:2005/08/19(金) 15:10:03 ID:???
>>79
ループをかけているといっているがどこにもループないし、例がないといっているが
HTML::TemplateのTMPL_LOOPのところの例はそのものズバリだと思うのだが。
なんか違う世界が見えてる人?
8379:2005/08/19(金) 15:13:01 ID:???
自己解決しました。
ありがとうございました。
8479:2005/08/19(金) 15:17:04 ID:???
>>82

ごめん。

<p>Addr:
:<select name="userid"><TMPL_LOOP NAME=USERID>
<option value="<TMPL_VAR NAME=ADDR>"><TMPL_VAR NAME=ADDR></option></TMPL_LOOP>
</select></p>

でした。
あんまりできないもんだから、IF使って値がある間にぶち込むことを考えてて
そのまま貼り付けちまった。

LOOPの例は読んでんだけど、ハッシュの例しかなく。
8579:2005/08/19(金) 15:56:39 ID:???
>>83は私じゃないけど、自己解決できました。

<TMPL_VAR NAME=ADDR>

だけ書いておいて、CGIの側で

my $tmp2
foreach my $tmp(@addr){
$tmp2 .= "<option value=\"$tmp\">$tmp</option>\n";
}
my $tmp3 = "<p><select>$tmp2</select></p>\n";
$template->param(ADDR => $tmp3);

でできました。ありがとうございました・・・。
86nobodyさん:2005/08/19(金) 17:15:00 ID:???
>>85
それはHTMLがプログラム側に染み出してるので、テンプレ使う意義を
考えるとイマイチだな。

私ならプログラム側は

$template->param(ADDR => [map {{A => $_}} @addr]);

としといてテンプレの方で

<TMPL_LOOP NAME=ADDR>
<option value="<TMPL_VAR NAME=A>"><TMPL_VAR NAME=A></option>
</TMPL_LOOP>

とします。
87nobodyさん:2005/08/20(土) 23:50:12 ID:???
未定義値undefについて質問です。
$ret = open (FILE, "hoge.txt");
ファイルオープンに失敗した場合、undefが返ってくるらしいのですが、
オープンに失敗したかどうかの判定をする際に
if ($ret == undef) {
と記述するべきなのか
if ($ret eq undef) {
とするべきなのか悩んでいます。
どちらも正常に判定はされているらしいのですが。

open (FILE, "hoge.txt") || &error("File open failed.");
などと書くのもありなのは知っていますが、
オープンに失敗して&errorを呼ぶ前にいくつかの処理を実行させたいので、
if文での判定を行いたいのです。
8887:2005/08/20(土) 23:52:58 ID:???
すみません、よく考えたら
if(!open (FILE, "hoge.txt")) {
  処理1;
  処理2;
  &error("failed.");
}
と記述すれば問題なさそうですね・・・
89nobodyさん:2005/08/21(日) 00:00:39 ID:???
>>88
open FILE, "hoge.txt"
   or do{ 処理1; 処理2; error("failed.") };
とかどう?
90nobodyさん:2005/08/21(日) 00:29:16 ID:???
>>87
解決してるみたいなので、ちょっとした補足です。
undefは未定義値ではなく、未定義値を返す関数undef()です(無引数の場合)。
未定義値との比較は、==, eq ではなく defined() を使うと良いでしょう。
9179:2005/08/22(月) 10:52:01 ID:???
>>86
mapを使うのか・・・
全然思いつきませんでした。ありがとう。
92nobodyさん:2005/08/22(月) 18:49:38 ID:IX9Ccu2Q
質問です。

foreach $a (@hourlist){ ($mons1,$mons2,$mons3,$mons4,$mons5,$mons6,$mons7,$mons8,$mons9,$mons10,$mons11,$mons12,$mons13,$mons14,$mons15,$mons16) = split(/<>/,$a);
}

# 時間代入
if ( $in{'mons'} == '城内2時間キングアッピー' ) {
$mons1 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内10時間キングアッピー' ) {
$mons2 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内ドラゴン' ) {
$mons3 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内朱雀' ) {
$mons4 = $in{'timeh'}
} elsif ( $in{'mons'} == '2時間カイザー' ) {
$mons5 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間カイザー' ) {
$mons6 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間カイザー' ) {
$mons7 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間カース' ) {
$mons8 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間ブレス' ) {
$mons9 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間ルーン' ) {
$mons10 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間カース' ) {
$mons11 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間ブレス' ) {
$mons12 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間ルーン' ) {
9392:2005/08/22(月) 18:52:53 ID:IX9Ccu2Q
$mons13 = $in{'timeh'}
} elsif ( $in{'mons'} == '城外キングアッピー' ) {
$mons14 = $in{'timeh'}
} elsif ( $in{'mons'} == '9時間リグレット' ) {
$mons15 = $in{'timeh'}
} else {
$mons16 = $in{'timeh'}
}

$_ = "$mons1<>$mons2<>$mons3<>$mons4<>$mons5<>$mons6<>$mons7<>$mons8<>$mons9<>$mons10<>$mons11<>$mons12<>$mons13<>$mons14<>$mons15<>$mons16<>\n";
push (@newhour,$_);

こうやったのですが、1〜4番目に入れたいデータが1番目に、6・8〜10番目に入れたいデータが6番目に、7・11〜14番目に入れたいデータが7番目に入ってしまいます。
どこが原因か教えていただけないでしょうか?
94nobodyさん:2005/08/22(月) 19:43:40 ID:???
>>92
文字列の比較は eq を使う。
95nobodyさん:2005/08/22(月) 19:54:26 ID:???
>>94
出来ました。ありがとうございました<(_ _)>
96nobodyさん:2005/08/22(月) 22:43:42 ID:???
>92ではないのですが、>92を簡潔に書くならどんな感じでしょう?

my @tempmons = qw/dummy 城内2時間キングアッピー 城内10時間キングアッピー ... /;
my %mons_to_index = map { $tempmons[$_] => $_ } 0..$#tempmons;

foreach(@hourlist){
    chomp;
    my @mons = split /<>/;
    $mons[ ($mons_to_index{ $in{'mons'} } || @mons)-1 ] = $in{'timeh'};
    $_ = join '<>', @mons,"\n";
}

ループを1個減らそうとハッシュを使ってみたのですが、
indexが0の時の対処が強引になってしまいました
97nobodyさん:2005/08/22(月) 23:01:26 ID:???
>>96
全然追ってないけど、とりあえず $in{'mons'} と $in{'timeh'} は
ループの外へ出して別変数に入れようよ。
98nobodyさん:2005/08/22(月) 23:19:39 ID:???
変数の記述方法について質問です。
$sizeという数値が入る変数があり、これをヒアドキュメントで出力したいのですが、
print <<"EOF";
log file size $sizeKB
EOF
などと書くと、$sizeとKBではなく$sizeKBという変数として認識されてしまうのですが、
ヒアドキュメンド内で変数の直後に半角英数字を続けて書く方法はないでしょうか。
99nobodyさん:2005/08/22(月) 23:23:42 ID:???
>>98
log file size ${size}KB
100nobodyさん:2005/08/22(月) 23:24:09 ID:???
>>99
即レス感謝です!
101nobodyさん:2005/08/23(火) 00:16:13 ID:???
>>96
いいんじゃない?
私は頭の部分をこう書くかな。

my @tempmons = qw{dummy 城内2時間キングアッピー 城内10時間キングアッピー ...};
my %mons_to_index;
@mons_to_index{@tempmons} = 0..$#tempmons;
102nobodyさん:2005/08/23(火) 00:49:00 ID:???
>>101
んじゃ、その %mons_to_indexがもう出来てるとして俺は空間効率でも上げてみるか。
頭の中で考えただけだから、間違ってたらごめん。

my $tm = $in{'timeh'};
my $mons_id = $mons_to_index{$in{'mons'}};
foreach my $hour (@hourlist) {
my $i = 0;
while ($hour =~ m/<>/go) {
next if $i++ != $mons_id;
$hour =~ s/[^<>]+<>\G/$tm<>/o;
last;
}
}

ところで、なんで @hourlist が配列なのか不明。
もとのコード >>92 でも foreach で回してるけど、$mons* が上書きされちゃうし。
103nobodyさん:2005/08/23(火) 01:26:51 ID:???
ゲームプログラマならリファレンス学べ

sub data_load {
open DATA, "<data.txt" or die "Can't open : $@";
my @lines = <DATA>;
close DATA;
return [ undef, map{ split '<>' } @lines ];
}

sub data_save {
my @data = join '<>' => map{ $$_ } @_;
local $" = "\n";
open DATA, ">>data.txt" or die "Can't open : $@";
print DATA "@data";
close DATA;
}
とすれば

@::ref_hours = data_load();
$::ref_hours->[ $in{mons} ] = $in{timeh};
data_save( @::ref_hours );

応用方法もいくらでもあるだろう。
104nobodyさん:2005/08/23(火) 01:32:14 ID:???
ごめ、脳内コーディング
return map{ [ undef, split/<>/,$_ ] } @lines;

だな。
my @tempmons = qw{ 城内2時間キングアッピー 城内10時間キングアッピー ...};
my %mons_to_index;
@mons_to_index{@tempmons} = 0..$#tempmons;
にして
return map{ split/<>/ } @lines;
とかしたいが元スクリプト読む気ないので間違ってるかも。
105nobodyさん:2005/08/23(火) 01:35:17 ID:???
またw
X return map{ split/<>/ } @lines;
O return map{ [split/<>/] } @lines;
106nobodyさん:2005/08/23(火) 02:18:30 ID:???
ゲームプログラマじゃなくてもリファレンスは必要だろ
107nobodyさん:2005/08/23(火) 02:21:03 ID:???
どっかの入門書鵜呑みにしたんだろ。
108nobodyさん:2005/08/23(火) 02:22:58 ID:???
>>102
うは、正規表現を使いますか。
(foreachは遅いとかの突っ込みは無しの方向で)

my $tm = $in{timeh};
my $mons_id = $mons_to_index{$in{mons}} || @tempmons;

foreach my $hour (@hourlist){
foreach(1..$mons_id){
$hour =~ m/<>/g;
}
$hour =~ s/\G[^<>]+/$tm/;
}
109nobodyさん:2005/08/23(火) 09:47:32 ID:???
>>108
>>102 です。
どうも元のコード読む限り、置換は一ヶ所だけなんだよね。elsif で繋いであるし。
正規表現の作製コストと、splitかけてjoinするコスト
どっちが良いかは、この場合かなり微妙…。もしかしたらsplit, joinのが安いかも。
110nobodyさん:2005/08/23(火) 12:04:31 ID:???
>>109
最近見かけた名言を贈ろう。

 「推測するな。計測しろ」

http://search.cpan.org/~nwclark/perl-5.8.7/lib/Benchmark.pm
111nobodyさん:2005/08/23(火) 12:40:05 ID:???
説教するな、説得しろ。
112nobodyさん:2005/08/23(火) 13:46:44 ID:???
my @hoge = ('a', 'b', 'c');
my @moge = (1, 2, 3, 4);
my @foo = (\@hoge, \@moge);

@fooを使って、$hoge[2]の値を取得するにはどうすればよいですか?
\@hogeは必ず$foo[0]にあります。
113nobodyさん:2005/08/23(火) 13:57:40 ID:???
114108:2005/08/23(火) 14:42:04 ID:???
>>109
一回だったら微妙かもですね。

>>110
ベンチなら正規表現の方が2倍速かった。(@hourlist=10で計測)
ただ、ベンチは繰り返し実行するから、
正規表現のコンパイルコストなど測れない部分がある。
大抵は無視できるけど、一回こっきりの話だと無視できない可能性も。
細かい話だけどね。
115102:2005/08/23(火) 17:55:10 ID:???
>>110
ありがとう。その通りです。
ベンチ鬼のようにやってたから、目測でコスト見積るようになった。
「スカラ変数宣言で◯バイト消費。数値入力でヘッダ部分にビットが立つ。ボディーが追加されて数値設定。文字列として使っちゃったから、ヘッダ部のビット変更。ボディーの数値構造体切り離して、両用の構造体に変更。」
とか、気にしてた頃はスクリプト見ながらここまで考えてた(あほです)。

>>114
わざわざベンチありがとう。やっぱり1回だと微妙ですよね…。m/<>/go がリニアサーチだし。
116nobodyさん:2005/08/23(火) 21:09:27 ID:???
IE限定だけどJavaScriptでクリップボードの内容をコピーできるので、
そこら中のサイトで「セキュリティーホールだ!クリップボードの内容が盗見られる!」
と騒ぎ立ててんだけど、もちろんsubmit送信を使えば値を渡すことができるだろうけど、
1回の閲覧のみでJavaScriptで取った値をCGIに渡すことは不可能だよね?
117nobodyさん:2005/08/23(火) 21:14:43 ID:???
カンマ区切りのデータから、必要な要素を取り出す方法を教えていただきたいです。

太郎,男,20才
花子,女,21才
健太,男,22才
 ・
 ・
というデータがname.datというファイルでcgiと同じディレクトリにあり、
パラメータとして'健太'を与えてやると、'22才'と返ってくるようなスクリプトは、どう書けばいいのでしょうか。
よろしくお願いします。
118nobodyさん:2005/08/23(火) 21:22:48 ID:???
open IN, 'name.dat';
while (<IN>) {
 chomp;
 my @tmp = split /,/;
 $name2age{$tmp[0]} = $tmp[2];
}
close IN;
print $name2age{'健太'};
ハッシュのキーに漢字ってキモいな
119nobodyさん:2005/08/23(火) 21:28:56 ID:???
kenta -> '健太'
みたいなハッシュを別に作って解決

(゚∀。)アリャ?
120nobodyさん:2005/08/23(火) 21:49:40 ID:???
>>118
>>119
ありがとうございます。試してみます。
121nobodyさん:2005/08/24(水) 01:00:02 ID:???
>>116
できるよ。
でもそれがセキュリティホールになるのかどうかは知らない。
122nobodyさん:2005/08/24(水) 01:04:27 ID:???
>>116
面白そうだね。やってみようかな。
123nobodyさん:2005/08/24(水) 01:11:31 ID:???
クリップボード覗いて何が楽しいんだ?
124nobodyさん:2005/08/24(水) 01:11:32 ID:???
onLoadでページ開いた瞬間に別窓へsubmitして即閉じるとか?
いずれにせよバレバレっぽいなぁ
125nobodyさん:2005/08/24(水) 01:12:47 ID:???
>>124
XMLHttpReq略 ならバレバレではないけど。
できるけど、何? って感じ。
126nobodyさん:2005/08/24(水) 01:16:54 ID:???
今流行りのajaxだにゃん。
127nobodyさん:2005/08/24(水) 04:39:31 ID:???
128nobodyさん:2005/08/24(水) 05:33:37 ID:???
質問です。
PCからは書き込みができるのですが携帯(@モード)からは書き込みはおろか管理画面へすら入れません。
CGI本体のソースはこちらになります。
http://namihei.zone.ne.jp/upup/up/44694.txt
他にはlogファイルとjcode.plを使います。
enctype="multipart/form-data"あたりに問題があるように思うのですが行き詰まってしまいました。
どこをどのようにすれば携帯から書き込めるようになるでしょうか?
129128:2005/08/24(水) 05:37:30 ID:???
すいません。直接リンクだと403になってしまうようです。
ttp://namihei.zone.ne.jp/upup/up/44694.txt
130nobodyさん:2005/08/24(水) 06:19:55 ID:???
>>128
原因わかってるならenctype="multipart/form-data"を消せばいいやん
それはファイル添付するときのenctypeだし
どうしてもenctype書きたいならenctype="x-www-form-urlencoded"で
131nobodyさん:2005/08/24(水) 07:33:16 ID:???
>>128
マルチかよ答えるんじゃなかった
氏ね市ね詩ね氏ね市ね詩ね氏ね市ね詩ね氏ね市ね詩ね氏ね市ね詩ね氏ね市ね詩ね
132128:2005/08/24(水) 07:58:30 ID:???
>>130
サンクスコ
133nobodyさん:2005/08/24(水) 08:47:43 ID:???
$res[131] = new m9('a')->pugyaaa();
134nobodyさん:2005/08/24(水) 09:45:36 ID:???
cat unko*.txt > unkofile.txt と同じことをperlでどういう風に書いたらいいでしょうか?
ファイルを開いて読んで配列に入れてから書き込むを永遠と繰り返すしかないんでしょうか。
135nobodyさん:2005/08/24(水) 11:03:29 ID:???
>>134
#!/usr/bin/perl
`cat unko*.txt > unkofile.txt`;
136nobodyさん:2005/08/24(水) 11:04:23 ID:ephPxiIZ
unko.txt
137nobodyさん:2005/08/24(水) 11:15:53 ID:???
外部プログラムは一切使えない(インストールされていない)ので
他の方法お願いします。
138nobodyさん:2005/08/24(水) 11:24:30 ID:???
>>134
ファイルを開いて書き込むのを繰り返すのが普通。ただし
配列に入れるのは無駄なので読んだらどんどん書き出せ。
.
139nobodyさん:2005/08/24(水) 11:44:21 ID:???
>>138
ありがd できますたっ
140nobodyさん:2005/08/24(水) 13:14:34 ID:???
>>134 >>139
解決したみたいだが

perl -pe "" unko*.txt > unkofile.txt
141nobodyさん:2005/08/24(水) 15:15:16 ID:???
投票システムを作ろうとしているのですが、アドバイスお願いします。
パラメータ$goodsnumに入れた商品番号$tmp[0]に対する得票数$tmp[1]を
カウントアップさせたいのですが、ログファイルがうまく更新されません。
コードは以下の通りです。

open(LOG, "+<$file");
flock(LOG,2);
print "Content-type: text/html\n\n";
while ($line = <LOG>) {
 @tmp = split /,/,"$line";
 if ("$tmp[0]" eq "$goodsnum"){
   seek(IN,0,0);
   $tmp[1] ++;
   print LOG "$tmp[0],$tmp[1]\n";
   truncate(IN,tell());
   print "商品番号$tmp[0]の得票数は$tmp[1]";
 }
}
flock(LOG,8);
close(LOG);

期待する結果(ログファイルの内容)
実行前 syohin555,0 → 実行後 syohin555,1

実際の結果(ログファイルの内容)
実行前 syohin555,0 → 実行後 syohin555,0[改行]syohin555.1

ログファイルには他にも商品の投票データがあり、パラメータで渡した商品のみ、カウントアップさせる企てです。
ごちゃごちゃして申し訳ありません。どうぞよろしくお願いします。
142nobodyさん:2005/08/24(水) 15:23:02 ID:???
>>141
> seek(IN,0,0);
> truncate(IN,tell());
INって何。
143nobodyさん:2005/08/24(水) 15:28:01 ID:???
>>142
あ!すみません。そこも'LOG'です。
もうしわけございませんでした。
144nobodyさん:2005/08/24(水) 15:56:30 ID:???
>>141
一行の長さが不定なテキストデータを、読み出しながら書き出すのは無茶。
得票数が 9 => 10 になったらまずいよね。
全部読み込んでから全部書き出すのが無難じゃないかな。
145nobodyさん:2005/08/24(水) 16:05:56 ID:???
>>141
>ログファイルには他にも商品の投票データがあり
おいおい、だめじゃん
146nobodyさん:2005/08/24(水) 16:10:26 ID:???
seekもtruncateもwhileの外でやらないとね。
chomp;がないのに¥nつけると改行だけ増える罠。
根本的に流れがおかしい希ガス。
147141:2005/08/24(水) 16:15:29 ID:???
どうも無茶なことをしてるようですんません。
なんとか頑張ってみます(; ;)
148141:2005/08/24(水) 17:33:40 ID:???
駄目ですorz
大まかな構想を練っているのですが、アドバイス頂けますでしょうか。

1.ログファイルを開く
2.改行で切り分けて@ary1にいれる
3.$ary1[0],[1],[2]...をそれぞれカンマで切り分けて@ary2に入れる
4.whileを使って$ary2[0]がパラメータに合致するノードを探す
5.見つかったら$ary2[1]をカウントアップ。
6.@ary1をログファイルに上書きする

こんな感じでしょうか?
頭が爆発しそうなのでよろしくお願いします。
149nobodyさん:2005/08/24(水) 17:43:24 ID:???
>>148
大まかな流れはそんな感じで良いと思う。
あと、得票数のデータは配列にするんじゃなくてハッシュにするとやりやすいと思う。
150141:2005/08/24(水) 17:51:17 ID:???
>>149
ハッシュですか。調べてやってみます。
ありがとうございました。
151nobodyさん:2005/08/24(水) 18:00:22 ID:???
・ログファイル開く
・foreachかwhileで一行ずつ読み込む
・カンマで区切り、それぞれを変数で区切る
・最初の要素とパラメタが一致すれば、最後の要素をインクリメント
・3つの変数をカンマ区切りで配列に
・処理終了後、配列をログファイルに上書き

じゃだめなのか
152nobodyさん:2005/08/24(水) 18:02:50 ID:???
適当で動くかわからないけど、流れを理解するため重視で。

open(LOG, "+<$file");
print "Content-type: text/html\n\n";
while (<LOG>) {
chomp;
@tmp = split /,/;
if ($tmp[0] eq $goodsnum){ $tmp[1] ++; }
push(@txt, "$tmp[0],$tmp[1]\n");
print "商品番号$tmp[0]の得票数は$tmp[1]";
}
seek(LOG, 0, 0);
print LOG @txt;
truncate (LOG, tell(LOG));
close(LOG);

ファイルの内容を丸まる配列に入れちゃうのは初心者の処理だけど、まぁ後は理解して改造してくれ。
153141:2005/08/24(水) 18:13:54 ID:???
ででで、でキタ━━━━(゚∀゚)━━━━ッ!!と思う。
もう丸一日かまってるから混乱してきた。
最終的なコードはこうなりました。
みんなありがとう!

@ary = ();
open(LOG, "+<$file");
flock(LOG,2);
print "Content-type: text/html\n\n";
while ($line = <LOG>) {
 chomp($line);
 @tmp = split /,/,"$line";
 if ("$tmp[0]" eq "$goodsnum"){
  $tmp[1] ++;
  push(@ary,"$tmp[0],$tmp[1]\n");
 }else{
  push(@ary,"$tmp[0],$tmp[1]\n");
 }
}
seek(LOG, 0, 0);
print LOG @ary;
truncate (LOG, tell(LOG));
flock(LOG,8);
close(LOG);

>>151
>>152
ありがとうございます。
今から確認してみます。
154nobodyさん:2005/08/24(水) 19:59:02 ID:???
変数に入った条件式を使ってif文って作れませんか?

例えば、こんな感じで。

$opt = "or";
print "OR : OK" if(1 == 1 $opt 2 == 1);

$opt = "and";
print "AND : OK" if(1 == 1 $opt 2 == 1);

[表示結果]
OR : OK
155nobodyさん:2005/08/24(水) 20:02:21 ID:???
eval
156154:2005/08/24(水) 20:09:36 ID:???
>>155
$opt = "or";
print "OR : OK" if(1 == 1 eval($opt) 2 == 1);
としても、

$opt = "or";
print "OR : OK" eval(if(1 == 1 $opt 2 == 1));
としても、正常に動かないのですが・・・

evalつけるところ間違えてます・・・?
157nobodyさん:2005/08/24(水) 20:23:46 ID:???
>>156
$opt = "or";
eval "print 'OR: OK' if 1 == 1 $opt 2 == 1";
158nobodyさん:2005/08/24(水) 20:31:32 ID:???
>>154-157
if eval "1 == 1 $opt 2 == 1";
159154:2005/08/24(水) 20:59:12 ID:???
>>158
サンクス
うまくいきました。
160154:2005/08/24(水) 21:58:28 ID:???
すいません、もひとついいですか?

evalを使うことで、演算子の変数を展開して条件分岐してくれるようにはなったんですが、
演算子以外の変数が合った場合、なぜか上手く動作しません。

$data1 = "hogehoge";
$data2 = "foofoo";
$ptn1 = "hoge";
$ptn2 = "boo";
$opt = "or";

print "OK" if( eval"($data1 =~ m/$ptn1/) $opt ($data2 =~ m/$ptn2/)" );

欲しい結果は当然、OKです。
161nobodyさん:2005/08/24(水) 22:02:14 ID:???
>>154
ダブルクオテーション囲んでるから、evalが解釈するのは
hogehoge =~ m/hoge/ or ...
になってる。
162nobodyさん:2005/08/24(水) 22:04:18 ID:???
>>160
$data1, $data2 の頭にバックスラッシュ入れて変数展開抑制
163nobodyさん:2005/08/24(水) 22:06:32 ID:???
試しにeval()にしてみたんですが、やっぱり動きませんorz
164nobodyさん:2005/08/24(水) 22:09:12 ID:???
>>162
ありがとう!
165nobodyさん:2005/08/24(水) 22:16:54 ID:???
>>164
eval じゃなくて printした時にどういう文字列になってるか
考えるなり確認した方が良いよ。
166nobodyさん:2005/08/24(水) 23:13:17 ID:PXiCgge7
質問させて下さい。

csvを読み込んで、表示するというプログラムを
書いていますが、データはShift_JISなので
Shift_JisをUTF-8に変換したいです。

ネットで調べるとJcode.pmが必要と書いてありました。
早速使ってみたところ、私が使っているサーバは
標準モジュールすら入っていないサーバなので
Jcode.pmだけいれてもダメでした。

そこで、友人のサーバでやろうと思っていますが
友人のサーバはperl5.0なんとかで
結構古いです。標準的なモジュールは入っています。

そこで質問です。

@この環境にJcode.pmファイルだけ置けばうごくように
なりますか?
AJcode.pmを置く事で他のperlプログラムが動かなくなったりしますか?
BJcode.pmを置いてうごいたとして、shift_jisのまま表示するのと
  UTF8に変換してから表示するのでは、処理のスピードに大きな
  違いがでますか?

自己解決不可能だったため。。おねがいします。。orz

167nobodyさん:2005/08/24(水) 23:23:23 ID:???
Jcodeは5.4以上必要だった気がする。

にしても5.0はねぇだろ。ちゃんと調べろ
168nobodyさん:2005/08/24(水) 23:52:46 ID:???
お前もうjcode.plでいいよ
169nobodyさん:2005/08/24(水) 23:55:26 ID:???
もしくは nkf -w
170nobodyさん:2005/08/25(木) 00:08:57 ID:PZEhiYYs
>>168
jcode.plはUTF-8未対応

分かってて書いてると思うがw
171nobodyさん:2005/08/25(木) 01:32:53 ID:???
Perl5.6以上にするのが一番の早道
172nobodyさん:2005/08/25(木) 08:22:01 ID:???
>>166
1. コピーで突っ込んだことが無いので、よく分からないけど、
最低でもJcode::*の辺りも必要だと思う。
2. それは無い。
3. UTF-8変換すると、かなり遅くなるはず。

telnet/sshが使える環境なら、そっちからきちんとインストールしたほうがいい。

>>167
5.004から動くはず。
5.005_03で動作してるよ。
173nobodyさん:2005/08/25(木) 15:17:31 ID:???
>>166
そもそも166が使ってるサーバのPerlのバージョンがわからんと話にならん。
さらにサーバ会社も晒せば同じ環境に居る人が答えてくれるかもしれん。
174nobodyさん:2005/08/25(木) 16:09:06 ID:???
>>167
>にしても5.0はねぇだろ。
「5.4」も酷いぞ。

>>171
5.8.1 以上の間違いだろう。

>>173
「標準モジュールすら入っていないサーバ」は @nifty (@homepage) の
別名と考えていいかと。そうなら 5.004 だか 5.005 だかその辺だったと思う。

>>166
他にもこういう選択肢もある。
http://search.cpan.org/~hio/Unicode-Japanese-0.27/
175nobodyさん:2005/08/25(木) 17:18:03 ID:???
すみません、Activeperlの5.8.7で、WindowsXPの日本語フォルダを扱いたいのですが、
Encodeでいろいろやってみたもののうまくいきませんでした。

例えば、
while(<c:/bin/jane/Logs/2ch/ネット関係/WebProg/*.dat>) { }
みたいに、あるフォルダの下の全ファイルをさらうとかしたいのですが、
日本語が含まれているとうまくいきません。

どうすればよいのか、お願いします。
176nobodyさん:2005/08/25(木) 18:01:49 ID:???
175追記
シフトJISでスクリプトを書くと、
use encoding "shiftjis";
を入れるとうまくいかず、入れないとうまくいきます。
(ただし、それを入れないと今度は他の日本語を扱う部分がおかしくなってしまいます)
177nobodyさん:2005/08/25(木) 18:14:31 ID:???
178nobodyさん:2005/08/25(木) 18:28:37 ID:???
>>177
そこを読んでいろいろ試してみたのですが…
179nobodyさん:2005/08/25(木) 19:02:49 ID:ZmEBADhu
長文だった場合、ある長さに区切るようなことをしたいんだけど
↓こんな感じ

こんにちは、Perlスクリプトについて質問があり・・・[長文のため省略しました。続きはこちら]

↑こんな感じで文章を省略したいんですけど、
区切ったバイトが2byte文字か判定する方法ってありませんか?現状文字化けしてます。。。
180nobodyさん:2005/08/25(木) 19:47:47 ID:???
>>179
>>11 のテクニックの項とか >>13 とか。
181nobodyさん:2005/08/25(木) 19:57:49 ID:???
>>179
$str= = Jcode->new($str)->jfold($width);
で\n区切り。ただし途中の\nは無視する。
182nobodyさん:2005/08/25(木) 20:00:24 ID:???
use Jcode;
$st = Jcode->new($str)->jfold($width);

な。
183nobodyさん:2005/08/25(木) 20:24:33 ID:???
超メンドくさいやり方

$char_count = 10;
$body = "こんにちは、Perlスクリプトについて質問があります。";
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
@chars = $body =~ /($ascii|$twoBytes|$threeBytes)/og;
for ($count = 0; $count < $char_count; $count++) {
 $str .= $chars[$count];
}

$strは「こんにちわ、Perl」となる
メンドくせ
184nobodyさん:2005/08/25(木) 20:47:01 ID:ZmEBADhu
>>181,>>182
レスありがとうございます。自分はjcode使ってないのですが、それでうまくいくのなら試してみたいと思います。

>>183
この手のやり方を求めていました。
実際にやってみたのですが、うまくいきませんでした。
Shift-JIS限定のプログラムなのですが、Shift-JISではどのようにして日本語のフラグを立てているのでしょうか?
色々と検索しているのですが見つかりません。
185nobodyさん:2005/08/25(木) 20:48:56 ID:???
eucで
186nobodyさん:2005/08/25(木) 20:49:51 ID:???
>>184
文字列はEUC前提。
この場合なら、一回jcodeで$bodyをEUCに変換してから。
で、$strが完成したら、それをSJISに戻せば解決
187nobodyさん:2005/08/25(木) 20:57:13 ID:???
$str =~ /^([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*$/ or chop $str;
188nobodyさん:2005/08/25(木) 20:57:34 ID:???
use encoding 'Shift-jis';
でsjisでも正規表現がうまく動くと聞いているが俺は試してない。
だとしても>>183並にめんどくさいルーチンを通さなきゃいけない。
出力する文字コードがsjis固定でよいのなら

use Jcode;
$str = Jcode->new($str)->jfold($width)->sjis();

だ。
189nobodyさん:2005/08/25(木) 20:59:29 ID:???
ちなみに<br>の場合、

$str = Jcode->new($str)->jfold( $width, "<br>" )->sjis();

だ。
190nobodyさん:2005/08/25(木) 21:47:57 ID:ZmEBADhu
うーん・・・eucですかぁ・・・
ところで、jcode通すと、半角カタカナが文字化けしますよね?
191nobodyさん:2005/08/25(木) 22:06:41 ID:???
&jcode::convert (\$str, "euc");
とかだけだと文字化けするケースがある
&jcode::convert (\$str, "euc", "sjis");
のように、変換前の文字コードを渡すことで解決できる場合もある
192nobodyさん:2005/08/25(木) 22:37:57 ID:ZmEBADhu
>>191
なるほど!
193nobodyさん:2005/08/25(木) 22:47:27 ID:???
>>187が無視されている件について
194nobodyさん:2005/08/25(木) 22:49:28 ID:???
>>175
スクリプトの文字コードをShift_JISにするか、
そのフォルダを示す文字列の文字コードをShift_JISに変換する。
195193:2005/08/25(木) 22:58:37 ID:???
あ、自作自演に突っ込みいれちゃってたらごめん。
196187:2005/08/25(木) 23:29:04 ID:???
わざわざ名乗り出るのも何だが俺は別人な。
197197:2005/08/25(木) 23:39:21 ID:???
俺は ROM ってた
198193:2005/08/26(金) 00:10:46 ID:???
>>196
うん、ごめん、了解してる。

どうでもいいけど、質問者は回答に何らかのリアクション取って欲しい。
「ワケワカラン(AA略」とかでもいいからさ、
と思う初秋の夜。


回答者たち、お疲れさま。

>>197もおつ。
199175:2005/08/26(金) 01:24:12 ID:???
>>194
ありがとうございます。
とりあえず下のような感じでうまくいきました。
スクリプトはシフトJISで書いています。


use encoding "shiftjis";
use Encode qw/ encode decode /;

$dir = "c:/bin/jane/Logs/2ch/ネット関係/WebProg";

opendir(DIR, encode("shiftjis", $dir));
@a = readdir(DIR);
closedir(DIR);
foreach(@a) {
  $file = $dir . "/" . $_;
  if($file =~ /dat$/) {
    open(FILE, encode("shiftjis", $file));
    while(<FILE>) {
      $line = decode("shiftjis", $_);
      if($line =~ /回答/) {
        print $line;
      }
    }
    close(FILE);
  }
}

もっとスマートな書き方があればいいんですが…。
200nobodyさん:2005/08/26(金) 04:12:47 ID:0igOMeuL
>>193
>>187は何に使うんでしょうか?
201nobodyさん:2005/08/26(金) 04:16:07 ID:0igOMeuL
>>191
ところで、jcodeを通すと半角カタカナが文字化けする件ですが、”場合もある”ということは、やっぱり完全解決は無理っぽいですね。
商用のサイトではどのようにやってるんでしょう?半角カタカナを使いつつ、日本語を省略しているサイトをよく見ます。
202nobodyさん:2005/08/26(金) 04:25:58 ID:???
なんでeucで書かないのかなぁ〜
203nobodyさん:2005/08/26(金) 07:19:22 ID:???
>>199
Shift_JISで書くなら、直接
while(glob('c:/bin/jane/Logs/2ch/ネット関係/WebProg/*.dat')) {}
でいけない?

>>200
$count = 45;
$body = "こんにちは、Perlスクリプトについて質問があります。";
$attention = "…[長文のため省略しました。続きはこちら] ";
if (length($body) > $count){
$body = substr($body, 0, $count);
$body =~ /^([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*$/ or chop $body;
$body .= $attention;
}
print $body;
204nobodyさん:2005/08/26(金) 07:20:33 ID:???
>>201
みんながjcode.pl使ってるわけじゃないし。

use String::Multibyte;

$mbcs = String::Multibyte->new('ShiftJIS');
$count = 22;
$body = "こんにちは、Perlスクリプトについて質問があります。";
$attention = "…[長文のため省略しました。続きはこちら] ";
if ($mbcs->length($body) > $count){
$body = $mbcs->substr($body, 0, $count). $attention;
}
print $body;

--
use encoding qw(shiftjis);

$count = 22;
$body = "こんにちは、Perlスクリプトについて質問があります。";
$attention = "…[長文のため省略しました。続きはこちら] ";

if (length($body) > $count){
$body = substr($body, 0, $count). $attention;
}
print $body;
205nobodyさん:2005/08/26(金) 07:35:48 ID:???
それと、jcode.plが自動判別で文字化けする主な原因は、
jcode.plがShift_JISの定義を厳密に行っている(半角カナを含めない)からで、
入力側の文字コードを指定してやれば問題ないはず。
206nobodyさん:2005/08/26(金) 09:10:00 ID:???
質問です。

JavaScript の escape 関数でエンコードされた文字列
(%uXXXX形式)を Perl でデコードしようとしています。
次のようにやると全てマルチバイト文字の場合はうまくいくのですが、
半角文字が入っているとうまくデコードできないようでした。

use Jcode;

$a = '%u3042%u3044%u3046%u3048%u304A'; # あいうえお
$b = '%u3042a%u3044b'; # あaいb

$a =~ s/%u([a-fA-F0-9]{4})/pack('H4', $1)/ge;
$b =~ s/%u([a-fA-F0-9]{4})/pack('H4', $1)/ge;

print Jcode::convert($a, 'euc', 'ucs2'), "\n";
# あいうえお と表示されOK
print Jcode::convert($b, 'euc', 'ucs2'), "\n";
# あ豹? と表示される。a以降文字化け

環境は、Linux, Perl 5.8.4, Jcode.pm 0.88 です。
Windows, ActivePerl 5.8.6, Jcode.pm 0.86 の環境で出力を sjis に
変えても同じでした。

Jcode.pm で変換できる方法はありますでしょうか?
Encode等、他の方法でもありましたらよろしくお願いします。
207nobodyさん:2005/08/26(金) 10:23:29 ID:???
>>206
$bが正しいucs2じゃないからじゃないだろうか。

$b = '%u3042%u0061%u3044%u0062'; # あaいb

となるはずだと思うのだが。
208nobodyさん:2005/08/26(金) 10:57:46 ID:???
207のように%u0061等と書く以外に、%u〜以外の1バイト文字に
\x00を補う方法も考えられる。ブラウザなどからその形で送られて
くるので手出しできないとするとこの方法の方がいいかもしれん。

$b =~ s/(?:%u([a-fA-F0-9]{4})|(.))/($1 ne '')? pack('H4', $1): "\x00$2"/ge;
209206:2005/08/26(金) 11:46:38 ID:???
>>207 >>208
ありがとうございました。うまくいきました。

正しいucs2ではなかったのですね。
アドバイス通り修正することで、Jcodeによる文字コードの
自動判別も使えるようになりました!

print jcode($b)->euc, "\n"; # OK!
210nobodyさん:2005/08/26(金) 13:56:08 ID:0igOMeuL
>>203
ありがとうございます!
$body =~ /^([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*$/ or chop $body;
↑こっちのやりかたで完璧でした。ShiftJISのままできました。

>>202
うーん。まぁ今となっては確かにeucでやった方がいいのかなぁ?
サイト上でテキスト(HTML)がSJISでCGIだけEUCだとチグハグ感がありますので。
211183:2005/08/26(金) 21:24:32 ID:???
>>210
SJIS好きでもEUCに慣れた方がいいぞ
俺みたいにならんようにな('A`)
212nobodyさん:2005/08/26(金) 22:01:27 ID:???
>>210
出力だけShift_JISにすれば?
213nobodyさん:2005/08/27(土) 11:09:24 ID:???
>>211
うーん。そうですよねぇ。真摯に受け止めます。

>>212
それも手間じゃないですか?
そうそう、jcodeを使うと半角が化ける以外に、処理が遅くなるっていうのがありました。
最近はハードのスペックが上がったから問題ないとも思うのですが。
214nobodyさん:2005/08/27(土) 11:54:37 ID:???
、ハ、餞JIS、ヌヘ隍?、ウ、ネ、ートヒ、キ、ソ、鬘ゥ
2、チ、网簗ムエケ、キ、ハ、、、キ。」
215nobodyさん:2005/08/27(土) 12:25:45 ID:???
既出だけど、半角カナが化けるのはjcodeが悪いわけじゃないから。
ロジックが甘いか、工夫が足りないだけ。

EUCだと正規表現で楽できることもあるけど、クライアントのほとんどはSJISの住人だから。
SJISの住人相手にはSJISで組んだほうがメリットになることも多いよ。

そもそも、最近はjcodeの出番がめっきり減った気がする。
216nobodyさん:2005/08/27(土) 13:01:28 ID:???
内部処理やスクリプトの文字コードにSJIS使うのは手間増えるだけだから
オススメしないけどな。入り口と出口で変換する方が楽。

中身は古い人はEUCで、イマドキの人はunicodeが良いでしょう。
217nobodyさん:2005/08/27(土) 14:53:32 ID:???
Unicode使うとSJISなんて使う気になれなくなるよ
218nobodyさん:2005/08/27(土) 19:10:26 ID:???
ならなくなる じゃないか?
219nobodyさん:2005/08/27(土) 19:25:06 ID:???
Unicodeってそんなにいいのか?(他のスレで散々既出だと思うが)
grep等のツールが使えなくなるのがちと痛いんだよなぁ。
新しめのLinux環境だと使えるのかな。。?
220nobodyさん:2005/08/27(土) 22:05:10 ID:???
Grepの方をどうにかしようぜ
221nobodyさん:2005/08/28(日) 16:08:49 ID:???
WinXP、ActivePerl6.8.1です。
use encodingやuse Encodeをソースに記述し起動させると、「問題が発生しました。ご迷惑をおかけして(ry」が出てPerlが強制終了してしまいます。
Encode.pmをコマンドラインで直接立ち上がげても同じでした。
何が原因でしょうか?
222nobodyさん:2005/08/28(日) 16:11:45 ID:AszUkSZs
質問させてください。

Encode.pmがインストールされている環境とそうでない環境とで、プログラム内部で処理を分けようと思っているのですが、なぜかうまく行きません。

$Eflag = eval('use Encode qw/ from_to :fallbacks /; 1');

とやっておいて、

if ($Eflag) {
from_to($_, 'utf8', 'cp932', FB_XMLCREF);
}

という風に処理したいのですが、evalを通したらfrom_toだけだとうまくインポートできるのですが、この書き方だと:fallbacksのほうだけインポートされないようです。
普通にevalを通さないで、use Encode qw/ from_to :fallbacks /;と書いたら正常に動くのですが、これだとEncode.pmのない環境ではコンパイル時エラーが出てしまうので困っています。

ここでevalを通すと、:fallbackはインポートされないのでしょうか?
うまく処理する方法または、これに代わる何かいいアイデア等ございましたらぜひとも教えていただきたく思います。
223nobodyさん:2005/08/28(日) 16:50:57 ID:???
>>221
とりあえず、アンインストールして、ディレクトリも全部消してから、再インストール。
できれば、最新のバージョンのものを。

>>222
BEGIN{
eval("use Encode qw(:fallbacks from_to)");
$eflag = ($@ ? 0 : 1);
}
if ($eflag){
from_to($d, 'utf8', 'cp932', FB_XMLCREF);
print $d;
}
224nobodyさん:2005/08/28(日) 17:01:40 ID:???
>WinXP、ActivePerl6.8.1です。
ここスルーでつか?
225nobodyさん:2005/08/28(日) 17:05:14 ID:???
「ここだけ○年進んでるスレ」の類から来たんだろう
226nobodyさん:2005/08/28(日) 18:08:27 ID:AszUkSZs
>>223
どうもありがとうございました。
参考にさせてもらったところ無事問題が解決できました。
227nobodyさん:2005/08/29(月) 02:19:20 ID:???
すみません質問します。メールを登録アドレスに配信するシステム(メルマガを発行しようと思ってます)を考えているのですが、アドレスが行ごとに入力されているファイルと、実行用のperlを用意して、

$sendmail = '/usr/sbin/sendmail';
open(LOG,"$datfile");
flock(LOG, LOCK_EX);
@alldata = <LOG>;
close(LOG);
foreach $mail (@alldata){
$mail =~ s/ //g;
open(MAIL,"| $sendmail -t");
print MAIL "To: $mail\n";
print MAIL "From: magazine\@foo.co.jp\n";
print MAIL "Subject: bar\n\n";
print MAIL "$message\n";
close(MAIL);
}

メールアドレスが格納されているファイル($datfile)を展開して、各行を$mailに代入(万が一を考えて半角スペースの除去も行っています)して、同じメールを送信しようとしているのですが、送信されるメールは、
差出人:ユーザーID
受信者:$mail該当者
で、本文に、

From: [email protected]
Subject: bar

$messageに入ってる文字列

と出てしまいます。

試しに$mailの部分の記述を実在するアドレスに差し替えたところ、$datafileの行数だけ(その回数だけforeachが実行されるから)記入したアドレスにメールが届きましたが、その場合は、差出人にFrom: の内容が、件名にSubject: の内容が入り、本文にこれらは出ませんでした。

なぜ、ズレが生じるのでしょうか?根本的に理解できてないかもしれません。お教えいただけると幸いです。
228nobodyさん:2005/08/29(月) 02:31:55 ID:???
$mail =~ tr/\r\n//d; とでもしとけ。
229nobodyさん:2005/08/29(月) 02:32:27 ID:???
SPAM業者はカエレ
230nobodyさん:2005/08/29(月) 02:35:14 ID:???
>>228
改行コードが残っていて、改行のみの行が存在し、それ以降が本文扱いにされているのでしょうか。
有難う御座います。早速試してみたいと思います。
231nobodyさん:2005/08/29(月) 02:39:07 ID:???
>>228
うまくいきました。有難う御座いました。

>>229
そういう誤解を招くと思ってメルマガと言ったんですが、信用はないですよね。
気分を害してしまい申し訳ありませんでした。
232nobodyさん:2005/08/29(月) 22:53:35 ID:2Z/c1c0/
ごめんなさい。自分では解決できないので
質問させて下さい。

perl 5.0 linux apache環境です。(あまり環境は関係ない質問ですが。。)

国語,30,53,23,23
算数,35,35,12,64
公民,43,43,34,56
日本史,33,2,2,2

といった感じのCSVファイルがあったとして一部のデータのみ書き換えるという処理は
可能でしょうか?

つまり80行目の3列目だけデータを書き換えるとか、公民の5列目(56の部分)だけ56を52にするとか
することは可能でしょうか?

私の知識では
このCSVをすべて@配列にいれてこれをforeachで一行一行読んで5つにカンマでsplitして変数に保存していき、

($date.=date[0].",".date[1].",".date[2].",".date[3].",".date[4]."\n" )

date[0]が公民だったら4行目を52にして

($date.=date[0].",".date[1].",".date[2].",".date[3].",52\n" )

$dateを print FILEHANDLE date.csv;

ですべて上書き保存するという非効率な方法しか思いつきません。

要所部分だけ書き換えるという方法がありましたら、ないかも知れませんが。。
教えていただければ幸いです。
233nobodyさん:2005/08/29(月) 23:02:38 ID:???
>>232
その環境でDB使わないで、あくまでcsvで行くのですね…。

すべて配列に入れるよりも、
正規表現で「公民」にマッチする行だけsplitして書き換えては。
234nobodyさん:2005/08/29(月) 23:06:26 ID:???
235232:2005/08/29(月) 23:36:34 ID:2Z/c1c0/
>>233

ありがとうございます。mysqlもpostgreも使えない環境です。。
仰るとおりの方法にしたいのですが、
splitして該当の行だけ書き換えるという処理がわかりません。
もしよろしければ、ヒント下さい。

>>234

ありがとうございます。
読んでみましたが、私が232で試そうとしている
方法のようです。確かにこれが一番簡単で
私のような初心者にもわかりやすいのですが、
書き換える箇所が何箇所もあると
同じファイルを1回の処理で何回も上書き保存しないと
いけない重たい処理になってしまいます><
236nobodyさん:2005/08/29(月) 23:36:40 ID:???
>>232
扱うファイルが小さいなら、DBを使うよりも
現在のようにシーケンシャルファイルを扱う方法のままが手軽でいいかも。

その上で、
1. 2次元の表を扱うので2次元配列に読み込む
2. ファイルからの読み込み、ファイルへの書き出しは
 push, join, map 等を使って簡潔に書けるので、その辺りを調べてみる
といいと思う。

my @data;
open(IN, 'data.csv');
for (<IN>) {  # ファイルサイズが大きいなら while で
  push(@data, [ split(/,/) ]);
}
close(IN);

$data[79][2] = 'hoge';  # 80行3列を書き換える
$data[2][4] = 52;  # 公民の5列目を52に

open(OUT, '> data.csv');
print OUT map { join(',', @{$_}) . "\n" } @data;
close(OUT);

# チェックしてないのでミスありそう

こんな感じはどうでしょう?
237nobodyさん:2005/08/29(月) 23:39:03 ID:???
つStorable
238232:2005/08/30(火) 00:03:14 ID:x5m98we0
>>236

ありがとうございます。
その方法でやってみます。
確かめていないのでうごくかはわかりませんが、
取次ぎお礼まで!
ありがとうございました。
239nobodyさん:2005/08/30(火) 01:18:03 ID:???
宿題くさいな
240nobodyさん:2005/08/30(火) 11:27:34 ID:???
>>237
とか、テキストにしときたいなら Data::Dumper とかのほうが簡単
241nobodyさん:2005/08/31(水) 14:49:41 ID:2aj3BZHt
変数のサイズを知りたい時は何を使えばいいんでしたっけ?
242nobodyさん:2005/08/31(水) 14:56:42 ID:???
すいません、思い出しました。lengthでした。
243nobodyさん:2005/08/31(水) 16:24:59 ID:???
ソースの中に
-----
next if (!$acl{$base_remote_user,$minfo->{'dir'}} &&
!$acl{$base_remote_user,"*"});
-----
という箇所があったのですが、中括弧($acl{})の中の意味が分かりません。
中括弧でかこって中にカンマというのはどういう意味でしょうか?
244nobodyさん:2005/08/31(水) 16:38:21 ID:???
>>243
多次元配列のエミュレーション用の機能で
$foo{$a,$b,$c}

$foo{join($;, $a, $b, $c)}
と同じ。詳しくはperlvar(1)の$;の項などを参照されたい。
245nobodyさん:2005/08/31(水) 18:22:07 ID:???
文字(A,a)をコード(\x41,\x61)に変換したいのですがどのようにすればいいでしょうか?
また、逆にコードを文字に戻したりもしたいのです。
246nobodyさん:2005/08/31(水) 18:23:01 ID:???
ageます
247nobodyさん:2005/08/31(水) 18:30:58 ID:???
>>245
pack、unpack、ordあたり調べてきな。
# 実際に '\x' も付けて表記してるならevalで戻せるけどな。
248243:2005/08/31(水) 18:46:38 ID:???
>>244さん
なるほど、分かりました。
どうもありがとうございました。
249nobodyさん:2005/08/31(水) 19:01:48 ID:???
>>245
あまりきれいに書けてないけど。例を。

for ('A', 'a') {
  print '\x' . unpack('H2', $_);
}
for ('\x41', '\x61') {
  /\\x(..)/;
  print pack('H2', $1);
}
250nobodyさん:2005/08/31(水) 19:11:24 ID:4hPwGNyx
XMLRPC::Liteを使ってブログにを投稿しようとしてるんですが
日本語使うと文字化けしちゃって読めません。
# どうやらbase64に強制変換されてる様子。
どうすれば日本語を使えるようになるでしょうか。
なお現在のソースはイカの感じです。

use strict;
use XMLRPC::Lite;
use Jcode;

my $name = "name";
my $pass = "pass";
my $title = "たいとる";
my $description = "ほんぶん";

#&Jcode::convert(\$title,'utf-8');
#&Jcode::convert(\$description,'utf-8');

print $title;

my $msgresult = XMLRPC::Lite
-> proxy('http://blog.fc2.com/xmlrpc.php')
-> call('metaWeblog.newPost', "0", $name, $pass,
{
'title' => $title,
'description' => $description,
'mt_allow_comments' => 1, # must be int, not string
'mt_allow_pings' => 1 # must be int, not string
},
1
)
-> result;
251nobodyさん:2005/08/31(水) 21:12:32 ID:HyyIksuT
ほんとに初歩的な事だと思うんですが…
if( $a == 0 || $a == 1 || $a == 2 || $a == 3 ){

$aに0、1、2、3のどれかが入っていたら…、という文なんですが、
これをもう少し簡潔に書くとどうなるでしょうか?
数字が0、1、2、3……10くらいまで続き、また別のグループで11〜20、21〜30までを
今はそれぞれelsifで処理しています。
効率が悪いかな?と思いまして…。よろしくお願いします。
252nobodyさん:2005/08/31(水) 21:19:36 ID:ihFBKKnR
>>251
TIMTOWDI

if $a =~ /(\d+)/ and 0 <= $1 and $1 <= 30
if defined $a and 0 <= $1 and $1 <= 30
253nobodyさん:2005/08/31(水) 21:19:58 ID:???
>>251
if ( 0 <= $a && $a <= 10 ) { }
elsif ( 11 <= $a && $a <= 20 ) { }
elsif ( 21 <= $a && $a <= 30 ) { }
254nobodyさん:2005/08/31(水) 21:24:22 ID:???
>>251
書き方云々ではなく、その処理自体を何とかできんのか
255251:2005/08/31(水) 22:24:49 ID:???
レスありがとうございます!
>254
すみません、なんかこの処理を他に変える方法が今の自分にはわからなくて…
スキル不足ですね。勉強します。
256nobodyさん:2005/08/31(水) 22:28:33 ID:ihFBKKnR
あとで思いついた
10ごとに区切る前提なら
my $flag = int $a / 10;
if ( $flag = 0 ) {}
...
if ( $flag = 3 ) {}

は?
257nobodyさん:2005/08/31(水) 23:09:37 ID:???
if ($a =~ /[0-9]/) {}
if ($a =~ /1[0-9]/) {}
if ($a =~ /2[0-9]/) {}
258nobodyさん:2005/08/31(水) 23:15:40 ID:???
こういう回りくどい処理が必要になったら
どこか設計が間違ってると疑った方がいい。
259nobodyさん:2005/09/01(木) 09:17:57 ID:???
>>256
$flag という変数名を使う習慣は捨てたほうがいい。
(そもそも割り算の商はフラグじゃないし)

もし意味がフラグだったとしても何のフラグなのかあらわす単語を名前にしる。
260250:2005/09/01(木) 10:18:56 ID:pBV3XGF+
自己レスです。

'title' => $title,
'description' => $description,

の所を

'title' => XMLRPC::Data->type('string', $title),
'description' => XMLRPC::Data->type('string', $description),
とする事で解決しました。
# $title及び$descriptionの中身はutf-8に変換してます。
261nobodyさん:2005/09/01(木) 14:07:05 ID:???
Linuxのコマンドをperlで実行させて、その結果を変数に格納したいのですが
下記のようなやり方だと出来ません
どのようにしたらよいのでしょうか?

$b = system("vuserinfo -l $a");
print $b;
262nobodyさん:2005/09/01(木) 14:37:00 ID:???
>>261
$b = `vuserinfo -l $a`;
print $b;

systemはコマンドの戻り値が返されるのかな。
あと、openかsystem関数かでパイプを使う方法等もあったと思う。
263nobodyさん:2005/09/01(木) 14:49:32 ID:???
>>262
ありがとうございました!とても助かりました・・
264nobodyさん:2005/09/01(木) 17:46:03 ID:???
初心者スレなので一応言っておくけど、
>>252>>256>>257は色々間違ってるよ。
265nobodyさん:2005/09/01(木) 18:28:04 ID:???
>>264
ほんとだ。すべて微妙に間違ってる…。
266nobodyさん:2005/09/01(木) 18:37:12 ID:???
夏休みの宿題に正解教える訳なかろう・・
267nobodyさん:2005/09/01(木) 19:34:23 ID:???
>>265
微妙どころじゃない気が…
268nobodyさん:2005/09/01(木) 21:28:02 ID:???
しかし誰も間違っている箇所を指摘できない罠wwwm9(^Д^)プギャーーーー
269nobodyさん:2005/09/01(木) 21:29:53 ID:???
そんなもん必死に指摘するほどでもないだろうに・・・
270nobodyさん:2005/09/02(金) 01:43:26 ID:5yfALZxB
while($line = <FILE>) {
 push(@tmp, $line);
}
close(FILE);

で、

print @data;

とすると、2行目以降、各行の先頭に半角スペースが入ってしまうのですが、
何が原因でしょうか?
271nobodyさん:2005/09/02(金) 01:48:22 ID:???
ファイルの2行目以降の先頭に半角スペースがあるから
272270:2005/09/02(金) 01:50:31 ID:5yfALZxB
>>271さん
それはないです。。。
1行ずつ

while($line = <FILE>) {
 print $line;
}
close(FILE);

とすると大丈夫なので。
273nobodyさん:2005/09/02(金) 01:54:04 ID:???
マジレスすると、>>270のを実行しても、何も出てこない
274nobodyさん:2005/09/02(金) 01:54:19 ID:???
ほんとは print FH "$newline\n@array"; みたいなことしてんだろ。
275270:2005/09/02(金) 01:54:19 ID:5yfALZxB
$line =~ s/ //g;

とやっても変化無しです。
276nobodyさん:2005/09/02(金) 01:54:50 ID:???
@tmpに詰め込んで@dataを出力している点について
277270:2005/09/02(金) 01:55:26 ID:5yfALZxB
>>273さん
すみません、

open(FILE, $file);

が抜けてましたorz
278nobodyさん:2005/09/02(金) 01:56:30 ID:???
>>273の言いたい事は>>276が言ってることだと思われ
279270:2005/09/02(金) 01:57:14 ID:5yfALZxB
>>276さん
すみません、書き込む時に間違えました。
手元のは大丈夫です。

あぁ、もうだめぽ。
280nobodyさん:2005/09/02(金) 01:58:11 ID:???
もう一回ゼロから勉強してこような
281nobodyさん:2005/09/02(金) 02:00:22 ID:???
print @temp;


print "@temp";



以上の違いを説明せよ
282民主党:2005/09/02(金) 02:36:21 ID:9iT1X8+f
  ★★★ また韓国、意図的な、でっち上げ反日報道 ★★★
 韓国大手テレビ局の8月15日番組「日本軍731部隊の生体実験」が、実は真っ赤なウソ、中国映画の盗用でっち上げだった。
 韓国マスコミは反日番組で、この種のでっち上げ「歴史歪曲(わいきょく)」をよく行うが、今回の事件で 「日本糾弾ならウソも平気」 という腐敗体質が改めて確認された。

 番組では実験の様子を「白黒の記録フィルム風」に紹介したが、視聴者から「映画の場面と同じだ」との声が上がり、悪質なでっち上げが露呈した。
 この中国映画はカラー作品だが、テレビでは本物に見せかけて「白黒」に変えられており、意図的なでっち上げであることは明白。

 日本の 民 主 党 【岡田党首】 は、日本国内に数十万人もいる反日的な在日韓国・朝鮮人に、日本の選挙権を与え、 民 主 党 に投票させようと画策している。
 在日韓国・朝鮮人の大部分は、戦後のドサクサで勝手に密入国した不法滞在者とその子孫だが、「強制連行された」とウソをつき、被害者のフリをして日本国内に居座っている。
 収入があっても税金は一切払わず、さらに毎月二十数万円の生活保護をもらい、日本人の悪口を言いながら遊び暮らしている。
283nobodyさん:2005/09/02(金) 10:04:13 ID:???
まずやらないとは思うが$,に空白を設定すればprint @tempでも空白入るよ。

% perl -e '@temp=("a\n", "b\n"); $,=" "; print @temp;'
a
b

284nobodyさん:2005/09/02(金) 12:41:24 ID:???
>>270
Perlのバージョンは?
それから、問題が再現する最小のコードを作ってそのまま貼ってもらえると
アドバイスしやすいかな。

おれは昔(1〜2年ほど前)、print @hoge; とすると最初の行だけ先頭に
半角スペースが入ったことがあった。
print にスカラーやリストを渡した場合等は大丈夫なんだが、配列1つだけ
(もしくは先頭に配列変数だったかな)を渡すとそうなった。
(270さんと逆だなぁ。)
今、win & Linux 上で試してみたけど、そういう現象は起こらなかった。

もしかすると、Perl の、print あたりの実装上の問題かも。

# 今試して再現しなかったと書いたけど、なにぶん昔のことなので
# 方法を間違えているだけかも。
285nobodyさん:2005/09/02(金) 12:56:58 ID:???
>>284だが、

どうやらおれが書いた問題は
>>281さんが指摘したことだったみたいだ。

多分、自分の場合は、ヒアドキュメントの中で変数展開を使おうとして
先頭に改行が入っていたのだった。

print <<END;
@hoge
END

これだと改行が入るので、苦し紛れにリファレンスとデリファレンスを
使って次のように回避していたのを思い出した。

print <<END;
${ \join('', @a) }
END

>>281
文字列中での配列変数の展開では、要素間に半角スペースを入れて
結合されるのかな。
一方、引数として配列変数を指定した場合(前者)は、最初にリストに展開される
ため期待通りに処理される、と。
286nobodyさん:2005/09/02(金) 14:02:12 ID:???
>>285
文字列中での変数展開では$"が間に挿入される。デフォルト値は空白。

printでは要素間に$,が挿入される。デフォルト値は空文字列。
287nobodyさん:2005/09/02(金) 23:01:28 ID:???
>>281
「ひょっとして、ダブルクォート文字列の中に、chomp していない配列を入れていませんか?」
というやつだね。
288nobodyさん:2005/09/03(土) 03:59:11 ID:???
アップロードされた画像をftpで別のサーバに転送して表示する画像掲示板のサンプルか何かはありませんか?
289nobodyさん:2005/09/03(土) 05:05:43 ID:???
2chの串チェックの一つにtorチェックがありますが
あれはいったいどうやってtor経由か判断しているのでしょうか
290nobodyさん:2005/09/03(土) 15:37:23 ID:???
>288
スレ違い
291nobodyさん:2005/09/03(土) 15:49:52 ID:???
>>289
これでも参考に

風呂敷確認君 弐式 2.07
http://sv2ch.baila6.jp/chk_proxy.cgi
http://sv2ch.baila6.jp/chk_proxy.cgi?source
292nobodyさん:2005/09/04(日) 03:20:49 ID:pmMRy4XZ
「項目区切りはHex(09)でお願いします」といわれましたが、
意味がわかりません。

「$v1 . hex(09) . $v2」というように項目の区切りとしてhex関数
を指定してみましたが、エラーが出てしまいます。

質問すると怒られるので焦ってます、、
ご教示いただけますと幸いです。
293nobodyさん:2005/09/04(日) 03:36:22 ID:???
>>292
$v1 . "\x09" . $v2

hex 関数は、引数の文字列を16進数とみなし整数を返す関数。
294nobodyさん:2005/09/04(日) 04:03:51 ID:???
>>293
本当に有難うございます。

「受付データの区切りはタブ(\t)を入れており、
項目区切りはHex(09)となってますので」

と言われた意味がようやくわかりました。
Hex(09)=\tということなんですね。

勉強になりました。
295nobodyさん:2005/09/04(日) 04:45:50 ID:???
>>294
えーと、まぁ正確には

hex 関数は 「16進数 → 10進数 変換」する関数
(例: print hex('0a'); # 10 と表示される)

なので今回の例では hex は使えず。
代わりに、「10進数 → バイナリ 変換」 できる chr 関数、pack 関数、\x?? の表記
あたりのいずれかを使えばOKということです。

(例: print chr(9); # tab文字が表示される)

今回の例だと、

・$v1 . chr(0x09) . $v2
・"$v1\x09$v2"
・$v1 . "\t" . $v2
・"$v1\t$v2"

辺りでもOK。
296nobodyさん:2005/09/04(日) 08:02:46 ID:???
区切りってことなら join "\t",@list; も忘れずに
297nobodyさん:2005/09/04(日) 12:20:52 ID:???
>>291
ありがとうございます
見たところ単純にリストと照合してるだけのようですが
そのリストをどうやって作ってるのかがなぞですね
298nobodyさん:2005/09/04(日) 13:47:14 ID:???
>>295-296
勉強になるお話、ありがとうございます。

なぜ指示した人は「Hex(09)で」といったのでしょうかね。
「\x09で」と自然に結び付けていったつもりだったのでしょうか。
言い方は間違ってないかと思いますが、少しおかしいとも思いました。
というか僕が混乱しているせいもありますが。。

素直に\tを使うことにします。
299nobodyさん:2005/09/04(日) 13:58:15 ID:???
>>298
一般的に hex は 16進法の という意味で(語源の英語 hexadecimal がそういう意味)、
担当の人は 16進表記での09 というつもりで Hex(09) と書いたのかもしれないね。

でもまぁ、開発言語がPerlと限定されてるなら、hex と chr 関数を間違えた可能性も。
おれも普段はそこらへんは曖昧だしなぁ。
Perlでhex(09)で と指定されたら、あまり慣れてない人なら少々誤解してもある程度無理ない罠。

開発&上達ガンガレ。
300nobodyさん:2005/09/04(日) 17:23:14 ID:???
>>299
今後の知識として今回のご教示は非常にためになりました。
最後までご親切に有難うございます。
ガンガリマス
301nobodyさん:2005/09/04(日) 22:22:16 ID:???
サーバーから転送量激しいから何とかしてくれってメールきて画像系CGIの転送量がやばいらしいから該当CGIにトラフィック制御を付けようと思ってます。
そこで次のサブルーチンを作成してみました
[ $Trafic_Timeout ]秒間に [ $Trafic_min_limit ] バイト転送したら転送量エラーと表示したいとして &TraficPlus(画像サイズ); って感じで呼び出したいと思っています。
全くスマートなプログラムではありませんが、これでいけると思ってやった見て、何度か改良しましたがうまくいきません。
どなたか改良又は知恵をかしていただけませんか?宜しくお願いします。

sub TracficPlus{
$plus = $_[0];
my $size;
&filelock('tr.lock');
$Trafic_min_limit = 202400;
$Trafic_Timeout = 60;
my $nowtime=time;
open(IN,"time.trafick");$mtime = <IN>; close(IN);
open(IN,"now.trafick");$total = <IN>;close(IN);
$time = $nowtime - $mtime ;
if($time > $Trafic_Timeout){
$total = 0;
open(IN,">time.trafick");print IN $nowtime; close(IN);
}
$total += $plus ;
open(IN,">now.trafick");print IN $total;close(IN);
open(IN,"total.trafick");$ttt = <IN>;close(IN);
$ttt += $plus;
open(IN,">total.trafick");print IN $ttt;close(IN);
&fileunlock('tr.lock');
if($total > $Trafic_min_limit){&Error($Limit);}
return $size;
}

http://pc8.2ch.net/test/read.cgi/tech/1121804136/658 からのスレ違いとのことでこちらにマルチっぽくなってしまっていますが宜しくお願いします。)
302nobodyさん:2005/09/04(日) 22:52:45 ID:???
>>301
とりあえずすぐに気づくのは、$size に値が代入されずに return されてることだなぁ。

1. 各 .trafick ファイルの役割
2. どういうふうに うまくいかないのか

を書いてもらえれば、アドバイスしやすいかも。
303nobodyさん:2005/09/04(日) 22:57:53 ID:???
わざと変えてるなら余計なお世話かもしれんが
トラフィックの綴りはtraffic
304nobodyさん:2005/09/04(日) 23:10:18 ID:???
>>303
真剣に綴りミスしてました。忠告サンキューです。

>>302
えと、今もう一度プログラム書き直しているので>>301の物はおいとかしてください。
今やろうとしているのは、 n 秒間に m バイトのデータが転送されたら n 秒経過するまで転送量エラー画面で止めておくプログラムを組みたいと思っています。
305304:2005/09/05(月) 00:04:16 ID:???
ちょっと書き直してみましたが、やはりうまいこと生きませんでした。
この状態で、$Trafic_min_limitの値を0にして、実行しても記録はされているもののエラーには飛びませんでした。
各行で何をやろうとしているのかは注釈を入れておきました。宜しくお願いいたします。

sub TrafficPlus{
$plus = $_[0];
$Trafic_min_limit = 202400;
$Trafic_Timeout = 60;
my $Traffic_now   = 'traffic.now.hidden'; #現在の転送量保存
my $Traffic_total = 'traffic.total.hidden'; #全体の転送量保存
my $Traffic_time  = 'traffic.time.hidden' #現在の転送量を保存したときの時間
my $nowTime=time;  #現在の時間
&filelock('tr.lock');
$ntraffic = `cat $Traffic_now`; #現在の転送量取得
$straffic = `cat $Traffic_time`; #保存したときの時間を取得
$ptime   = $nowTime - $straffic; #現在の時間と保存したときの時間差取得
if($ptime > $Trafic_Timeout){$ntraffic = 0;} #指定時間を超えていた場合リセット
$ntraffic += $plus; $straffic += $plus; #現在の転送量に新たな転送量を加える
#現在の転送量をファイルに記録する
`echo '$ntraffic' > $Traffic_now`;
`echo '$straffic' > $Traffic_total`;
`echo '$nowtime' > $Traffic_time`;
&fileunlock('tr.lock');
if($Traffic_now > $Trafic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
306nobodyさん:2005/09/05(月) 00:12:17 ID:???
正規表現で
\0
というのは何を表しているのでしょうか?
ぐぐって見たのですが、見つかりませんでした。
(あまりにも単純すぎて、検索するのが意外と難しい)
307nobodyさん:2005/09/05(月) 00:13:24 ID:???
>>306
ヌル文字
308nobodyさん:2005/09/05(月) 00:19:28 ID:???
圧縮転送はダメなん?
309306:2005/09/05(月) 00:23:07 ID:???
>>307
ありがとうございます。
javascriptでnull文字使って結合か・・・
頭が痛い
310304:2005/09/05(月) 00:24:11 ID:???
既にgzip圧縮されてるっぽいです
日転送量が3GBぐらい行ってるらしくて。普通の鯖なら蹴られて当然な数値ってことはすぐ分かりました。
まだ許してくれてるので早急に対応したいなと。とりあえず今は画像の表示にsleepで時間差を付けて耐えております。
311nobodyさん:2005/09/05(月) 00:39:15 ID:???
>>305
とりあえず最後のif文で、$Traffic_now(ファイル名)と
$Traffic_min_limit(バイト数)を比較してるのはおかしいだろ。
$ntrafficじゃないのか?

あと$ntrafficがリセットされるのが、リクエスト間が$Traffic_Timeout秒
あいたときだけなんだが、これはそういう仕様なのか? $Traffic_Timeout秒
以下の間隔でリクエストが来続けるといったん制限かかったらかかりっぱなし
になりそうだが。
312nobodyさん:2005/09/05(月) 00:55:25 ID:???
>>311
すっゲー間違いしてました。サンキューです。
修正してみましたがまだ正しく動かないっす・・・。
とりあえずできるまで粘ってみます。
313nobodyさん:2005/09/05(月) 01:20:29 ID:???
>>305

>>311が書いてるけど、各秒ごとの転送量を保存しないと、
指定時間内の転送量が出せないね。

↓文法チェックもしてないけど。ファイルロック処理等も無し。
314nobodyさん:2005/09/05(月) 01:21:54 ID:???
sub TrafficPlus {
  my $plus = shift;  # 増加量
  my $Trafic_min_limit = 202400;
  my $Trafic_Timeout = 60;
  my $now = time;  # 現在時刻

  my %traffic;  # 転送量

  # ファイルから転送量情報を読み込む。
  open(IN, 'traffic.dat');
  my %in = split(/,/, <IN>);
  close(IN);
  for ( keys %in ) {  # $Trafic_Timeout秒以前の情報を捨てる
    $traffic{$_} = $in{$_} if ( $_ > $now - $Trafic_Timeout );
  }
  $traffic{$now} += $plus;

  my $sum;  # 指定時間内の転送量合計
  for ( keys %traffic ) {
    $sum += $traffic{$_};
  }

  # 転送量情報を保存。
  open(OUT, '> traffic.dat');
  print OUT join(',', %traffic);
  close(OUT);

  if ( $Trafic_min_limit > $sum ) {
    TrafficError();
  }
}
315nobodyさん:2005/09/05(月) 06:55:48 ID:???
perl 5.8 でPPMを使ってGDをインストールしようとしたのですが出来ませんでした
GDインストール解説サイトに5.8はまだPPMが使えないのでActivePerlは5.6をインストールするように書いてありました
その解説は2004年9月に書かれたものですが
現在も5.8ではPPMは使えないのでしょうか
316nobodyさん:2005/09/05(月) 08:41:06 ID:???
GD 2.25ならあるみたい。ppmで
rep add theoryx5 http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer58
としてから
search GD
で見つかると思う
317nobodyさん:2005/09/05(月) 10:34:21 ID:???
>>315
有難う御座います
いまから試してみます
318304:2005/09/05(月) 11:26:42 ID:???
転送量の件できたっぽいので一応報告しときます。↓の奴で今のところ正常に動いてます。ありがとうございました。
sub TrafficPlus{
$plus = $_[0];
#現在の転送量保存
 my $Traffic_now = 'traffic.now.hidden';
#全体の転送量保存
 my $Traffic_total = 'traffic.total.hidden';
#現在の転送量を保存したときの時間
 my $Traffic_time= 'traffic.time.hidden';
#現在の時間
 my $nowTime=time;
&filelock('tr.lock');
 #現在の転送量取得
  $ntraffic = `cat $Traffic_now`;
 #保存したときの時間を取得
  $straffic = `cat $Traffic_time`;
 #現在の時間と保存したときの時間差取得
  $ptime = $nowTime - $straffic;
 #指定時間を超えていた場合リセット
  if($ptime > $Traffic_Timeout){$ntraffic = 0;$straffic = $noTime;}
 #現在の転送量に新たな転送量を加える
  $ntraffic += $plus;
  $straffic += $plus;
 #現在の転送量をファイルに記録する
  `echo '$ntraffic' > $Traffic_now`;
  `echo '$straffic' > $Traffic_total`;
  `echo '$nowTime' > $Traffic_time`;
&fileunlock('tr.lock');
if($ntraffic > $Traffic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
319nobodyさん:2005/09/05(月) 11:34:24 ID:???
あーチョッと2行書き忘れていたので行数の関係上注釈無しで入れときます。

sub TrafficPlus{
$plus = $_[0];
  $Traffic_min_limit = 500000;
  $Traffic_Timeout = 60;
  my $Traffic_now  = 'traffic.now.hidden';
  my $Traffic_total  = 'traffic.total.hidden';
  my $Traffic_time  = 'traffic.time.hidden';
  my $nowTime=time;
&filelock('tr.lock');
    $ntraffic   = `cat $Traffic_now`;
    $straffic   = `cat $Traffic_time`;
    $ptime    = $nowTime - $straffic;
    if($ptime > $Traffic_Timeout){
        $ntraffic = 0;
        $straffic = $noTime;
    }
    $ntraffic += $plus;
    $straffic += $plus;
    `echo '$ntraffic' > $Traffic_now`;
    `echo '$straffic' > $Traffic_total`;
    `echo '$nowTime' > $Traffic_time`;
&fileunlock('tr.lock');
    if($ntraffic > $Traffic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
320nobodyさん:2005/09/07(水) 13:59:48 ID:oYntvDxu
NFSとかサーバ設定関係は一切いじらず、2サーバのファイルを
同時に書き込むような仕組みでなにかよい方法はございます
でしょうか。
この2サーバはロードバランサーで動作しております。

現在は各サーバに受け側CGIを設置(ファイル書き込みCGI)。
それぞれのサーバにアクセスがあった場合、SOCKET通信で
もう一方のサーバのCGIを叩く仕組みでファイルの同期を取って
いるのですが、アクセスが集中したりすると
「Resource temporarily unavailable」とエラーが出たりしてしまい、
多少怒られております。

何かよい案があればご教示いただけますでしょうか。
宜しくお願いいたします。
321nobodyさん:2005/09/07(水) 20:41:36 ID:3mQbsuSc
シロートな質問ですいませんが、どなたか教えて下さい。

<A href=http://a.jp/abc.cgi?menu=1>メール</A>
というリンクでabc.cgiへ移るとき、メニュー番号をmenu=1で渡すと同時に
<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=$wk_id >でIDとパスワード
も渡すことはできないでしょうか?そもそもhiddenはフォームのボタン等
がクリックされた場合のみで、リンクの場合には渡せないのでしょうか?
リンクでID、パスワードを渡すとアドレスに表示されるので、できれば
hidden等が良いのですが。

よろしくお願い致します。
322nobodyさん:2005/09/07(水) 20:50:01 ID:???
Perl関係ねーぞ

<A>のリンクでhrefにアドレスを設定するのではなく、
onClickでJavascriptのfunctionよんで、そこでsubmitさせる
323nobodyさん:2005/09/07(水) 20:50:14 ID:???
>>320
CGIを動かしてる鯖以外に、ファイルサーバを導入する。しかないような…。

しかも、Resource temporarily unavailableのメッセージはhttpdが出してるやつでしょ?
単なるアクセス制限だからCGIのコーディングと関係ない。
324nobodyさん:2005/09/07(水) 20:53:03 ID:???
>>321
JavaScript を使えばできますよ。

<a href="http://hoge/abc.cgi?menu=1" onclick=〜>
# onclick で呼ばれる関数で post メソッドで submit (CGI呼び出し)。

それか素直に、button にしておくか。この場合でも、
<form method=POST action="./abc.cgi?menu=1">
としておくと、URLには menu=1 が現れる。

上記いずれの場合でも、CGI側で menu と id の値を両方取得可。

# JavaScript と HTML の細部の記憶は曖昧なのでスペルミス等あれば悪しからず。
325nobodyさん:2005/09/07(水) 23:53:10 ID:???
>>323
ご返答有難うございます。

アクセス制限ですか。
とくに認証等はかけてないのですが、接続数制限という意味でしょうか。
326nobodyさん:2005/09/07(水) 23:59:39 ID:???
>>325
他で管理している鯖ですか?

認証は関係ありません。
制限自体は、その鯖の設定によりけりです。
単位時間あたりの接続数、ヒット数、転送量、など
いろいろな情報を元に制限をかけることが可能です。

制限がヒット数になっていて、そのページに画像が多い場合、
すべてヒットとカウントされて制限に引っかかることもあります。
327nobodyさん:2005/09/08(木) 00:24:20 ID:???
>>320
あれ?ちょっと変じゃないですか??

ロードバランサ入れてるんですよね。
一方のCGIが叩かれた時に、もう一方のCGI叩いたらダメでしょ。
負荷分散してる意味が無いような…。
328nobodyさん:2005/09/08(木) 01:46:08 ID:???
>>326
CGI側ではどうすることもできないんですね。
サーバの設定を見直してもらいます。

>>327
一部だけファイルを同期する必要があるので、この手法を
とりました。
329nobodyさん:2005/09/08(木) 03:24:01 ID:vnFPn7Ff
%test = (
2 => '2です',
6 => '6です',
'Y' => '12です'
);

このようなハッシュを

foreach my $key (sort { $a <=> $b || $a cmp $b } keys %test) {
print "$key\n";
}

こう並べ替えますと、なぜか

Y
2
6

になってしまいます。

2
6
Y

にしたいのですが、
ご教示いただけますと幸いです。
330nobodyさん:2005/09/08(木) 04:23:02 ID:???
>>329
Yは数値じゃないから$a <=> $bの時点で0と見なされてる。
331nobodyさん:2005/09/08(木) 04:24:19 ID:???
そのハッシュキーだけなら
sort { $a cmp $b }
でいいんじゃね?
332nobodyさん:2005/09/08(木) 04:27:51 ID:???
むしろデフォルトのsort keys %testでいいっしょ。
333329:2005/09/08(木) 11:27:17 ID:???
皆様、ご返答有難うございます。

実はこの部分、サブルーチン化していて使いまわして
いるので何かよい方法はないかと思っていたのですが、
$a <=> $b の数値比較のあとに $a cmp $bが評価されて
いないのではなく、$a <=> $bの時点でYが0になっていたの
ですね。

このルーチンは多くのところで使われておりますが、$a cmp $b
に統一するよう検討してみたいと思います。

本当に有難うございました。
334nobodyさん:2005/09/08(木) 13:51:44 ID:+KUBGHaQ
会員登録のシステムを製作中です。
ログをどうするか悩んでいます。
プレインテキストで数千件の登録を管理するのは可能でしょうか。
また不可能だとすればどういう方法があるでしょうか。
是非ご教示願います。
335nobodyさん:2005/09/08(木) 15:06:45 ID:???
>>334
コーディングと関係の無い話だと思います。
336nobodyさん:2005/09/08(木) 15:35:52 ID:???
>>334
数千程度なら平気じゃないかな。
しかし信頼性は低いので、SQL使うのが速いし安全かと。
337nobodyさん:2005/09/08(木) 19:09:08 ID:vnFPn7Ff
負荷について教えていただきたく思っているのですが、

sub send_socket{
 use Socket;
 my ($host, $filename, $data) = @_;
 my $path = "$filename?$data";
 my $return_value;
 my $port = getservbyname('http','tcp');
 my $iaddr = inet_aton("$host") or return 0;
 my $sock_addr = pack_sockaddr_in(80,$iaddr);
 socket(SOCKET,PF_INET,SOCK_STREAM,0) or return 0;
 connect(SOCKET,$sock_addr) or return 0;
 select(SOCKET);
 $| = 1;
 select(STDOUT);
 print SOCKET "GET /$path HTTP/1.0\r\n\r\n";
 while(<SOCKET>) {m/^\r\n$/ and last;}
 while(<SOCKET>) {$return_value .= $_;}
 close SOCKET;
 return $return_value;
}

これで内容を取得するのと

sub send_socket{
 my @wget_status = `/usr/bin/wget -q -O - "http://$host/$path"`;
 foreach (@wget_status){ $return_value .= $_; }
 return $return_value;
}

これで取得するのとでは同等という考えではございませんでしょうか。
ご教示いただけますと幸いです。
338nobodyさん:2005/09/08(木) 19:32:32 ID:???
>>337
単に負荷と言われても、どこに注目するかによって違うので、一概には比べられない。

上のは、スクリプトの部分が多い。
下のは、プロセスをforkしてる。
339nobodyさん:2005/09/08(木) 20:26:41 ID:???
>>338
100アクセス/secくらいのキャンペーンサイトで後者を使用
するのですが、非常に不安で胃がいかれそうです。。
何かアドバイス等ございましたら何でもよいのでいただけ
ますと幸いです。
340nobodyさん:2005/09/08(木) 21:12:24 ID:???
>>339
コケそうな感じですね…。
どうしても後者なら、キャンペーン中だけでも
鯖で起動できるプロセス数を引き上げておかないと…。
341nobodyさん:2005/09/08(木) 21:29:41 ID:???
>>340
前者だったらいけそうなのでしょうか。
まだ半日くらい猶予があるので、違いがあるのであれば
前者を検討してみたいと思います。
アドバイスいただけますと幸いです。
342nobodyさん:2005/09/08(木) 21:51:45 ID:???
教えて君ですみません。

偉い人に聞いてみたところ、「uname -nで分かるノード名を使って通信して、
2台のサーバのファイルの同期を取れ」といわれたのですが、一体Perlで
どのようにしてこのような通信ができるのかが全く思い浮かびません。

これ以上何も教えてくれそうもないので調べてみたのですが、これといった
答えも見つからず呆然としております。

2台は同ネットワーク上にあるものです。

ご教示いただけますと非常に助かります。
343nobodyさん:2005/09/09(金) 00:20:57 ID:???
@AA10 = ( 0, 1, 2, 3, 4 );
$BB = 10;
$CC= '$AA' . "$BB" . "[0]";

$CC を表示させると $AA10[0] となってしまいます。
どうしたら $BB などの文字を変えずに「0」と表示できるのでしょうか?

よろしくお願い致します。
344nobodyさん:2005/09/09(金) 00:23:35 ID:???
>>343
print eval($CC);
345343:2005/09/09(金) 00:56:01 ID:???
>>344
無事表示されました。
本当にありがとうございました。
346nobodyさん:2005/09/09(金) 01:35:56 ID:DzBAr2be
半角スペースを全て&nbsp;に置換したいのですが、
タグ内部まで変換されてしまって困っています。

 <font size="7"> ほげほげ </font>

$text =~ s/ /&nbsp;/g;をすると

 <font&nbsp;size="7">&nbsp;ほげほげ&nbsp;</font>
    ~~~~~~~
になってしまいます。
タグ内部を除いた部分だけを置換するにはどうしたらいいでしょうか?
347nobodyさん:2005/09/09(金) 01:41:53 ID:???
スレ違いです。

正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
348329:2005/09/09(金) 04:28:01 ID:???
sortのことで質問させていただいたものです。

たしかに
%test = (
2 => '2です',
6 => '6です',
'Y' => '12です'
);

foreach my $key (sort {$a cmp $b} keys %test) {
print "$key\n";
}


2
6
Y

こうなりましたが、たとえばキーに10や100といった数字が入っていると、
一番上にきてしまいます。

数字順>英数字という優先順位で並び替えるにはどうしたらよいのでしょうか。
349nobodyさん:2005/09/09(金) 06:19:11 ID:???
sub sortfunc {
if ($a =~ /[^0-9]/ && $b =~ /[^0-9]/) {
$a cmp $b;
} elsif ($a !~ /[^0-9]/ && $b !~ /[^0-9]/) {
$a <=> $b;
} elsif ($a =~ /[^0-9]/ && $b !~ /[^0-9]/) {
1;
} elsif ($a !~ /[^0-9]/ && $b =~ /[^0-9]/) {
-1;
}
}
foreach my $key (sort sortfunc %test) {
print "$key\n";
}
まあもっといい方法あるかな?
350349:2005/09/09(金) 06:28:21 ID:???
%test→keys %testで
351nobodyさん:2005/09/09(金) 06:44:26 ID:???
>>348
print map { "$_\n" } sort {
  $a !~ /^\d+$/ <=> $b !~ /\d+$/ ||
  $a <=> $b ||
  $a cmp $b
} keys %test;
352nobodyさん:2005/09/09(金) 08:09:10 ID:???
さらに混ぜっ返しつつ warnings clean に。

print map "$_\n",
  sort {
    return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
    return $b !~ /^\d+$/ ? $a cmp $b : 1;
  } keys %test;

>>348 のケースだと四行目は単に $a cmp $b; でもヨシだけれど、1 と -1 を交換すると逆のニーズにも対応できるという噂。
353nobodyさん:2005/09/09(金) 11:49:05 ID:???
>>341
半日っていうともう猶予は過ぎてるかも知れないけど、>>338
Perl始めたばかりのド素人のようだから無視するように。

mod_perlを使っていないのなら下の案はwgetを子プロセスとして起動する分、
サーバー負荷は無条件に高い。
単純計算で1アクセスにつき無条件にperlとwgetで計2プロセスが起動される
ことになる。wgetの中で上のコードと同じようなことをやっているのだから、
上の案のほうが負荷は半分になると考えていいだろう。

しかしそんなにアクセス数が見込まれるサイトがHTTP経由でデータ取得を行う
なんていうアホな設計になっているところが信じられん。
354348:2005/09/09(金) 11:50:39 ID:???
皆様、私にはレベルが高すぎです。
本当に有難うございます。

とりあえず一旦

foreach my $key (sort k::sort_rule keys %$refs) {
print $key;
}

sub sort_rule{
return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
return $b !~ /^\d+$/ ? $a cmp $b : 1;
}

こんな感じで後で試してみようかと思います。
結果は追ってご連絡いたします。
355nobodyさん:2005/09/09(金) 12:06:18 ID:???
>>353
有難うございます。
あれから実はソケット通信をやってみたのですが、エラーが出てしまったんです。

Object not found!
The requested URL was not found on this server.

If you entered the URL manually please check your
spelling and try again.

If you think this is a server error, please contact
the <a href="mailto:webmaster@localhost">webmaster</a>.

Error 404

localhost.localdomain

それで偉い人に聞いてみたら、「uname -nで分かるノード名を使って通信して、
2台のサーバのファイルの同期を取れ」とか言われたのですが、これがさっぱり
わからず、もうどうにでもなれといった感じでオープンが近づいております。。

ノードを名取った後どのような処理をすればよいのか、もしもご存知のようでしたら
ご教示いただきたく思っております。
356nobodyさん:2005/09/09(金) 15:06:48 ID:???
>>355
なんか予想の斜め上をいく展開だな。

とりあえずその偉い人に
同一セグメントのサーバ同士のファイルの同期をとるのが目的なら
いっそのことNFSかsambaかWebDAVでディレクトリを共有したらどうですか?
と進言してみたら?

リアルタイム性を要求されないのならrsyncとかも使える。
357nobodyさん:2005/09/09(金) 17:24:02 ID:???
>>352
>>351だが、351のコードで warnings 出るっけ?
それとも他のコードのことかな。
358nobodyさん:2005/09/09(金) 17:56:17 ID:???
>>357
数じゃない文字列を <=> で比較すると use warnings 下では

Argument 〜 isn't numeric in numeric comparison (<=>) at 〜

が出ることをいってるんじゃないだろうか。

359nobodyさん:2005/09/09(金) 18:18:45 ID:???
>>356
NFS等の導入は一番初めに提案させていただきましたが、
上から許可がおりないとか何とかであっさり却下されました。。

もうどうしたらよいのやら。。
360nobodyさん:2005/09/09(金) 19:22:09 ID:???
>>358
なるほど。サンクス。勉強になりました。
たしかに暗黙の型変換を利用してるなぁ。
361nobodyさん:2005/09/09(金) 20:40:27 ID:???
>>359
プロジェクト全体が腐ってるっぽいな。
404になる件はノード名を/etc/hostsに登録すれば
なんとかなるだろうが…

362nobodyさん:2005/09/10(土) 10:54:03 ID:???
>>359
ヘッポコ上司に連座させられたくなかったら、
ちゃんとしたプロマネつれてこないとポシャルと、
上司を飛び越してその上の上司に進言しなさい。

>>361
> 404になる件はノード名を/etc/hostsに登録すれば
> なんとかなるだろうが…
ならない。
363nobodyさん:2005/09/10(土) 11:15:29 ID:???
$count=0;
open(LOG,"$logfile");
$count += tr/\n// while(read LOG, $_, 1024);
close(LOG);

どうしてこれで$logfileの長さをカウントできるのか教えてください。
3行目のtr/\n// while(read LOG, $_, 1024);がよく分かりません。
364nobodyさん:2005/09/10(土) 11:15:52 ID:???
404というエラーが正常に返ってきているのだから、接続はできているのだ。
365nobodyさん:2005/09/10(土) 11:19:09 ID:???
>>363
ファイルのサイズではなく、行数をカウントしてるのでは。

ちなみに
open(LOG, $logfile);
の方が良いと思います。余計な変数展開がなくなります。
366363:2005/09/10(土) 11:22:57 ID:???
>>365
行数でした。
C言語しか知らないもので、while(条件){実行する内容}
という形式は理解できるのですが、perlではwhile文はどのように展開されるのでしょうか?
367nobodyさん:2005/09/10(土) 11:34:44 ID:???
>>366
while を後置しているだけです。スクリプティング言語では多く見られます。

以下と同じ意味です。
while (read(LOG, $_, 1024)) {
$count+= tr/\n//; # trは置換に成功した数を返す。
}
368nobodyさん:2005/09/10(土) 11:34:57 ID:???
>>366
perlのシンタックスの勉強なら本を買え。
369nobodyさん:2005/09/10(土) 11:47:10 ID:???
>>367
>スクリプティング言語では多く見られます。
これ本当なの
Perl独自の変態仕様じゃないの
370nobodyさん:2005/09/10(土) 11:49:30 ID:???
>>369
Perlから広まっていった…と記憶してる
371nobodyさん:2005/09/10(土) 15:15:07 ID:???
trをやめてchompで。
372名無しさん@そうだ選挙に行こう:2005/09/11(日) 16:20:19 ID:yhvSpEP/
モジュールを使わずにSHA-1ハッシュ関数を生成しようと思い以下のサブルーチンを拾ってきて以下の2つのサーバーでprint &SHA("a");を試したんですがサーバー1の方で正しいハッシュ関数が生成されてないみたいです。
サーバー1: Fedora Core release 3, Kernel 2.6.9-1.667, Perl version 5.8.5
サーバー2: FreeBSD 5.4-STABLE, Perl v5.8.2
どうすればよろしいでしょうか?
sub SHA {
### &SHA("squeamish ossifrage\n");
### Should return 82055066 4cf29679 2b38d164 7a4d8c0e 1966af57
  local ($temp, $m, @A, @K, $x, $n);
  local ($b, $c, $d, $e, $S, $r, @W, $t, $v);
  my ($msg, $p, $l) = @_; #$p=0; $l=0
  my $inputp=$_[0];
  local $_;
  $temp = 'D9T4C`>_-JXF8NMS^$#)4=L/2X?!:@GF9;MGKH8\;O-S*8L\'6';
  $m = 4294967296;
###$m=1+~0;
  @A=unpack"N*",unpack "u",$temp;
  @K=splice@A,5,4;
sub M{($x=pop)-($m)*int$x/$m};
sub L{$n=pop;($x=pop)<<$n|2**$n-1&$x>>32-$n}
@F=(sub{$b&($c^$d)^$d},$S=sub{$b^$c^$d},sub{($b|$c)&$d|$b&$c},$S);
do{
  $msg=~s/.{0,64}//s;$_=$&;
  $l+=$r=length;
  $r++,$_.="\x80"if$r<64&&!$p++;@W=unpack N16,$_."\0"x7;$W[15]=$l*8
if$r<57; for(16..79){push@W,L$W[$_
-3]^$W[$_-8]^$W[$_-14]^$W[$_-16],1}($a,$b,$c,$d,$e)=@A;
  for(0..79){$t=M&{$F[$_/ 20]}+$e+$W[$_]+$K[$_/20]+L$a,5; $e=$d; $d=$c;
   $c=L$b,30; $b=$a; $a=$t}$v='a'; @A=map{ M$_+${$v++}}@A
}while$r>56;
return sprintf'%8x'x4 . '%8x',@A;
}
373348:2005/09/11(日) 16:54:25 ID:???
遅ればせながら、ご報告させていただきます。

foreach my $key (sort k::sort_rule keys %$refs) {
 print $key;
}

sub sort_rule{
 return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
 return $b !~ /^\d+$/ ? $a cmp $b : 1;
}

これでいきました!本当に有難うございました!
まだまだ技術レベルが低いので意味がわかってないのですが、
これから勉強してこの構文を十分理解できるようになりたいと
思います。

ご教示、誠に有難うございました。
374名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:02:31 ID:moSzhZBr
$_が分かりません。
説明を読むと、デフォルトの変数として、省略されている場合も
自動的に代入や出力されている特殊変数とあるのですが、たとえば
if ($_[0] eq 'bye') {
いきなりこんなのが出てきた場合、一体何をしてるんでしょうか。
自動的に配列を作って、0に何かが代入されている?

うかがうのに妥当なスレがないようだったので、こちらで尋ねました
よろしくお願いします。
375名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:05:32 ID:???
スクリプトの第一パラメータとか
サブルーチンの第一引数とか
376名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:07:43 ID:???
> スクリプトの第一パラメータとか
377名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:12:45 ID:???
>>374

@hoge = (1 ,2, 3);

$hoge[0] == 1

@_ = (1 ,2, 3);

$_[0] == 1

ok?
378374:2005/09/11(日) 23:22:07 ID:???
>375,>376,>377
レスありがとうございます。
>377の例、わかりやすかったです
特に個別に名前はつけてないけどこーゆー配列(変数)だよ、っていう事なんでしょうか。

もしかしてすごくアホな事聞いてるかもしれないんですが、さっきの
if ($_[0] eq 'bye')
コレ、いきなり出てきたんです。>377で言う@_ = (1 ,2, 3); みたいなのがなくて。
@_ = (1 ,2, 3); がないのに、一体何と比較してるんだろう???となってしまったんですが…
379名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:29:33 ID:???
>>378
サブルーチンの引数は、勝手に @_ に入ります。
というか、基本なんだからマニュアルか、本を読もうよ…。
380374:2005/09/11(日) 23:37:29 ID:???
>379
すみません。実は本読んでもよくわかりませんでした。
もうちょいスクリプトいじってみて、悩んでみます…
381名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:41:56 ID:???
>>380
その本、巻末に索引付いてませんか?
そこで、$_ と @_ を探しましょう。
382nobodyさん:2005/09/12(月) 17:57:25 ID:???
たとえば、
-----
$classname = 'bar'
return "foo::".$classname->new();
-----
みたいに、変数に入ってる値でクラスを呼び出すことはできないのでしょうか?
(この例だと、foo::barを呼び出したいです)
foo::??の??の部分を変数にして動的に変えたいですが、何かやり方はありますか?
383nobodyさん:2005/09/12(月) 18:25:32 ID:???
eval
384nobodyさん:2005/09/12(月) 20:53:06 ID:???
>>382
use strict; を使ってるなら

no strict 'refs';

使ってないなら

$a = 'aaa';
&{$a."::new"}();
385nobodyさん:2005/09/12(月) 20:54:01 ID:???
あら、上手くかけてなかった。

use strict; を使ってるなら

no strict 'refs';
$a = 'aaa';
&{$a."::new"}();

使ってないなら

$a = 'aaa';
&{$a."::new"}();
386nobodyさん:2005/09/12(月) 20:56:53 ID:???
strict使ってないなら
$obj = "foo::$classname"->new();
もできるんじゃないかな。
387nobodyさん:2005/09/12(月) 21:23:44 ID:???
>>386
おお、ほんとだ。
strict 使ってても、no strict 'refs' でOKみたい。
388nobodyさん:2005/09/12(月) 22:46:32 ID:Giee4nr4
CGI.pmでのテーブルタグの出力ってどうやればいいんですか?

print table(TR,(td("")));

この書き方だとエラーになるようなんですが
389nobodyさん:2005/09/13(火) 10:56:07 ID:???
>>387
no strictで制限を緩めるときはブロックに閉じ込めて必要最小限の
範囲だけにした方がいいよ。
390nobodyさん:2005/09/13(火) 11:31:37 ID:???
質問です。
ファイルを開いて処理する時に

open (FILE,"<$list");
while(<FILE>){
chomp;
my (undef,$addr,$svr,$uer,$pass) = split(/<>/,$_);
&get($addr,$svr,$usr,$pass);
}
close FILE;

と、

open (FILE,"<$list");
my @getlist = <FILE>;
close FILE;
foreach my $usrdata(@getlist){
chomp($usrdata);
my (undef,$addr,$svr,$uer,$pass) = split(/<>/,$usrdata);
&get($addr,$svr,$usr,$pass);
}

ってどちらが速いいですか?
会社の人は「whileよりforeachのほうが速い」って言うのですが、
何回ベンチ取ってもwhileのほうが1割近く速くなるんです。
私のベンチの取り方が問題?

読み込むファイルの大きさは1kb程度のものです。
391nobodyさん:2005/09/13(火) 12:15:30 ID:???
>>390
その例ならwhileの方が普通は早そうでベンチとも一致する。

my @getlist = <FILE>;

でファイル全体を一行ずつにばらした配列を作るのが余計な
手間になるからね。

ただ一般的には往々にして直観はあてにならないのできちんと
ベンチをとって評価するのが正道。
392nobodyさん:2005/09/13(火) 12:28:09 ID:???
なにこの初心者
393nobodyさん:2005/09/13(火) 14:15:39 ID:???
ファイルが巨大だったらメモリも食うし一括読み込みはあかん
394382:2005/09/13(火) 14:15:41 ID:???
384さん
386さん
うまくいきました。ありがとうございました。
395nobodyさん:2005/09/13(火) 14:32:09 ID:???
>>389
サンキュ。そこまで書いたほうが親切だったね。
396nobodyさん:2005/09/13(火) 20:13:08 ID:???
便乗して質問させてください。
掲示板CGIなどで、特定の投稿を編集をするとき、一括読み込みをしないでデータを書き換える方法はありますか?
397nobodyさん:2005/09/13(火) 21:19:34 ID:???
書き換え前後のサイズ(文字数)とかが同じなら可能。
398nobodyさん:2005/09/13(火) 23:40:10 ID:???
>>392
お前にもそういう時期があったろう
399390:2005/09/14(水) 00:52:53 ID:???
>>391
>>393
ありがとうございます。

会社の人が言うように、whileよりforeachのほうが速いケースってあるんだろうか・・・
と思う今日この頃。
400nobodyさん:2005/09/14(水) 01:35:33 ID:???
>>399
ファイルから逐一読み出す処理よりも、
変数から処理するほうが速いって意味だったとか。
401nobodyさん:2005/09/14(水) 23:20:56 ID:???
標準入力された画像データをPerlMagickで直接加工したいのですが・・・
use CGI;
use Image::Magick;
$cgi = new CGI;
$fh = $cgi->param('picFile');

$i = new Image::Magick;
$i->Read($fh); #これができない

print "Content-type: image/jpeg¥n¥n";
$i->Write('jpeg:-'); #何も出力されない

フォームで選択されたファイルをどうにかしてファイルハンドルとして
PerlMagickに読み込ませたいのですが、うまく行きません。

現在は標準入力のデータを一旦ファイルに書き出し、
それを読み込んで加工する方法を取っておりますが、明らかに非効率だと思うのです。
いい方法はございませんでしょうか。
402nobodyさん:2005/09/14(水) 23:24:25 ID:???
$fh = $cgi->param('picFile');
403401:2005/09/14(水) 23:57:54 ID:???
>$fh = $cgi->param('picFile');
$fhはファイルハンドルじゃないってことですか?
でも
read($fh, $buf, 1024);
という風にできるから・・・
404nobodyさん:2005/09/15(木) 01:10:00 ID:???
>>403
PerlMagickと組み合わせて使ったことはないのでよくわからんが、
ファイルハンドルがほしいのなら

$fh = $cgi->upload('picFile');

を使う方がいいんじゃないかと。(ただしCGIモジュール2.47以降)

詳しくはCGIモジュールのPODの「CREATING A FILE UPLOAD FIELD」を
をよく読むといいだろう。
405nobodyさん:2005/09/15(木) 13:41:48 ID:3HNHstci
ローマ字を平仮名になおしたいんですが
s/ba/ば/g;
s/bi/び/g;・・・・みたいに何十行もえんえん続けるようなのでなく、
もっと効率的に動いて効率的に書けるような方法ありますか?
406nobodyさん:2005/09/15(木) 14:12:50 ID:???
>>405
そおんなもんとっくに誰かが作ってるだろうと思い検索したらあったよ
ttp://pitecan.com/OpenPOBox/romakana/
407401:2005/09/15(木) 15:53:13 ID:???
>>404
uploadとは盲点でした。が、状況は変わらず・・・。
ファイルハンドルを渡す時は
$i->Read(¥*fh);
とするとリファレンスあったので、これも試してみました。

PerlMagickにこだわるあまりCGIの方が疎かになっているようなので、
色々可能性を模索したいと思います。
408nobodyさん:2005/09/15(木) 16:33:46 ID:???
>>407
ファイルハンドルのときは

$i->Read(file => $fh);

だと思うが。
409401:2005/09/15(木) 17:18:27 ID:???
>>408
あ、ほんとだ。リファレンスにも書いてあるし、何故見落としてたんだろう・・・orz
おかげさまでうまく行きました。ありがとうございました。
410nobodyさん:2005/09/16(金) 08:23:19 ID:0dogEF/n
すみませんすみません。
本当に申し訳ないです

知らない方がいらっしゃるのであれば申し訳ないのですがネットゲーム「罪と罰」のようなCGIを利用し、
複数のプレーヤーの様々な数値(ステータスなど)を参加者全体で共有するどういった内容で行なわれているのでしょうか?


ついでにもう一つの質問を。スレ違いな感はありますがどうか答えてやってください。
PerlとPHPが多くのCGIで利用されているようですが二種類の言語が存在するということは各々に得手不得手があるということですよね?
その得手不得手及び私が制作しようとしているCGIゲームではどちらが向いているのか、初心者ではどちらが学びやすいか教えてもらえるとかなり光栄です。
よろしくお願いします。

自分の質問…あまりにも馬鹿なのか基本的すぎるのか検索にすらHitしないんです…orz
411nobodyさん:2005/09/16(金) 08:31:10 ID:???
>>410
もう少しちゃんと調べような。
http://www24.big.or.jp/~obo/game/ore_/gild/
これはPerlで書かれてる模様。

2つ目の質問はスレ違いだが、これ以上他のスレに誤爆されても困るので答えておく。
まずCGIと言う形では向いていない。
罪と罰もそうだけど、このタイプの設置を禁止している鯖も多い。
そしてCGIにはRubyやPython、JAVAもあればCもある。
要約するとこうだ、半年ROMってろ。
412nobodyさん:2005/09/16(金) 08:32:08 ID:???
直リンスマソ。
半日ROMってくる
413nobodyさん:2005/09/16(金) 09:32:49 ID:???
>>412さん
う〜ん…
自分は船乗りなので海の上でできる趣味が無いかな?と思ったんですけどねぇ…。
本で勉強してからまた書き込みます。まずは罪と罰と同じPerlから購入してみようと思います。
オススメの書籍があるならばお教えください。
レス無くとも言われたとおりROMっているので気を悪くしないでください。
414413:2005/09/16(金) 10:03:47 ID:???
追記

私に出てきてほしい場合は(限りなくそんな場合無いとは思いますが…)乗船期間以外であれば「あの時のゲームCGI初心者」や「誤爆犯」など分かりやすく呼んでいただけると出てきます。
おそらく自分から出てくるのは仕事もあるので4ヵ月〜半年後になると思います。
415nobodyさん:2005/09/16(金) 11:06:01 ID:???
以上、罪と罰スクリプトの宣伝でした。
次の質問ドゾー
416nobodyさん:2005/09/16(金) 11:44:27 ID:???
php は perl ほどスクリプト書いてて楽しくないなー、て思った。

>>410
まあ初心者的には php のが楽かもね、と。
417413:2005/09/16(金) 21:00:27 ID:???
いきなり約束破ってすみません。お礼が言いたかったのと今日、本屋行って色々と探した時の疑問があったので見逃してください

>>416さん
レスありがとうございます。
PHPですか。HTMLと一緒に記述できる点が初心者向きということですか?

本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?
素人調べで悪いのですがUNIXと記述方法が似ていると言う事なのでUNIXを学べば良いのでしょうか?
でもUNIXってかなりレベルが高いような…
418nobodyさん:2005/09/16(金) 21:05:55 ID:???
>>417
>本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?

これはありえないと思われます。事実ならその本屋・・・品揃え悪すぎだと・・・
419nobodyさん:2005/09/16(金) 21:06:32 ID:???
>>417
それはお前んとこの本屋の品揃えが悪いだけ。
Amazonで検索汁。かなりたくさんある。
420nobodyさん:2005/09/16(金) 21:30:04 ID:???
うざいなぁ。
421nobodyさん:2005/09/16(金) 21:49:41 ID:???
>>417
Perl以外の言語についても聞きたいなら専用のスレに
行くといいよ。
422nobodyさん:2005/09/17(土) 00:01:30 ID:???
まあまあ。

>>417
php は関数が最初から腐るほど用意されてあるから、
perl みたいに自分で書いたりモジュール用意したりする手間が省けることが多いのだよ。
そこが perl の楽しいところでもあるんだけど、初心者には荷が重いかもとか。

結構Web上でも初心者から学べる解説サイトがいくつかいくらでもあるので、そういうの見てもいいかもね。
まあ、ここは perl コーティングの質問スレだから、これ以上はここではきかないでね。
423nobodyさん:2005/09/17(土) 00:24:53 ID:???
> php は関数が最初から腐るほど用意されてあるから、

そう?妄想なら日記に書いておいてよ。
424nobodyさん:2005/09/17(土) 01:50:33 ID:???
425nobodyさん:2005/09/17(土) 04:40:43 ID:???
<?php
$funcs = get_defined_functions();
print count($funcs["internal"]);
?>
このスクリプトで組み込み関数の数を調べられるわけだが

うちの環境(PHP4.4.0+mb_string)では
826という数字が出て来た。
426nobodyさん:2005/09/17(土) 07:33:55 ID:???
Perlスレで書くのもなんだが>>423が何を言いたいのかわからないので>>425を実行
php5.1.0b2
1084
腐るほどかどうかは不明だが妄想とはいえないだろ
427nobodyさん:2005/09/17(土) 07:58:14 ID:???
PHPマニュアルの関数一覧を見れば一発。

数えるのマンドクセ('A`)
428nobodyさん:2005/09/17(土) 08:32:46 ID:???
get_defined_functions();
こんな関数がある時点ですでに腐っている。
429nobodyさん:2005/09/17(土) 09:10:30 ID:???
よそ行ってやれよ
430nobodyさん:2005/09/17(土) 10:05:17 ID:???
PHPやだ〜Perlがいい〜
431nobodyさん:2005/09/17(土) 11:31:11 ID:???
>>428
ワロタw 確かにw
432nobodyさん:2005/09/17(土) 12:55:22 ID:???
>>1-431
URL見てわかるとおり、ここはphp板ですよ?
433nobodyさん:2005/09/17(土) 15:15:36 ID:???
ところで、perl には組み込み関数とやらはどのくらいあるの?

また、組み込み関数とやらにバグがあった場合、root 等の権限を
持たないユーザでは何も出来なくなるけど、そういう場合どうするの?
434nobodyさん:2005/09/17(土) 15:35:59 ID:9NJ0Gho0
連想配列に値をセットしていき、セットした順で
キーを抜き出したいのですが、これは無理なんでしょうか?

%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}

欲しい結果
aaa 3 ccc 2 bbb 1
435nobodyさん:2005/09/17(土) 15:43:14 ID:ceziuPle
質問。
biglobeでMIME::BASE64使うにはどうしたらいいの?
436nobodyさん:2005/09/17(土) 16:07:42 ID:Oc8EoCio
>>423
無理じゃない?キーの頭に値を入れてソートするとか
437nobodyさん:2005/09/17(土) 16:23:52 ID:???
>>434
ふつーに無理ではないかと。
438nobodyさん:2005/09/17(土) 16:41:27 ID:???
>>434
それができるモジュールがあったと思う。
モジュール名は失念。

>>435
MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の
ディレクトリに置き、

use lib qw(path/to/MIME::BASE64);

でOK。
439nobodyさん:2005/09/17(土) 16:44:02 ID:???
>>434
use Tie::Hash::Array;

tie my %hoge, 'Tie::Hash::Array';
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}
440nobodyさん:2005/09/17(土) 16:44:52 ID:???
>>438
> MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の

http://search.cpan.org/src/GAAS/MIME-Base64-3.05/
xs とかあるけど、どーやってコンパイルするんだろう。
441439:2005/09/17(土) 16:45:43 ID:???
ごめん、うまくいかない。
442nobodyさん:2005/09/17(土) 16:45:58 ID:???
>>439
tie しないといけないとは、まぬけなもじゅーるでつね。
443439:2005/09/17(土) 17:02:03 ID:???
>>442
いや、私に言われても困るわけだけど。

でもtieを使わない方法ってあるの?
444nobodyさん:2005/09/17(土) 17:04:08 ID:???
しらーん。

>>434 がどうして >>434 なような意味不明なことを考えたかだ。

@unko = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach (@hoge){
print "$_ ";
}
445nobodyさん:2005/09/17(土) 17:08:38 ID:???
446nobodyさん:2005/09/17(土) 17:10:31 ID:???
>>440
あと、biglobe 鯖に入ってるコンパイラを使えれば
コンパイルできるかも。
447nobodyさん:2005/09/17(土) 17:14:41 ID:???
>>445
へー。pure perl なのあったんでつね。

>>446
がんばってコンパイラの使い方を説明してあげてくれ。w
448439:2005/09/17(土) 17:15:38 ID:???
>>434
use Tie::Hash::Indexed;

tie my %hoge, 'Tie::Hash::Indexed';
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}

# 一応できたけど、このモジュールだったけか…。
449nobodyさん:2005/09/17(土) 17:19:12 ID:???
こんなことして何の役に立つのかという件について。
450nobodyさん:2005/09/17(土) 17:45:46 ID:???
>>448
知らなかったけど、調べて見たらそれっぽいね。
PHPは最初から順序付きハッシュなんだっけ?
451nobodyさん:2005/09/17(土) 17:55:00 ID:9NJ0Gho0
>>436-439
どうもありがとうございます。
用途は、、確かに配列でも代用できそうなんですけど、
キー指定して、値を引っ張るて事をしたく、
たまに、決まった順番でまとめて出力したかったからです。
452nobodyさん:2005/09/17(土) 18:08:16 ID:???
>>451
頭大丈夫?
453nobodyさん:2005/09/17(土) 18:09:57 ID:???
>>450
PHPは配列とハッシュ(連想配列)の区別がないから、そのはず。
(じゃないと、キュー/スタックとして使えなから。)

$hoge = array('aaa' => 3, 'ccc' => 2, 'bbb' => 1);
foreach($hoge as $key => $value){
echo "$key => $value ";
}

結果
aaa => 3 ccc => 2 bbb => 1
454nobodyさん:2005/09/17(土) 18:15:55 ID:???
>>452
ばっちり大丈夫ですよ。
少なくともおまえよか。
455nobodyさん:2005/09/17(土) 18:18:20 ID:???
2度と来るなよ
456nobodyさん:2005/09/17(土) 18:29:36 ID:???
おまえもなw
457nobodyさん:2005/09/17(土) 18:45:39 ID:???
回答があった後にこれだからなあ。後味の悪い厨房だ
458nobodyさん:2005/09/17(土) 18:47:37 ID:???
>>451
それだったら
@hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
こうやっといてから
%hogehash = @hoge;
って2つつくれば済むような。
459nobodyさん:2005/09/17(土) 18:52:47 ID:???
>>457
454は騙りだろ
そう思っとけ
460nobodyさん:2005/09/17(土) 18:53:10 ID:???
>>457
回答と煽りは別。
厨房に構うやつも厨房。おまえは厨房だって事。
461nobodyさん:2005/09/17(土) 19:00:26 ID:???
すごい…論理です。
462nobodyさん:2005/09/17(土) 20:19:55 ID:???
煽りに釣られる時点でクソです(><)
463nobodyさん:2005/09/17(土) 20:25:16 ID:???
クソ蝿見っけ^o^
464nobodyさん:2005/09/17(土) 21:02:52 ID:EwuItVJ4
>>434
疑似ハッシュって今ダメなんだっけ?

>>440
MIME::Base64ならローカルにコンパイルしてFTPでコピーしても動くよ。
465nobodyさん:2005/09/17(土) 21:16:29 ID:???
> MIME::Base64ならローカルにコンパイルしてFTPでコピーしても動くよ。

put 先の環境がわからない場合は、手が出せないと思うのだけど。頭大丈夫?
466nobodyさん:2005/09/18(日) 01:36:06 ID:???
不毛な煽りはやめようぜ。
やってるやつは1人か2人だと思うけど。

マジレスすると

>>452
そういうニーズがあって別に問題ないだろう。

>>465
もう少し知識をつけてから書き込みましょう。
467nobodyさん:2005/09/18(日) 02:17:25 ID:???
>>466
> もう少し知識をつけてから書き込みましょう。

何の知識だろう?説明して欲しいなら正直に言えばいいのに。

pure perl 版でない MIME::Base64 を動かす場合、xs をコンパイルしないとけない。
biglobe で動くようにバイナリを作らないといけないので、
> put 先の環境がわからない場合は、手が出せないと思うのだけど。頭大丈夫?
468nobodyさん:2005/09/18(日) 02:21:44 ID:???
>>466
> そういうニーズがあって別に問題ないだろう。

頭が大丈夫か否か確認しているだけで、問題であるとは言ってないのでは?
469nobodyさん:2005/09/18(日) 02:38:34 ID:???
>>468
頭大丈夫?
470nobodyさん:2005/09/18(日) 02:40:02 ID:???
おれの頭はだめぽ。
471nobodyさん:2005/09/18(日) 02:40:28 ID:???
小学生ですか?
472nobodyさん:2005/09/18(日) 02:42:27 ID:???
つまんね
473nobodyさん:2005/09/18(日) 02:44:47 ID:???
藻前らこんな夜中に何やってるんですか?
474nobodyさん:2005/09/18(日) 02:49:56 ID:???
頭大丈夫?
475nobodyさん:2005/09/18(日) 02:53:27 ID:???
おれの頭もだめぽ。
476nobodyさん:2005/09/18(日) 03:02:25 ID:5XfzNwGp
おまいの頭はガッ
477nobodyさん:2005/09/18(日) 03:03:29 ID:???
小学生ですか?
478nobodyさん:2005/09/18(日) 03:08:31 ID:???
つまんね
小学生とか2回もウザいし。
479nobodyさん:2005/09/18(日) 06:58:08 ID:???
>>464
擬似ハッシュは5.10.0以降無くなるから、お勧めしない。
perlrefのPseudo-hashes: Using an array as a hash、NOTE参照。
480nobodyさん:2005/09/18(日) 15:30:34 ID:tUMS1QFu
GDモジュールを使って、HTTPアップロードされた画像ファイルを指定したサイズに縮小して保存する
…ということをレンタルサーバーでやりたいんですが、あまり大きくない画像(試した画像は174x180ぐらい)では
うまくいくものの、でかい画像(試した画像は1201x1372)になると処理が途中で止まってしまうみたいです。(アップロード処理後で出力しているはずのHTMLが出力されない)
アップロードまではうまく行ってるようなのでアップロード後の処理のみですが、作ったスクリプトは以下のような感じです。原因も対応もさっぱりです。どうすればよいでしょうか?どなたか教えてください。

$icon_width = 100; # 幅を100に縮小
$icon_height = 100; # 高さを100に縮小

open(IMG, "アップロードされたファイル");
$sourceimg = newFromJpeg GD::Image(\*IMG);
($image_size_x, $image_size_y) = $sourceimg->getBounds();
close(IMG);

$newimg = new GD::Image($icon_width, $icon_height, 1);
$newimg->copyResized($sourceimg, 0, 0, 0, 0, $icon_width, $icon_height, $image_size_x, $image_size_y);

open(FILE, ">縮小後のファイル.jpg");
print FILE $newimg->jpeg();
close(FILE);
481nobodyさん:2005/09/18(日) 15:37:08 ID:???
>>480
それは、テスト環境とかでまともに動いているスクリプトでつか?
情報の出し惜しみはダメでつよ?
482nobodyさん:2005/09/18(日) 15:37:23 ID:???
レンサバの処理時間制限に引っかかってるんじゃないの?
ローカルで一度試してみ。
483480:2005/09/18(日) 16:03:16 ID:???
ローカルのテスト環境ですか…。なるほど作ってやってみようと思います。
とりあえず使ってるレンサバではシェルが使えるのでシェル上で
適当に画像を置いてやってみたら、ちゃんと縮小されました…
484nobodyさん:2005/09/18(日) 16:09:10 ID:???
>>483
なら、タイムアウト食らってるね。
その鯖、cron 使える?
485nobodyさん:2005/09/18(日) 16:21:18 ID:???
PerlでMySQLを利用しようとして、エラーで進まないのでご教授ください。
ローカルのテスト環境はWin2000とPerlは5.8.7です。

MySQLは無事にインストールが出来、動作も確認済みです。
Perlで呼び出す際の問題なのですが、use DBI;とすると、
Can't locate loadable object for module DBI in @INC (@INC contains: C:/usr/lib C
:/usr/site/lib .) at C:/usr/lib/DBI.pm line 254
というエラーが出てしまいます。
が、DBI.pmはあるべき場所にありますし、エラーの出る行数を見ても}
があるだけで、行き詰まっております。
486480:2005/09/18(日) 16:22:26 ID:???
>>484
which cronでパスが表示されるので入ってるみたいです。
ただ、恥ずかしい話ですが私は使ったことがないので使い方を知りません。
487nobodyさん:2005/09/18(日) 17:10:35 ID:???
>>486
ttp://www.coolbrain.net/cron.html

知らない事については、勉強すればいいと思う。
いろいろ試してみて理解不能だったら、また質問すると良いよ。
488nobodyさん:2005/09/18(日) 17:12:59 ID:???
>>485
DBD::MySQL とかは入ってる?
489480:2005/09/18(日) 17:18:21 ID:???
>>487
有り難うございますー 勉強してきます。

その他の回答してくださった皆さんも有り難うございました。
490485:2005/09/18(日) 17:29:40 ID:???
>>488
libの中に DBD/mysql.pm があります
491nobodyさん:2005/09/18(日) 17:30:34 ID:???
>>490
それって、単体では動かないのだけど、バイナリとかは入ってる?
492485:2005/09/18(日) 17:39:42 ID:???
CPANから落としてきたものを解凍して丸々放り込んでます。
493nobodyさん:2005/09/18(日) 17:42:06 ID:???
494485:2005/09/18(日) 17:57:30 ID:???
ppmがエラー出すので、代替方法のつもりで手動インストールをやって行き詰まってました。

Perlモジュールスレがあったみたいなので、そちらで勉強してきます。
495nobodyさん:2005/09/19(月) 19:07:11 ID:beipsuRn
require で宣言した変数値が、取れたり取れなかったりで困っております。
共通の設定定義ファイルを読み込み、それがシステムで使いまわされる感じを
考えています。

*パス構成*

cgi-bin/
| settings.pl   … (x)変数に設定を代入している、定義ファイル
-log
| |counter.cgi  … (a)アクセスカウンター ( settings.pl で設定した変数が生きている )
|
-bbs
 .|index.cgi    … (b)掲示板トップ ( settings.pl で設定した変数が消えている )

(a)にて、require '../settings.pl' を行うと、(x)で宣言した変数は生きているのですが
(b)にて、require '../settings.pl' を行っても、(x)の宣言が反映されません。

どなたか、お知恵をお貸しいただければ幸いです。
496nobodyさん:2005/09/19(月) 21:04:41 ID:???
>>495
それだけだと
どこかで変数が干渉してんじゃない?
って事しか・・・
497nobodyさん:2005/09/19(月) 21:36:55 ID:???
>>495

問題が発生する最も短いソースを作ってみることが大切だね。
そうすると、質問しなくても自分で解る場合も多い。

一番ありそうなのは、変数のスコープが違っているということだろうけど。
498nobodyさん:2005/09/19(月) 21:45:40 ID:uGVzhqRv
TXTファイルを、何行目か指定して読み込む方法がありましたら、教えてください。
499nobodyさん:2005/09/19(月) 21:49:45 ID:???
>>498
全然試してないけど
my $file = 'hoge.txt';
my $line = 12;

open(FH, $file) || die "$file : $!\n";
while (<FH>) {
next if ($. < $line || $line < $.); # skip
print $_; # 目的の行
}
close(FH);
500495:2005/09/19(月) 21:55:20 ID:???
>>496-497
レスありがとうございます。
二重require(use) して、干渉しているようです。??(?Д?)

cgi-bin/
| settings.pl   … (x)変数に設定を代入している、定義ファイル
-log
| |counter.cgi  … (a)アクセスカウンター
|
-bbs
 .|index.cgi    … (b)掲示板トップ
 .|BBSthread.pm … (c)スレッド制御モジュール


(b)の index.cgi では、 use BBSthread.pm を宣言していて、
さらに (c) の BBSthread.pm で require '../settings.pl' 宣言していました。

試験的に use BBSthread をコメント化したところ、
settings.pl で設定した値が取得できました。

counter.cgi ではこのような二重require を行っていません。
これが原因っぽいです。
今回は、二重require されないようコーディングすることによって回避します。

ありがとうございました。
501nobodyさん:2005/09/19(月) 22:03:07 ID:???
あーあ、解決に必要な情報も示さず自己解決かよ。

質問の上手い下手だけでその人の素質が分かりそうな気がする。
502nobodyさん:2005/09/20(火) 00:12:02 ID:???
>>500
同じファイルに対してrequire を二重に実行すると、2回目は読み込まれない。
BBSthread.pm とcounter.cgi とで変数のスコープが違っているなら、
先にrequire した方にのみ、settings.plの内容が反映されることになる。

手っ取り早く解決するなら、require を eval に変更すればいいのだが、
このような使い方は感心しないね。
settings.pl の内容を、システムに共通な定数のリストを返す「関数」
にして、各モジュールはこの関数を呼び出すのが常道だと思われるが。
503nobodyさん:2005/09/20(火) 02:27:35 ID:jMPX6Q/f
データベースとperlでデータをCSVに書き出すプログラムを書いています。

SQLで取得したデータをHTMLでテーブルにして表示しているのですが、
よくフリーメールであるような各行にチェックボックスがあって、
それにチェックを入れたデータだけCSVに書き出すといったものを作りたいのですが、
ロジック的にはどういったものになるのでしょうか??チェックボックスでCGIに渡せるパラメータは
○○=on とかってなりますよね。どうやって、データを識別したらよいでしょうか???
504nobodyさん:2005/09/20(火) 02:41:10 ID:???
>>503
○○=on になっているものだけ取り出せばOKでは?
505nobodyさん:2005/09/20(火) 03:50:56 ID:???
>>503
決してバカにするつもりで聞くわけじゃないけど、今までにCGIのプログラムを
書いて、ブラウザからフォームのデータを受け取ってみたことある?

いや、もしかして、そのレベルでつまづいているんじゃないかと思ったんで。
506nobodyさん:2005/09/20(火) 04:20:05 ID:???
>>505
そういうひねくれた質問の仕方すると何かいいことある?

いや、もしかして、初心者いじって喜んでるんじゃないかと思ったんで。
507nobodyさん:2005/09/20(火) 06:54:46 ID:???
データベース使っててCSVに書き出すプログラムって・・
508nobodyさん:2005/09/20(火) 07:07:20 ID:???
データ作ってストリームで吐き出すか何かするだけじゃないのか
509nobodyさん:2005/09/20(火) 07:19:44 ID:???
>>503
<input> には name と value に任意の文字列が指定できる。
チェックボックスの場合、チェックがオンになっているときだけ
name=value という形式の文字列が送られてくる。
従って name が同じでも value が違えば識別できる。
順序は保証されないので、順序に依存してはいけない。
510nobodyさん:2005/09/20(火) 08:49:48 ID:???
>>503
試してみてから質問してもらえるか。

> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
511505:2005/09/20(火) 11:54:43 ID:???
>>506
503の質問って、別の板にもあった。そこでWebProgに行けって言われたから
ここに来たのだろうと思うんだが、質問内容に何も改善がなく、コピペしている
だけなんで、あいかわらず質問者の意図もレベルも分からなかいから、
どこまで分かってる? と、確認しているだけなんだが・・・

何を試したかとか、どこまで分かっているか、とか、情報が一切ないのは困る。
512nobodyさん:2005/09/20(火) 18:16:45 ID:???
質問です。
CGI.pmを使ってフォームの値を受け取ろうとしてます。
-----
<form action="hoge.cgi?getval=ggg" method="post">
<input type="hidden" name="postval" value="ppp">
<input type="submit">
</form>
-----
こんな感じのフォームの値を受け取ろうとしているんですが、
GETの引数がCGI.pmに渡されません(この場合getvalが渡されない)
これは仕様でしょうか?何か方法があったりしますか?
513nobodyさん:2005/09/20(火) 18:27:59 ID:???
merhodでpost指定してるから
514nobodyさん:2005/09/20(火) 18:28:07 ID:???
>>512
> <form action="hoge.cgi?getval=ggg" method="post">

自分で method="post" て書いてるじゃないですか…。GET引数は渡りません。
hiddenで渡してください。
515512:2005/09/20(火) 18:42:00 ID:???
>513
>514
故意にPOSTを指定してるんです。
actionに「acton=hoge.cgi?getval=ggg」としてるんで、GETの値も渡るかなと思ったんですが、
ダメなんですかね?
そういうものなんでしょうか?
516nobodyさん:2005/09/20(火) 18:53:02 ID:???
>>515
それでは、なぜGETとPOSTがあるのかを説明してください。
また、メソッドになぜ両方指定するものがないのかも考えてください。
517nobodyさん:2005/09/20(火) 18:53:22 ID:???
>>515
(undef, $getval) = split /=/, $ENV{QUERY_STRING};

でOK。
518nobodyさん:2005/09/20(火) 18:56:07 ID:???
>>516
いやいや、量の多い投稿をしたいが、同時に query により
URI も用意したい
という用途はあるぞ。
519nobodyさん:2005/09/20(火) 19:06:19 ID:???
> CGI.pmを使ってフォームの値を受け取ろうとしてます。
520512:2005/09/20(火) 19:12:18 ID:???
>516
えっと、分かりません(汗
なんでなんでしょう?
私の中では、ブックマーク可能なページはGETにしとく、、くらいの認識しかないです。
あと、URL直接叩かれるとまずいページはPOST、、とか。そんな認識でごめんなさい。

>517
CGI.pmに頼らず、自分でパースしなくてはならない、ということですね。
これならできそうです。

で、
POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?
php書くときは結構普通にやってたけど、これって考えを改めたほうが良いですか?
521nobodyさん:2005/09/20(火) 19:15:09 ID:???
>>520
> POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?
お行儀は良くない程度と思っておけばいいんじゃない?
CGI.pmはmethodを見るから受け取れなかっただけ
522nobodyさん:2005/09/20(火) 19:22:09 ID:???
>>520
> POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?

問題ないと思うよ。
おれもよく使ってる。
523nobodyさん:2005/09/20(火) 21:01:01 ID:???
絵文字除去ルーチンを各所サイトを参考に作ったのですが、
もしも下記に間違い等ございましたらご教示いただきたい
次第です。
宜しくお願いいたします。


sub remove_emoji{
my $str = $_[0];

# i-mode, EZweb
my $sjis = '[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
my $emoji = '[\xF8\xF9][\x40-\x7E\x80-\xFC]';
$str =~ s/\G((?:$sjis)*)(?:$emoji)/$1/go;

# vodafone
$str =~ s/\x1B\$[\x21-\x7A]+\x0F//g;

return $str;
}
524nobodyさん:2005/09/20(火) 22:01:11 ID:???
>>523
試してみて不具合がでたら聞きに来い
525nobodyさん:2005/09/20(火) 22:08:21 ID:???
>>523
人を Lint 代わりに使わないでくれ
526nobodyさん:2005/09/20(火) 22:23:57 ID:???
>>524-525
不愉快な思いをさせてしまい、本当に申し訳ありませんでした。
今のところ不具合はないのですが、もしもアドバイス等いただ
ければと思い書かせていただいた次第です。

悪気はありませんのでお許しください。
すみませんでした。
527nobodyさん:2005/09/20(火) 22:29:15 ID:???
>>520
CGIモジュールではPOSTメソッドのときにurlのquery stringで渡した
パラメタはurl_paramっていう別のインタフェースでとるようになって
いるのよ。詳しくはCGIモジュールのマニュアル嫁。特にMIXING POST
AND URL PARAMETERSという見出しのところ。

528512:2005/09/21(水) 00:16:24 ID:???
>521 >522
なるほど、安心しました。

>527
ごめんなさい。おもいっきり書いてましたね。
どうもありがとうございます。ものすごく助かりました。
精進します。
529nobodyさん:2005/09/21(水) 02:03:43 ID:???
このスレって、Lint 代わりに使ってもいい?
530nobodyさん:2005/09/21(水) 11:00:47 ID:???
531nobodyさん:2005/09/21(水) 11:41:12 ID:AdBzR2Q9
すいません
perlで作成したcgiの質問があります。

HTML側で
<input type=file name="aaa">
<input type=file name="bbb">
とファイルを指定して
perlのcgi側で受け取りたいのですが
やり方がわかりません。

色々ネット上を調べたり「とほほ」を見ていたけど
二つ以上ファイルを受け取る方法がわかりません。

なにか情報をいただけますと幸いです。
532nobodyさん:2005/09/21(水) 13:00:42 ID:???
>>531
アップロード以前に、GETやPOSTの受け取り方分かってるの?
まだなら先にそっちから勉強してくれ。
533531:2005/09/21(水) 13:22:54 ID:AdBzR2Q9
う、、、大変申し訳ありません。
今の所
use CGI;
my $cgi = new CGI;
my $comment = $cgi->param('comment');
上記のようにして取得しています。

だたファイルの場合はどうすれば取得できるのか不明だったため
質問させていただきました。
534nobodyさん:2005/09/21(水) 13:51:44 ID:???
送信側は ENCTYPE="multipart/form-data" になってる?
これが原因じゃなかったら他の回答者のレスに期待してくれ。
535531:2005/09/21(水) 15:03:05 ID:AdBzR2Q9
送信側は↓のようにしているんでなってます、、、
<FORM METHOD=POST ENCTYPE="multipart/form-data" ACTION="test02.cgi">
<INPUT TYPE=file NAME="AAA"><BR>
<INPUT TYPE=file NAME="BBB"><BR>
<INPUT TYPE=submit VALUE="送信">
うーむ 助けて偉い人ー
536nobodyさん:2005/09/21(水) 15:37:57 ID:???
>>531
1つも2つも同じことを繰り返すだけだろ
537531:2005/09/21(水) 15:56:07 ID:AdBzR2Q9
えーっと
INPUT TYPE=file
のデータの取得方法が分からないのです、、、

説明不足で申し訳ありません
538531:2005/09/21(水) 15:58:18 ID:AdBzR2Q9
(追記)
ひとつだけだったら
http://web.archive.org/web/20010210200144/wakusei.cplaza.ne.jp/twn/cgi-bin/wwwupl2.txt
で取れるとわかったのですが。
539nobodyさん:2005/09/21(水) 16:40:09 ID:???
>>531
ヒント:>>403
540nobodyさん:2005/09/21(水) 17:10:37 ID:???
>>538
うへ、スクラッチで書いてるのか。悪いことは言わないから
CGIモジュール使うことをオススメするね。
541531:2005/09/21(水) 17:13:23 ID:AdBzR2Q9
はいー
えーっとそのCGIモジュールを使用した際の
取得方法をお教えいただきたいのです。

わがままなのは十分承知しておりますが
ヒントではなくズバリッお教えいただけますと幸いです。
542nobodyさん:2005/09/21(水) 17:21:41 ID:???
>>541
CGIモジュールの使い方をどうやって調べるか?
下記の順序でお試しください。

1.マニュアルを読む
2.和訳がないかググる
3.分かりやすく説明したサイトがないかググる
4.使っている他のスクリプトがないかググる
5.開き直ってにちゃんねるで聞く

543531:2005/09/21(水) 17:36:51 ID:AdBzR2Q9
ぐぐりまくって以下のようにし解決しました。
use CGI;
my $buffer;
my $query = CGI->new;
my $file = $query->param('BBB');
#my $file_name = ($file =~ /([^\\\/:]+)$/) ? $1 : 'uploadedd.bin';
my $file_name = 'aaa.jpg';
open(OUT, ">$file_name") or die(qq(Can't open "$file_name".));
binmode OUT;
while (read($file, $buffer, 1024)) {
print OUT $buffer;
}
close OUT;

どうもお騒がせいたしましたっ
544nobodyさん:2005/09/21(水) 22:30:20 ID:???
1行例書いてあげればいいだけなのに、不親切だなあ。 いいけど。
545nobodyさん:2005/09/21(水) 23:07:53 ID:???
不親切だなぁとか書かれて親切になったスレでもあるわけ?いいけど。
546nobodyさん:2005/09/22(木) 02:02:03 ID:???
言い出しっぺの法則
547nobodyさん:2005/09/22(木) 05:13:05 ID:???
>>544
自分は書いてあげる気はないけど、他人には書けばいいのにと言うわけね。
548nobodyさん:2005/09/22(木) 09:00:24 ID:???
もう自己解決したみただしいいじゃないか
549nobodyさん:2005/09/22(木) 10:10:21 ID:???
自己解決しました
550nobodyさん:2005/09/22(木) 17:44:54 ID:???
自己発電しました
551nobodyさん:2005/09/22(木) 17:46:12 ID:???
自己誘電しました
552nobodyさん:2005/09/22(木) 18:00:03 ID:???
自己陶酔しました
553nobodyさん:2005/09/22(木) 18:34:37 ID:???
自己破産しました
554nobodyさん:2005/09/22(木) 19:49:05 ID:???
自己弁護しました
555nobodyさん:2005/09/22(木) 19:57:59 ID:???
各ソースに共通で使える定数を用意したくて、以下の3つのソースを用意しました。
↓test.pl
-----
#!/usr/bin/perl
use strict;
use const; # この行をコメントアウトすると動く
use func;
my $obj = func->new();
$obj->print_var();
-----
↓func.pm
-----
package func;
use const;
sub new() {
my $class = shift;
my $self = {@_};
bless $self, $class;
}
sub print_var() {
printf('[%s]', FOO);
}
1;
-----
↓const.pm
-----
use constant FOO => 'aaa';
1;
-----
tesp.plを実行しても、const.pmの中のFOOの値が表示されずに、そのまま"[FOO]"が表示されます。
でも、test.plの中の「use const;」をコメントアウトすると、きちんと"[aaa]"が表示されます。
各ページで共通の定数を用意したいときは、違う方法が必要なのでしょうか?
556nobodyさん:2005/09/22(木) 20:19:01 ID:??? BE:114072645-
Perl5.8以前のサーバー環境で使っていたCGIが
Perl5.8以降のサーバーで動作しなくなったのですが
使えなくなった関数などがあるのでしょうか?
わかる方いましたら教えてください。
557nobodyさん:2005/09/22(木) 20:37:31 ID:???
適当だけど、内部で扱うコードがutf-8になったぐらいしか
558nobodyさん:2005/09/22(木) 20:45:04 ID:???
>>556
問題が再現する最小のソースを書くべし。
書く過程で解決することも多々。
559nobodyさん:2005/09/22(木) 20:56:13 ID:???
>>555
そのやり方ではだめ。const.pmが最初にuseされるときにカレントの
パッケージでFOOが定義されて、それ以後のuseでは既に読み込まれている
ので無視されている。test.plのuseをコメントアウトすると動くのは
それによってfunc.pmでのuseが最初になるからだ。

で、こういう用途には定数をexportするモジュールにするのが普通。
perlmod読んでパッケージとモジュールについて勉強するのがいいだろう。
560nobodyさん:2005/09/22(木) 21:04:17 ID:???
Perl5.8以前のサーバーとPerl5.8以降のサーバーってまったく別の鯖かな?
なら関数とかいうんじゃなくて鯖独自の問題のような希ガス
561556:2005/09/22(木) 21:10:27 ID:??? BE:199626757-
CGIゲームなのですが同じログが何個も何個も表示されます。

sub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];

$GFyear++;
}

ここらへんが誤動作してそうです・・・。
562556:2005/09/22(木) 21:11:57 ID:??? BE:205330166-
CGIゲームなのですが同じログが何個も何個も表示されます。

sub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];

$GFyear++;
}

ここらへんが誤動作してそうです・・・。
563nobodyさん:2005/09/22(木) 21:13:13 ID:???
>>556
perl58delta
564nobodyさん:2005/09/22(木) 21:15:48 ID:???
>>561
そんな基本的なことしかしてないコードの動作が
かわるとはまず思えないので、問題はその範囲
にはないな。
565nobodyさん:2005/09/22(木) 22:08:46 ID:???
>>561-562
> 同じログが何個も何個も表示されます。

何個も書いているのだと思われ。
566556:2005/09/22(木) 22:30:32 ID:??? BE:239551676-
>>560
まったく別なんですが3つのサーバーで試してずっと前から使ってた1つ目のサーバーは大丈夫で
2つ目、3つ目の新しいサーバーが同じようなバグが出て使い物にならなかったので
新しい仕様だから使えないのではないかと思いました。
567nobodyさん:2005/09/22(木) 22:54:51 ID:???
エラーメッセージを書いてくれ
568556:2005/09/22(木) 22:58:18 ID:??? BE:279476977-
>>567
エラーメッセージは出ません。
まったく同じスクリプトをまったく同じ手順で設置しているんですが
正常にゲームができるサーバーと、ゲーム開始直後に
同じログがずらりと並んでゲームができなくなるサーバーがあります。
569nobodyさん:2005/09/22(木) 23:15:47 ID:???
それしか情報がないんじゃエスパー回答者のお出ましを
願うしかないような希ガス。
570nobodyさん:2005/09/22(木) 23:28:38 ID:???
>>556
ソース晒せないならこの話題は終わり。
571nobodyさん:2005/09/23(金) 00:46:02 ID:???
>>556
ログってあんたが勝手に考えた仕組みだろう。
そのログを取る部分、そしてログの意味とか晒してもらわにゃ何とも言えん。

ていうか、変数の流れを追えばちゃんとエラーを特定できるはずだから。
572nobodyさん:2005/09/23(金) 01:02:22 ID:???
>>556
ブラックボックスを提示して「動きが変です、助けて下さい」って言って、
まともな回答が帰ってくると思うか?
573エスパー回答者:2005/09/23(金) 01:51:44 ID:???
>>561
FORTRAN に対する郷愁が無いのなら、@Newsは0番目の要素から使うようにすべきだろう。
unshift @News, $new_element;
splice @News, $NewsMax-1;
$GFyear++;

とすれば、誤動作していたサブルーチンNewsChange を削除することができる。
これで問題は全て解決する(......はずだよな)。
574nobodyさん:2005/09/23(金) 10:48:25 ID:???
CGIゲームは専鯖か自鯖でやれよ
575nobodyさん:2005/09/23(金) 11:41:48 ID:???
そこでAjaxですよ。

とか、言ってみたりする。
576nobodyさん:2005/09/23(金) 11:47:00 ID:???
Ajax の方が負荷かけるのは簡単だけどな。
JavaScript にしとけ。
577nobodyさん:2005/09/23(金) 12:07:02 ID:???
Flashも、通信クライアントになれるんだっけ?
578nobodyさん:2005/09/23(金) 15:02:27 ID:???
>>577
なれるけどスレ違い。
579nobodyさん:2005/09/23(金) 16:12:52 ID:NELxQvyQ
http://psmk2.net/


ここのアクセスカウンターって改造されてね?
580nobodyさん:2005/09/23(金) 16:20:20 ID:???
スレ違い
581nobodyさん:2005/09/23(金) 16:35:54 ID:???
>>579
全然改造されて無いじゃん
氏ね
582nobodyさん:2005/09/23(金) 20:49:12 ID:???
ageてるんだから宣伝だろ。
583nobodyさん:2005/09/23(金) 21:32:21 ID:???
お気に入りにいれてやろうかゴラァ!!
584nobodyさん:2005/09/26(月) 01:11:42 ID:???
質問です。
Perl内で、他のURLにあるデータを参照することはできますか?
具体的には、
open(WORK,"http://www.hogehoge.net/foo/baa.txt");
みたいな事です。
585nobodyさん:2005/09/26(月) 01:32:11 ID:???
>>584
LWP
586nobodyさん:2005/09/26(月) 01:47:23 ID:???
>>584
実在するドメインを例示に使うなとあれほど(ry
587nobodyさん:2005/09/26(月) 02:22:09 ID:???
ちゃんと例示用に予約された example.jp とか、 example.com があるのに、
なぜゆえ・・・
588nobodyさん:2005/09/26(月) 02:59:24 ID:???
そこに、ドメインがあるからさ、フフフ・・・ ><
589nobodyさん:2005/09/26(月) 04:43:37 ID:???
hogeとfugaも日本人用に予約しておけよな
590nobodyさん:2005/09/26(月) 04:49:01 ID:???
>>589
藻前が買ってボランティア汁。
591nobodyさん:2005/09/26(月) 17:53:48 ID:???
プログラム板で聞いたら板違いと、言われたので再度ここで質問させてください。

チェックボックスでデータを受け取って
HTMLの確認画面に反映させるプログラムを作っているのですが
行き詰まりました。

例えば、course1,course2,course3とあってcourse1とcourse3がチェックされたら
course2のところが空白で反映されます。

ex.)HTML出力画面
course1

course3

こんな感じになります。

この空白を詰めて

course1
course3
みたいな風に出力したいのですがどのようにすれば良いでしょうか?
592591:2005/09/26(月) 17:54:19 ID:???
ちなみにソースはこんな感じです。汚くてごめん・・。

if($FORM{'course1'} ne "on"){
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n";
print "$HTML{'course1'}\n";
print "<INPUT TYPE=\"hidden\" NAME=\"course1\" VALUE=\"$FORM{'course1'}\">\n";
print "</TD></TR>\n";
}


if($FORM{'course2'} ne "on"){
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\"></TH><TD>\n";
print "$HTML{'course2'}\n";
print "<br>";
print "<INPUT TYPE=\"hidden\" NAME=\"course2\" VALUE=\"$FORM{'course2'}\">\n";
print "</TD></TR>\n";
}
593nobodyさん:2005/09/26(月) 18:03:42 ID:???
>>591
>>592も質問するには情報足らないので、エスパーのフリをしてみる。
foerach ('course1','course2','course3') {
if ($FORM{$_} eq "on") { next; }
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n";
print "$HTML{$_}\n";
print "<INPUT TYPE=\"hidden\" NAME=\"$_\" VALUE=\"$FORM{$_}\">\n";
print "</TD></TR>\n";
}
これでまず問題点を切り分けてくれ。
594nobodyさん:2005/09/26(月) 18:16:11 ID:???
>>591
思うにそれは空白をつめて表示させるためにはどのようなHTMLであるべきか
という問題であって、それさえわかってしまえばその通り出力するプログラムを
書けばいいだけだから、まずHTMLに詳しい人がいるところで質問するのが
スジってもんじゃないだろうか。ここにもいるかもしれないけどさ。

595591:2005/09/26(月) 18:19:54 ID:???
>>593
ありがとうございます、無事に動きましたw
エスパーですね!
すみません、情報不足で・・。>>594さんが書いた通りです。

>>594
すみませんでした。 orz
596nobodyさん:2005/09/26(月) 18:27:36 ID:???
どうやらエスパーになれたらしい。
変数以外で同じ文字を出力する場合とかは、とりあえずループにかければ問題点は見つかる。
コピペしたつもりでも、うっかりで変わってたりするから。
597591:2005/09/26(月) 18:30:46 ID:???
>>596
勉強になりました。ありがとうございました。
598nobodyさん:2005/09/26(月) 21:18:44 ID:Q7jBJFo3
$FORM{$_} eq "on" and print <<"END" foerach qw( course1 course2 course3 );
<TR>
 <TH ALIGN="right" VALIGN="top">希望コース:</TH>
 <TD>
  $HTML{$_}
  <INPUT TYPE="hidden" NAME="$_" VALUE="$FORM{$_}">
 </TD>
</TR>
END

エスケープとかprint連記とかキモイからこれぐらいスッキリしてもらえる?

いや、オナニーだけどさ。
599nobodyさん:2005/09/26(月) 21:48:52 ID:fXbmUf3O
foerach
600nobodyさん:2005/09/26(月) 22:27:10 ID:???

ヒントをいただきたく思っております。

cgiで書き出すhtmlページ page1 → page2 に進んで、 page1に戻ったときに 「あんたpage2に進んだからもう戻れないよ!!」

ってやりたいのですが、

集めた情報では cookieでセッション管理して、page1でcookie → page2でcookieになんか値を持たせる。
でもってpage1に戻ったら値違うからダメよ!みたいなことをしろ!! 

とあったのですが、どんなソースなのかさっぱりです。。

どなたか道しるべいただけませんでしょうか?所謂ブラウザの戻る制御みたいなことなのですが、
phpではなく perlでやりたいです。


野暮な質問ですいません。何卒宜しくお願いいたします。
601nobodyさん:2005/09/26(月) 22:38:13 ID:???
>>600
その集めた情報の意味がわからないなら、ここで聞いても意味がないと思います。
クッキーの保存と呼び出しの勉強をしてきてください。
ついでに、ブラウザの戻る進むでは意味がないのであしからず。
602nobodyさん:2005/09/26(月) 22:44:25 ID:???
>>601
ブラウザのバックはjavascriptで消せる。

Cookieの送り方が分からないんじゃどうしようも無いがな。
603nobodyさん:2005/09/26(月) 23:05:12 ID:???
604nobodyさん:2005/09/26(月) 23:07:24 ID:???
>>601さん
レスありがとうございます。

最近cookieの勉強を始めたばかりなので、ほんとに基本しか知らないのですが、
この場合は、NAME= 値(たとえば1)、 print "path=", "/page2 ";  でpage2に値を持たせて。。
戻ったときにエラーを出す方法がよくわからないのですが。。。勉強不足ですいません。

605nobodyさん:2005/09/26(月) 23:29:13 ID:???
>>602
ブラウザはIEだけじゃないですよ。
>>604
検索の方法から勉強してください。
606nobodyさん:2005/09/26(月) 23:45:44 ID:???
>>604
いやいや、俺始めてクッキーを知った日に応用は出来なかったけどそれぐらいの事は出来たが・・・・

まぁ>>601氏の言うようにブラウザの戻るはキャッシュがほとんどなので(略
607nobodyさん:2005/09/27(火) 09:58:18 ID:???
608nobodyさん:2005/09/27(火) 23:34:13 ID:1E14u9Km
$sql =~ s/(\\|\'|\%|\,)/\\$1/g;

これがおかしな挙動を見せるのでググってみたところ、
%は%%でエスケープすることを学習したのですが、

$sql =~ s/(\\|\'|%%|\,)/\\$1/g;
こうした場合、「%」1つの入力であれば正常にエスケープされるように
なってのですが、「%%」と入力するとなぜか\\%%になってしまいます。

ご教示いただけますと非常に助かります。
609nobodyさん:2005/09/27(火) 23:41:28 ID:???
おまいがしたいのはこれではないのか?
$sql =~ tr/\'%,/\\\'\%\,/;

それと安易にエスケープするな\Q使え
610nobodyさん:2005/09/27(火) 23:56:08 ID:???
>>609
早速のご返答有難うございます。

しかし、「\\\\\'''''%%%%%」と入力したところ、
「\\\\\\\\\\'''''%%%%%」となりました。

前の\のみエスケープされているみたいです。
611nobodyさん:2005/09/28(水) 00:02:13 ID:???
別の方法も試してみましたが、だめでした。

$sql =~ s/\Q(\\|'|%|,)\E/\\$1/g;

これですと
「\\\\\'''''%%%%%」は「\\'''%%%%%,,,,,」になってしまいました。。
612nobodyさん:2005/09/28(水) 00:07:50 ID:???
何をしたいんだっけ?
613584:2005/09/28(水) 00:12:25 ID:???
ありがとうございます。
LWP・・・。

プロレス団体みたいですね。

614nobodyさん:2005/09/28(水) 00:14:48 ID:???
lib-www-perl すごいプロレス団体でつね。
615nobodyさん:2005/09/28(水) 00:46:08 ID:???
解決しました。

よくわかりませんが、
$sql =~ s/(\\|\'|\\%|\,)/\\$1/g;
にすることによって解決しました。

お騒がせしました。
616nobodyさん:2005/09/28(水) 00:47:05 ID:???
Larry Wall Prowrestling
617nobodyさん:2005/09/28(水) 01:02:47 ID:MTwQib0M
Perlで数学的な演算をやろうと思っているのですが、
15桁(1÷3の場合は小数第14位)までしか計算出来ないようです。

例えば、1 / 3 を計算すると、
0.33333333333333 となってしまいます。


例えば、1 / 3 の結果を 100桁で出力させたい場合は、
小数第5000位で割り切れる割り算の答えを正確に (= 小数弟5000位まで) 出力したい場合には
どのようなコードにすれば良いでしょうか?

ご教示お願いします。
618nobodyさん:2005/09/28(水) 01:03:41 ID:???
誤) 例えば、1 / 3 の結果を 100桁で出力させたい場合は、
正) 例えば、1 / 3 の結果を 100桁で出力させたい場合や、


間違えました。申し訳ありません。
619nobodyさん:2005/09/28(水) 01:34:06 ID:???
>>617

Math::BigFloat
620nobodyさん:2005/09/28(水) 08:23:08 ID:???
>>617
use bignum;

bignum->div_scale(100);
my $x = 1.0;
print $x/3, "\n";

bignum->div_scale(5000);
my $y = 1.0;
print $y/7, "\n";
621617:2005/09/28(水) 17:07:26 ID:???
>>619-620
ご教示ありがとうございます。
実際にやってみたら正常に動作しました。

div_scale(); で無限に計算を続けるようになるとおもったら
数百桁までしか計算されていないようなので、
div_scale(1000000000000000000) みたいに馬鹿でかい数をいれたら
期待通りに動作しました。
622nobodyさん:2005/09/29(木) 09:36:51 ID:???
 <html>
 <head><title>test</title></head>
 <body>test</body>
 </html>
上のようなHTMLファイルを読み込んで、
gzip圧縮してブラウザにかえすCGIを作っています。

gzip圧縮する部分はネットの記事を参考に出来たのですが
HTMLを読み込んでCGIに出力させるにはどうすればよいでしょうか。
623nobodyさん:2005/09/29(木) 09:53:31 ID:???
>>622
そういうことしたいときは、mod_gzip ってものを使うんですが。
624nobodyさん:2005/09/29(木) 10:05:50 ID:???
>>622
質問の意味がよく分からんが、

print <<END;

<html>
<head><title>test</title></head>
<body>test</body>
</html>
END

でいいのでは?
625nobodyさん:2005/09/29(木) 10:16:37 ID:???
sub fuck {
local $/;
open(F, "fuckyou.html") || die "why don't you fuck?"
my $buf = <F>;
close(F);
return $buf;
}

こーゆーことをしたいとかじゃなくて?
こんな基本すら書けない人間が gzip とか言ってるのってありえんとおもた。
626nobodyさん:2005/09/29(木) 10:26:27 ID:???
>>625
http の レスポンスヘッダを返さないと。

>>622
print "\n", `cat hoge.html`;
627nobodyさん:2005/09/29(木) 10:27:10 ID:???
>>626
IIS な鯖だったら cat できんわけだが。
628nobodyさん:2005/09/29(木) 13:45:10 ID:???
#!/usr/local/bin/perl

use CGI
cgi = new CGI

(formの値をどうたらこうたら)

(メイン演算)



print "Content-type: text/html\n\n";

print "<html>\n";

(演算結果をprint)

print "</html>";


という感じのPerlのCGIがたくさんあるのですが、
一つだけHTMLソースがベタ書きで出てしまいます。
Win IE ではちゃんと見えるのですが、Mozilla でソース丸見えです。
他も同じように作ってるつもりなのに、なぜこれだけ失敗するのかわかりません。
何か勘所ありましたらお教えくださいませ。 よろしくお願いします。
629nobodyさん:2005/09/29(木) 13:59:24 ID:???
>>628
たくさん cgi ファイルがある設計がどうかしていると思われ。
630nobodyさん:2005/09/29(木) 14:05:41 ID:???
>>629  ? なんで?
演算ごとに作っておいた方がラク。
631nobodyさん:2005/09/29(木) 14:09:41 ID:???
>>628
問題が再現する最小のソースを書くべし。
632nobodyさん:2005/09/29(木) 14:11:47 ID:???
>>628
ソースって中濃?とんかつ?
どのソースが見えてる?
633nobodyさん:2005/09/29(木) 14:13:15 ID:???
>>630
何をもってラクとするかだよね。
MVC フレームワークとか勉強してみてください。
634nobodyさん:2005/09/29(木) 14:20:46 ID:???
>>628
HTMLがテキストで見えるのなら、Content-typeが上手く出力されてないと思われ。
出力されてるヘッダを確認。
635nobodyさん:2005/09/29(木) 14:21:56 ID:???
ヘッダって何ですか?とか聞かれる悪寒。
その次に、確認方法きぼんぬ。とかね。
636nobodyさん:2005/09/29(木) 14:49:09 ID:???
>>635
perlをローカルにインスコしてるなら、lwp-requestコマンドが使えるので、コマンドラインから
lwp-request -e -d http://example.net/
という感じでアクセス。
637nobodyさん:2005/09/29(木) 14:50:07 ID:???
>>634 ちゃんと text/html と思われているもようでつ。
演算部分をカットしても表示変わらず。 
もっかいよく見てみます  どうもありがとうございました。
638nobodyさん:2005/09/29(木) 15:14:00 ID:???
こういうのを見てると、どーかんがえても何らかのフレームワークに乗ったほうが楽だね。
639nobodyさん:2005/09/29(木) 19:45:41 ID:???
だから、みんなPHPに流れたのかも。
640nobodyさん:2005/09/29(木) 20:02:55 ID:???
PHPやだ、Perlが良い!
641nobodyさん:2005/09/29(木) 20:33:30 ID:???
「みんな」流れたことにしたいのでつか?
p2 とか見てると、芸術的なすぱげっちーだし、

> たくさん cgi ファイルがある設計がどうかしていると思われ。

って感じだしなぁ。
642639:2005/09/29(木) 21:56:36 ID:???
>>641
ほらほら、いちいち噛み付かない。

「みんな」ってのは、「ダメなやつはみんな」という意味だ。
そう書けば満足かな?

もっとも、新規にダメなやつが参入してくるから、あんまり
状況は変わってないが。

> たくさん cgi ファイルがある設計がどうかしていると思われ。

うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。
643nobodyさん:2005/09/29(木) 22:00:27 ID:???
>うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。

テキストエディターのスクロールバーがちっこくなって、
編集時のスクロールでドラッグしにくいので、
用途や動作内容に分けて分割してる。
644nobodyさん:2005/09/30(金) 00:31:42 ID:???
ファイルをオープンしようとすると、ファイルがある・またはファイルを作ろうとしているのに何故かNo such file or directoryが出てくるので
手前で$!を見てみたところ、Bad file descriptorと出てきて、その原因が分からなくて困っています。

Bad file descriptorはどんな状態のときに出るのでしょうか。
色々試したところ、 require 'hoge.pl'; (hoge.plは自前のもの)を削ると上記のエラーが出なくなるのですが、
hoge.plの中身を削って行ってもエラーが消えません。
requireに制限でもあるのでしょうか。

http://e-words.jp/w/E38395E382A1E382A4E383ABE38387E382A3E382B9E382AFE383AAE38397E382BF.html
これを見てもどこで何が起こっているのか見当が付きません。よろしくお願いします。
645nobodyさん:2005/09/30(金) 00:54:07 ID:EO7sC93p
PDFのファイルの印刷をActivePerlから行いたいのですが、どのように行えば良いのでしょうか?
646644:2005/09/30(金) 01:20:52 ID:???
No such file or directoryについては解決しました。Bad file descriptorは関係ありませんでした。
しかしBad file descriptorが出たままなので気味が悪いです。一体何が問題なのでしょうか。
647nobodyさん:2005/09/30(金) 03:16:19 ID:???
携帯に対応させる為のPerlコーディングは、
一般的にどのようなコーディング方法がありますか?
648nobodyさん:2005/09/30(金) 03:56:57 ID:???
優勝記念マジレス
>>647
携帯でPerlを動かすのは聞いたことがないのでCGI用途とすると、
スクリプトはサーバ側の環境に依存するから自由にコーディングできる。
あとは問題なるかも知れないHTTP(リクエスト/レスポンス)ヘッダと問題になりそうなキャリア特有のhtml(chtmlとかhdml)。
前者はPerlに限ったことじゃないし、後者は板が違うね。
649nobodyさん:2005/09/30(金) 08:41:28 ID:???
>>642
> ほらほら、いちいち噛み付かない。

>>641 を噛み付ついている状態であるとみなしているくせに、
どーして、そんな噛み付いているやつに、噛み付くのだろう。

> うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
> あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
> したほうがいいという考えもありだとは思うけど。

ちゃんとした設計してれば、「小分け」の状態が良いと思われ。

>>648
> 優勝記念マジレス

板が違うね。
650647:2005/09/30(金) 10:13:27 ID:???
ありがとうございました。
651nobodyさん:2005/09/30(金) 10:18:00 ID:???
真面目につっこむと

理想的に「小分け」された状態ってのは
「cgi」がたくさん小分けに作られるという意味ではないよね?
652nobodyさん:2005/09/30(金) 14:09:04 ID:???
テラワロス
653nobodyさん:2005/09/30(金) 14:54:58 ID:???
>>651
フレームワーク厨が暴れる前の発言では、

小分け == cgi たくさん

が成り立ってるっぽいので、何とも言えないのでは?
654nobodyさん:2005/09/30(金) 15:29:51 ID:???
>>653
いやいや、>>651>>649への突っこみと読むべきだろう。
655nobodyさん:2005/09/30(金) 17:05:31 ID:kGP+cAoI
>>649
いちいち噛み付かない。
656nobodyさん:2005/09/30(金) 17:12:02 ID:???
>>651
ちゃんとした設計をしているなんて前提条件なかったじゃん。
後出しジャンケンっぽくて、ちょっとイヤーンだぞ。

そもそも、

> ちゃんとした設計してれば、

という前置きがつけば、何でも正当化できる。

『ちゃんとした設計をしていれば、○○の状態がよい』は、
無敵であるがゆえに、何も語っていないのと同じ。
657nobodyさん:2005/09/30(金) 20:15:08 ID:???
> 無敵であるがゆえに、何も語っていないのと同じ。

異なる性質のものを同じにしたいのですか?
658nobodyさん:2005/09/30(金) 20:19:04 ID:???
> > ちゃんとした設計してれば、
>
> という前置きがつけば、何でも正当化できる。

ほう、何でも正当化できるんですか。それはすごい言葉ですね。
今回の小泉タン違憲問題も「ちゃんとした設計してれば、」をつけて
正当化の程よろしくおながいします。
659nobodyさん:2005/09/30(金) 20:37:17 ID:???
藻前ら共食いやめろ。
660nobodyさん:2005/09/30(金) 20:42:25 ID:ue8bjOg5
ここは話題を逸らしてどれだけ釣れるかを競うスレですね
661nobodyさん:2005/09/30(金) 21:04:35 ID:???
> Perlのコーディングで困ってる人のスレです。
662nobodyさん:2005/09/30(金) 22:49:26 ID:???
面白い話があるからおまいら聞いてくれ。

彼女が医療関係の学校に通ってるんだが、実習か何かで精神
障害者の施設へ行ったそうなんだ。それが終わって会った時に、
単なる会話として「大変だった?」とか訊いてたら、「あなたと同じ
本を読んでる患者がいた」って言うんだよ。隠してあったエロ本が
見つかったのかと動揺してたら、「あれだよ、表紙に動物の絵が
書いてあるコンピュータの」って言うから、オライリーのを順番に
見せていったら「それそれ! ラクダのやつ」だって。

施設の人が言うには、その患者は絶対にその本を手放さないし、
取り上げると錯乱するからずっと持たせてあるんだってさ。
663nobodyさん:2005/09/30(金) 23:10:31 ID:???
で?
664nobodyさん:2005/09/30(金) 23:23:25 ID:???
ラクダ本がどうかしたか?
665nobodyさん:2005/09/30(金) 23:43:37 ID:???
他スレの終わったネタを持ち込むなよ。
666nobodyさん:2005/10/01(土) 00:06:13 ID:tjNKkKzJ
perl でCGIに挑戦中の者です。
何日考えても歯が立たない問題にぶち当たったので、詳しい人の知識をお借りしたいです!!

私がやりたいことは、textファイルのある一行を、別のデータで上書きするということをしたいです。
現在、削除する行を探すためにforeachを使っています。

私の望むイメージはこのような感じです。
-------aaaa.txtのファイル------
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
-------------------------
↑を
---------------------------
あいうえお
かきくけこ
さしすせそ
なにぬねの
------------------------

削除したい行を特定する部分は自分でなんとかできたのですが、肝心の削除方法が理解不足でどのようにすればいいのか分かりません。
ご教授お願いします。
667nobodyさん:2005/10/01(土) 00:10:24 ID:tjNKkKzJ
何を言ってるのか良くわかんなくなってました。ごめんなさい。

私が知りたいのは、削除するためにはどのようにすればいいのか、です。
668nobodyさん:2005/10/01(土) 00:18:13 ID:???
こう考えよう。

・今あるデータを配列に読み込む
・新しく作るデータを入れる配列を用意する
・消したい行だけを新しい配列に入れない
・新しい配列をファイルに書き込む
669nobodyさん:2005/10/01(土) 00:25:11 ID:???
この際だから書いちまうか

open (TXT, "<aaaa.txt");
flock (TXT, 1);
@data = <TXT>;
close TXT;
@new = ();
foreach (@data) {
 if ($_ ne "たちつてと\n") {
  push (@new, $_);
  }
 }
open (TXT, ">aaaa.txt");
flock (TXT, 2);
print TXT @new;
close TXT;
670nobodyさん:2005/10/01(土) 00:36:22 ID:???
文字の置き換えについて教えてください!

$okikae =~ s/文字/変更後の文字/g;

までは分かりましたが、
チルダやスラッシュを含む文字を置き換えるときはどうすればよいのでしょうか?
例として/~id/aaa/aaa/を/bbb/に置き換えるには??
教えてください。
671nobodyさん:2005/10/01(土) 00:44:17 ID:???
メタ文字
エスケープ
などの言葉で検索すると幸せになれるかもしれない
672nobodyさん:2005/10/01(土) 07:28:28 ID:???
> 幸せになれるかもしれない

なんてどこの老人が使い始めた言葉なのか知らないけど、
見るたびに気持悪くなる・・・。
673nobodyさん:2005/10/01(土) 08:58:47 ID:???
うぐぅ、ぎもじわるぃ…
674nobodyさん:2005/10/01(土) 10:35:57 ID:???
幸せになれるかもしれないとか見るたびに気持ち悪いとか言い出したのは誰なのかしら
675nobodyさん:2005/10/01(土) 11:27:36 ID:???
>>672->>674

>>660
676nobodyさん:2005/10/01(土) 12:54:48 ID:???
m9プギャ
677nobodyさん:2005/10/01(土) 14:07:37 ID:3dTdip7r
MIMEについての質問です。

以下のようにMIMEを使ってメールを受信して本文を取得するプログラムを作っています。

#!/usr/bin/perl

use File::Basename;
use MIME::Parser;


my $parser = MIME::Parser->new;


#ファイルの一時保存場所を指定
$parser->output_dir('/tmp');


#標準入力からメールを取得
my $entity = $parser->parse(\*STDIN);
my $body_entity = ($entity->is_multipart) ? $entity->parts(0) : $entity;
my $body = $body_entity->bodyhandle;

open(FILE, ">> /log");
print FILE "Test\n";
print FILE $body->as_string."\n";
close(FILE);

ですが、何故か$body->as_stringの時点で本文が拾えず空文字列になります。
ちなみにheadなどのメソッドや、ファイル添付時のis_multipart、partsなどは正常な値を返します。

どういった理由が考えられるのでしょうか?
678nobodyさん:2005/10/01(土) 14:34:03 ID:???
MIME::Explode とかが使いやすかった気がするけど。
679nobodyさん:2005/10/01(土) 23:13:02 ID:???
>>646
遅レスだが、$!(errno)はシステムコールやライブラリ呼び出しが
失敗したときは値がそれに応じて設定されるけど、成功したときは
未定義なので、何になっているかはわからない。

perldoc perlvarの$!の説明をよく嫁。

680nobodyさん:2005/10/02(日) 04:48:22 ID:???
すみません。
http://internet.watch.impress.co.jp/www/article/1999/1122/special.htm
でフォームからメールがおくれたのですが、確認画面を表示させたいのですが、
どのように書いていけばよいのでしょうか。
よろしくお願いします。
681nobodyさん:2005/10/02(日) 09:19:04 ID:???
どのようにって・・・
まさか手取り足取り一から十まで順を追って説明しろなんて
ふざけた要求してるわけじゃないよな?

ここの説明を参考にやったんなら、
確認画面の表示の有るフォームメールcgiをいくつかダウンロードして
スクリプトを眺めてみればいいんじゃない?
682nobodyさん:2005/10/02(日) 10:23:03 ID:???
スカラーコンテキストの演算子に
文字列の一部を正規表現でキャプチャし一発で渡したい時にはどうすればいいでしょうか?
一応 op ${\("STR" =~ /REGEX/g)}; でできるのですが冗長ですよね。
683nobodyさん:2005/10/02(日) 11:42:59 ID:???
>>682
そういうのは一行で書く必然性が無ければ
二行に分けた方が読み解き易く美しい。

"STR" =~ /(REGEX)/;
op $1;

> ${\("STR" =~ /REGEX/g)};
REGEX にマッチした部分文字列の*リスト*を返した上で
無理矢理一つだけを利用しているのが無駄と混乱を招く。
どうしても /g を使いたければ

op +("STR" =~ /REGEX/g)[0];

とでもした方がいいだろう。
684nobodyさん:2005/10/02(日) 11:53:28 ID:???
>>682
おそらく /g を付けているのは問題回避のためだろうから、
値1つを取れればいいなら

op +("STR" =~ /REGEX/)[0];
685682:2005/10/02(日) 12:38:08 ID:???
>>683 >>684
ありがとうございます。確認しました。
/gはラクダ本(日3版175P)に「リストコンテキストでm//gを使って…」とあったので両方必須なのだと勘違いしていました。
実際のコーディングは2文でやってみようと思います。
686nobodyさん:2005/10/02(日) 14:19:35 ID:???
URLでよくtest.pl?line=ABC&line2=DEF
みたいに引数を渡す場合がありますがコマンドラインからこのような
引数を渡すにはどうしたらよいでしょうか?
#>perl test.pl 「ここの部分?」
687nobodyさん:2005/10/02(日) 14:35:59 ID:???
perl test.pl line=ABC line2=DEF

値は @ARGV に入る。
688686:2005/10/02(日) 15:14:12 ID:???
>>687
サンクス。
if($#ARGV >= 0){ $buffer = join'&',@ARGV; }
デコードに付け加えて何とかなりますた。
689nobodyさん:2005/10/02(日) 15:16:12 ID:???
>>688
if ($#ARGV >= 0)
より
if (@ARGV)
の方が好き。
690686:2005/10/02(日) 15:19:46 ID:???
>>689
アチャー。確かにそちらの方がいいですね。何か遠回りしてる漏れ。
691nobodyさん:2005/10/02(日) 16:49:19 ID:???
if (scalar @ARGV) って書いちゃうなあ。
692nobodyさん:2005/10/02(日) 17:19:24 ID:???
そもそも直で値を代入してしまう。
693ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/02(日) 17:35:02 ID:???
if 文使わなくても $buffer = join('&', @ARGV); だけで良くね?
@ARGV が空リストなら $buffer は空文字になるわけだし。

使うんなら $buffer = join('&', @ARGV) if @ARGV; かな。
694nobodyさん:2005/10/02(日) 17:51:48 ID:???
前やったベンチでは@ARRAYより$#ARRAYの方が速かった
695680:2005/10/03(月) 01:39:26 ID:???
>>681さん、あれから自分でやってみてできました。
別に確認画面を作成してそのでーたをメールを送るCGIに渡すようにしました。
ありがとうございました。
696もな:2005/10/03(月) 02:21:03 ID:???
掲示板をいちから作っているのですが、どうしてもdatファイルに文字を書き込めません。
書き込みボタンを押すとエラーが出るわけでもなく画面が遷移して、また再表示というふうにはなるのですが・・・。
どうかご教授願います。datファイルには何も書き込まれていない状態です・・

以下ソースです↓

#!/usr/bin/perl

require 'cgi-lib.pl';
&print_header(); #ヘッダを表示する

if(open(CHK,"bbs.dat")){
if(&get_data == 0){
if ($name eq '') {
&show_error('名前が記入されていません');
} elsif ($title eq '') {
&show_error('タイトルが記入されていません');
} elsif ($message eq '') {
&show_error('内容が記入されていません');
}
&write_to_file();
}
&read_file(); #ファイルからデータを読み出してリストに格納
&print_top(); #トップを表示する
}else{
&show_error('データファイルがオープンできません');
}

続く
697もな:2005/10/03(月) 02:22:02 ID:???
sub print_header(){
$haikei_img ="back.jpg"; #背景画像の指定
print "Content-type: text/html\n\n";
print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html;CHARSET=Shit_JIS\">";
print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body style=\"background-image : url($haikei_img);background-repeat : no-repeat;background-attachment : fixed;\" text=#000000>\n";
}

sub print_top(){
print "<center<table width=600><tr><td>\n";
print "<br><br><center><h2>掲示板</h2>\n";
print "<hr> [ <a href=http://www.yahoo.co.jp>Back To Homepage</a> ] <hr></center>\n";
print "<form method=post action=\"bbs1.cgi\">\n" ;
print "<table border=0>\n" ;
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n" ;
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n" ;
print "<tr><td align=right>URL :</td><td><input type=text size=40 value=http:// name=url></td></tr>\n" ;
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n" ;
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 wrap=hard name=message></textarea></td></tr>\n" ;
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信><input type=reset value=書き直し></td></tr>\n" ;
print "</table>\n" ;
print "</form>\n" ;
}
698もな:2005/10/03(月) 02:23:21 ID:???
sub get_data{
&ReadParse(*FORM_DATA);
if($FORM_DATA{'action'} eq 'reqist') {
&get_time(); #時刻の取得
$name = $FORM_DATA{'name'};
$message = $FORM_DATA{'message'};
$title = $FORM_DATA{'title'};
$mail = $FORM_DATA{'mail'};
$url = $FORM_DATA{'url'};
$action = $FORM_DATA{'action'};

    return 0;
}else{
return 1;
}

}

#========================================================
# 日付の取得と整形
#========================================================
sub get_time(){
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime;
@weekday = ('日','月','火','水','木','金','土');
$week=$weekday[$wday];
$mon++;
$year = 1900+$year;
$date="$year年$mon月$mday日($week) $hour時 $min分 $sec秒";
}


699もな:2005/10/03(月) 02:24:43 ID:???
sub write_to_file(){
open(WRITE,">>bbs.dat");
print WRITE"$name\t$mail\t$url\t$date\t$title\t$message\n";
close(WRITE);
}
sub read_file(){
open(READ,"bbs.dat");
@data_set = <READ>;
close(READ);
}
sub show_error(){
print "<h2>エラー発生</h2><hr><br>";
print "エラー内容: $_[0]";
print "<br>WebブラウザのBackボタンで戻ってください";
exit();
}
_END_
700もな:2005/10/03(月) 02:25:24 ID:???
以上ですm(__)m
701nobodyさん:2005/10/03(月) 02:34:33 ID:???
まるまる張るんだったらどこかにうpしる。
702nobodyさん:2005/10/03(月) 02:46:02 ID:hN7oOpvn
perlのバージョンが3以下なんじゃないの???
それだとオブジェクト指向サポートしてないから書き込めないよ
703nobodyさん:2005/10/03(月) 02:51:30 ID:???
ヒント:オープンモード
704もな:2005/10/03(月) 02:51:39 ID:???
ttp://www.error.to/~marty/ss2_bbs/ss2_bbs_img/8_1.txt

です。おねがいしますm(__)m
705nobodyさん:2005/10/03(月) 02:51:47 ID:???
>>698
> if($FORM_DATA{'action'} eq 'reqist') {
                    ↑
706もな:2005/10/03(月) 03:04:26 ID:???
>>703

オープンモードですか?
+>や>>などですか。調べてみましたが、もはやどうにも;;


>>705

初歩的なミスですね、ありがとうございます。

その部分を registと書き直しましたが
改善しません。
707nobodyさん:2005/10/03(月) 03:33:27 ID:???
>>704
入力画面の表示の部分に
<input type="hidden" name="action" value="request">
が抜けている。

そしてなにより、@data_setにいれたログを表示する部分が、ない。
708もな:2005/10/03(月) 03:44:44 ID:???

>入力画面の表示の部分に
><input type="hidden" name="action" value="request">
>が抜けている。

今自分で発見しました。ごもっともです・・・。これが原因でした。

>そしてなにより、@data_setにいれたログを表示する部分が、ない。
これはこれから実装予定です。
いまはとりあえずbbs.datに書き込めればいいので。

ありがとうございましたm(__)m
709nobodyさん:2005/10/03(月) 05:25:36 ID:AwkrNdbs
神様、お願いします。
CGIの改造を考えていますが、この内容が素人に出来そうでしょうか?
パールの解説のHPを見つけたのと、大昔、BASICをやっていました。

「掲示板に親記事を投稿した人間以外にレスを付けれなくする。」
1、親記事の入力フォームに記事ロックの選択肢を追加。ログデータに
この項目を追加。
2、ロックマーク表示。
3、レス投稿時に親記事番号のログデータを読み込んで、ロックであれ
ばパスワード判定。パスワードは投稿時の物を使用、判定はそのサブル
ーチン流用。
4、エラー処理。(サブルーチンから流用)。
710nobodyさん:2005/10/03(月) 05:36:42 ID:???
根性があればできんじゃない?
711nobodyさん:2005/10/03(月) 05:40:27 ID:???
>>709
既存のスクリプトは読めてるみたいだしいけると思うよ
712nobodyさん:2005/10/03(月) 18:47:13 ID:???
>>710-711
神キター
713709:2005/10/03(月) 22:58:15 ID:y4rbqtg0
ありがとうございます。頑張ってみます。

ログファイルの読み込み、書き込みが強敵です。なにせ、BASICには無い
概念なので。あとは、他の部分からの流用、小改造でなんとかなりそうなんで
すが。
714nobodyさん:2005/10/03(月) 23:16:50 ID:???
やってもらいたいなら、最初からそう書くべきだと思うけど。
715709:2005/10/03(月) 23:55:41 ID:YGt8QF/s
そういうスレがあるのは知っています。ただ、できたらいいな、ぐらい
なものなので。

とりあえず、ログデータを定義している部分をチェックしたので、そこ
からスタートです!!
716nobodyさん:2005/10/04(火) 11:53:28 ID:ibcAkGb+
質問させてください。

@list1 = (1,3,5,7,9,11,13,15,17,19,21,23,25,27,29)
@list2 = (1,4,7,10,13,16,19,22,25,28,30)

と入っています。
ここで
・リスト2の中のものがリスト1にある場合はその値を@list3に、
・リスト2の中のものがリスト1にない場合はその値を@list4に、
それぞれ入れて行きたいと思うのですが、その方法がわかりません。

最終的には
@list3 = (1,7,13,19,25,30)
@list4 = (4,10,16,22,28)
にしたいのです。

@list1〜@list4は便宜上数値にしていますが、実際に入るのは文字列(URL)で、@list1の要素は100以上になる場合があります。@list2はせいぜい5個くらい。
717nobodyさん:2005/10/04(火) 12:19:46 ID:???
>>716
ハッシュにいれて調べるのが常套手段。

@list3 = (1,7,13,19,25,30)
@list4 = (4,10,16,22,28)

じゃなくて

@list3=(1,7,13,19,25)
@list4=(4,10,16,22,28,30)

でよければ

@list1{@list1} = ();

@list3 = grep {exists $list1{$_}} @list2;
@list4 = grep {!exists $list1{$_}} @list2;

でいけるけど、30が@list4じゃなくて@list3に入るようにするのは難しいな。
718nobodyさん:2005/10/04(火) 14:23:03 ID:???
なんかすげー。

> @list1{@list1} = ();

こんな書き方あるのか。
719nobodyさん:2005/10/04(火) 15:06:23 ID:???
>>718
原理としては @hash{'foo', 'bar', 'baz'} と同じなんだが。
720716:2005/10/04(火) 15:10:49 ID:ibcAkGb+
>>717

30は@list4の間違いです。申し訳ありません。

ハッシュを使うのですね。
ありがとうございました!!
721nobodyさん:2005/10/04(火) 15:12:11 ID:???
素人スマソ、生理的に嫌かもしれませんが

$dummy = '/^';
$dummy .= join'$/ || /^',@list2;
$dummy .= '$/';
@list3 = grep(eval $dummy,@list1);
@list4 = grep(!eval $dummy,@list1);
722721:2005/10/04(火) 15:16:47 ID:???
間違ったので読み飛ばしてください。(鬱
723nobodyさん:2005/10/04(火) 15:21:32 ID:???
>>718
スライスはやりすぎのような気がするので、

$list1{$_} = 1 foreach @list1;

ぐらいの方が見やすいんじゃないかねぇ。これだと値が1だから
exists使わずに

@list3 = grep {$list1{$_}} @list2;

みたいに書けるし。
724nobodyさん:2005/10/04(火) 15:45:08 ID:???
それならこう書くかな。
my %flag = map { $_ => 1 } @list1;
725709:2005/10/04(火) 15:46:59 ID:16WUnnwb
第一夜。
まずは入力フォームを追加して、ログデータの項目を追加。
掲示板に投稿して入力値が入っているかテスト。・・・FTPで開いて
みるが、入っていない。試行錯誤するがダメ。もう止めようと思う。

第一夜続き。お風呂でぶくぶくしていると、使っていないname値を流用すれ
ば全部済むことに気がつく。
俺って天才!! さっそく試す。ダメ。

726nobodyさん:2005/10/04(火) 15:47:19 ID:???
どうでもいいが >>721 は /^(?:a|b|c)$/ とういうような書き方を知らないのか
727nobodyさん:2005/10/04(火) 15:49:41 ID:???
>>709 オツカレw
728709:2005/10/04(火) 15:50:20 ID:16WUnnwb
第二夜。
よ〜〜〜く見たら、formのnameに「"」がついてないことに気がつく。
再度、投稿してFTPでファイルを開く。

入ってる〜〜〜〜〜!!!!!

新たにログデータの項目を追加した状態で試す。

入ってる〜〜〜〜〜!!!!!
729nobodyさん:2005/10/04(火) 16:38:19 ID:???
>>728
ローカルでテストしましょうね。
730nobodyさん:2005/10/04(火) 16:56:19 ID:???
とりあえずオメ
731709:2005/10/04(火) 17:13:56 ID:0ZPYmA+s
ありがとうございます!! 
ところでローカルということは、サーバーに上げなくてもCGIは動く
のですか?

第二夜続き。
過去ログの処理が入っているので、安全を考えてname値の流用の方に決
定。とりあえずクッキーを外したいので、そこだけ消去。動作確認。

レスロック判定をしてロックなら投稿記事にマークを出す。ログデータ
はもともと読み込まれているので、if文を書いてみる。
原文から「!」が逆の判定になるのだろうと推測。

if ((!$reno)&&($sub_color eq "1")) {
 print "[ロック] ";
 }

出た〜〜〜〜〜!!!!
732nobodyさん:2005/10/04(火) 17:47:20 ID:???
>>731
プログラムだから動くよ〜。
733nobodyさん:2005/10/04(火) 18:20:23 ID:???
>>731
> ローカルサーバ
あの KENT-WEB にさえ 「自宅マシンWWWサーバ化計画」 とやらがあるんだし、いろいろぐぐってみそ
734nobodyさん:2005/10/04(火) 18:31:14 ID:???
機種依存文字のチェックルーチンを作っててはまった事実。

---------- ソース(EUC) ----------
use Jcode;
$char = '(1)'; # 機種依存文字の丸1だと思ってください。
print qq(${char}\n);
Jcode::convert( \$char, 'euc' );
print qq(${char}\n);
exit;

---------- 出力(EUC) ----------
(1)
?

文字コード同じでもJcodeかますと機種依存文字が「?」になるんですね…
なんでだろ。
735nobodyさん:2005/10/04(火) 19:35:46 ID:???
>>731
ここで日記書く前にCGIの基礎を勉強して来い
つか質問無いなら書くな
736nobodyさん:2005/10/04(火) 19:40:27 ID:???
>>734
ウチではそのソースでも「?」にはならないけど
737734:2005/10/04(火) 19:49:55 ID:???
>>736

まじですか?
ちなみに環境は、

・FedoraCore 3
・Perl 5.8.5
・内部エンコードUTF8(あまり関係ない気がするけど)

です。
738nobodyさん:2005/10/04(火) 19:54:18 ID:???
Jcode.pm の ユニコ←→EUC 変換テーブルにない文字なだけじゃね?
739709:2005/10/04(火) 20:09:01 ID:5HGueAp3
>>735

はあ。プログラマーさんは真面目なんですね。
では、さようなら。アドバイスありがとうございました。
740nobodyさん:2005/10/04(火) 20:51:20 ID:???
>>734
エディターで使用してるフォントと結果表示のフォントが違うんじゃない?
同じ文字コードでも後者のフォントには含まれてない文字だとか。
741nobodyさん:2005/10/04(火) 21:16:41 ID:???
>>740
Jcode::convertにかける前と後で表示させていて、かける前のは
ちゃんと表示されてるというんだからそれは違うんじゃないかと。

print qq(${char}\n);

のかわりに、

print unpack('H*', $char), "\n";

にして文字コード表示させるとなにかヒントがつかめるかもしれず。

ちなみにうちの環境ではどちらも普通に丸1が表示されてコードは
ada1だった。
742nobodyさん:2005/10/04(火) 21:27:51 ID:???
Jcodeは5.8.x以降Encodeのラッパーとして動くとかあるから、
PerlバージョンとJcodeのバージョンによって動作が違うと考えられるけど。
743nobodyさん:2005/10/04(火) 21:47:32 ID:???
ああ、そういえば Encode の日本語変換はかなりのヘタレだ。
744nobodyさん:2005/10/04(火) 22:10:19 ID:???
なんかヘンだ。
print qq(${char}\n);

print $char . "\n";
とか
print "$char\n";
にならんのか?

いや、オフトピだけどさぁw
745nobodyさん:2005/10/04(火) 22:16:13 ID:???
俺なら
print $char, "\n";
かな
746nobodyさん:2005/10/04(火) 22:19:58 ID:???
>>745
俺も。 なんとなく効率よさそう
747nobodyさん:2005/10/05(水) 01:00:16 ID:???
Win2K環境でhoge.txtを作ってから、

open (FH, "<hoge.txt");
print FH "I";
close FH;

これを実行してエディタで開くと、文字コードがEUCになってしまう
748nobodyさん:2005/10/05(水) 02:26:59 ID:???
>747
ここは独り言書き込みスレじゃねえ
749nobodyさん:2005/10/05(水) 03:23:07 ID:???
ハッシュのキーにHTMLタグ等を入れる予定なのですが、
キーに指定不可能な文字列というものはあるものなの
でしょうか。

ご教示いただけますと幸いです。
750nobodyさん:2005/10/05(水) 07:42:46 ID:???
>>747
文字コードが被ってるだけ。エディタの問題。

>>749
文字列で表すことができれば、なんでもOK。
751734:2005/10/05(水) 12:48:09 ID:???
>>741

コード出力試したんですが、
見事に
(1) → ada1
? → 3f
でしたw

3fってもろに ? のコードなんだよなぁ…
となるとJcodeの変換テーブルに無い文字は
全部 ? に変換しちゃってるとしか考えようが…

ちなみに Jcode.pm のバージョンは 2.3 でした。
一応現在の最新版を入れたんだけど…



>>742, 743

それは痛い…
まだまだJcode使わざるをえないようですね



>>744, 745, 746

大抵 print するときはPerl変数と通常の文字列が混ざるんで、
qq() でくくって ${} で変数を切り分ける癖が付いてるみたいです。
逆に , や . で結合する方が気持ち悪いと感じてる…
(もちろん、単純な文字列の場合はその限りじゃないですが)

752nobodyさん:2005/10/05(水) 13:03:38 ID:???
>>751
qq() と . は、文字列結合があるからなぁ。
, ならIOにそのまま渡るだけだけど。
753nobodyさん:2005/10/05(水) 13:51:44 ID:???
>>751
たぶん勘違いしてると思うのだが、新しめのJcode.pmはperl5.8以降と
組み合わせるとコード変換部分をPerlがもともと備えている機構を
使うようになるので、
754751:2005/10/05(水) 13:58:42 ID:???
>>752

可読性を重視してました…
速度的にはそのとおりですね

>>753

×Jcode
○jcode(.pl)
でした。。
755nobodyさん:2005/10/05(水) 14:06:45 ID:???
Debianのunstableで試してみたんだが、パッケージでインストールしたperl5.8.7
とJcode.pmのHPから落としてきた2.03との組み合わせでで確かに'?'になった。
unstableでJcode.pmのパッケージはいまだに0.88なのはその辺を嫌ってるの
かもしれんな。

756nobodyさん:2005/10/05(水) 14:10:46 ID:???
>>754
いや jcode.pl は utf-8 ⇔ euc-jp はできんぞ。
757754:2005/10/05(水) 14:14:34 ID:???
>>756
ソースも出力もEUCなので、UTFからの変換は行ってないです。
(すんません、なんか本題とずれちゃってる…)
758nobodyさん:2005/10/05(水) 15:40:19 ID:???
>>750
ありがとうございます。
キーボードで入力できる文字全てが対象なんですね。
良かったです。
759nobodyさん:2005/10/05(水) 16:29:09 ID:???
いっそ、jcode.plにするとか
760nobodyさん:2005/10/05(水) 16:35:30 ID:???
つか euc ⇔ euc なら変換する必要ないじゃんか。
いきなり convert じゃなくて、getcode で文字コード取得してから自分で判別してやれば「いいじゃない
761nobodyさん:2005/10/05(水) 17:13:12 ID:???
>>734 を読んで思ったこと。

>---------- ソース(EUC) ----------
>use Jcode;
ソースはEUCとのことだが、use encoding を宣言していないため、
Perl はこのソースをUTF-8だと認識すると思われ。

>$char = '(1)'; # 機種依存文字の丸1だと思ってください。
$charには、「『丸1』のEUCコード」が入る。但し、PerlはこれをUTF-8の
文字コードだと認識する。

>print qq(${char}\n);
PerlがUTF-8の文字コードだと認識している「『丸1』のEUCコード」が出力される
ため、出力結果は見かけ上は正常に見える。

>Jcode::convert( \$char, 'euc' );
これは、「『丸1』のEUCコード」をUTF-8の文字コードだとして、対応する
EUCコードを返せ、ということになるが、そんなものが無いために「?」が
返されるのではないだろうか。
762nobodyさん:2005/10/05(水) 17:35:41 ID:???
>>761
use utf8してないからそんなこたないと思うが。
763nobodyさん:2005/10/05(水) 18:06:34 ID:???
use Encode qw(from_to);

euc2euc("\xad\xa1");
euc2euc("\xdb\xd9");
exit;

sub euc2euc
{
my $char = shift;
from_to($char, 'euc-jp', 'euc-jp');
print ((map{ unpack('H2', $_) } split(//, $char)), "\n");
}

これを動かしてみれば分かると思う。
結局、○に1とかの文字を渡さないのがいいかと。
764nobodyさん:2005/10/05(水) 19:43:50 ID:???
>>763

なるほど。
ということはEncodeを使うコード変換(Perl5.8以上のJcode含む)に
機種依存文字を渡してはいけないってことですね。
※5.8以下のJcodeとjcode.plは不明

うーん、、機種依存文字の判定はしんどいなぁ…
765nobodyさん:2005/10/05(水) 21:14:51 ID:???
>>764
CPANにあるEncode::JIS2K使うとか。詳しくはわかんないけど
試した感じでは丸付き数字ぐらいならなんとかなるっぽいよ。
766nobodyさん:2005/10/05(水) 21:36:18 ID:???
すいません。ご指導おねがいいたします。
クイズのプログラムを作っているのですが、csvへの書き込みが思うようにいきません。。
↓とりあえず現状はこうなっています。
ttp://s1.muryo-de.etowns.net/~testjoy/

このまま回答を送信すると

項目1 項目2 項目3
総問題数 回答番号 正解番号
総問題数 回答番号 正解番号
・   ・   ・
・   ・   ・

と書き込まれるのですが、これを

項目1 項目2 項目3
Q1(問題番号) Q1の回答番号 Q1の正解番号
Q2(問題番号) Q2の回答番号 Q2の正解番号
Q3(問題番号) Q3の回答番号 Q3の正解番号
・   ・   ・
・   ・   ・

という形に修正したいです。ここまでやってどうしてもうまくいきません。。。
どなたかお助けお願い申し上げます。
767766:2005/10/05(水) 21:37:30 ID:???
おかしいとこのソースは

foreach (@question) {
($rank_data) = split(/\t/);

open(CSV , ">> file.csv");
flock(CSV,2);
@logs2=<CSV>;
$rank_data="$key,$val,$aval\n";
push(@logs2,$rank_data);
print CSV @logs2;
flock(CSV,8);
close(CSV);
}

です。お願い申し上げます。。
768nobodyさん:2005/10/05(水) 21:42:47 ID:???
>>767
問題が再現する最小のサンプルコードを載せるべし。
76976:2005/10/05(水) 21:52:03 ID:???
>>768
こんな具合でございます。。

# 質問の取得

&ReadParse;

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
770767:2005/10/05(水) 21:54:07 ID:???
# 質問の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;

【問題$qnum】$qval

!;

$anum = 0;
foreach (@column) {
next if(!$_);
$anum++;
print qq!<BR>\n!;
print qq!<INPUT TYPE="radio" NAME="$key" VALUE="$anum">$_\n!;
}
771767:2005/10/05(水) 21:58:19 ID:???
# 回答の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
}
772nobodyさん:2005/10/05(水) 22:30:09 ID:Y4Xwvx08
質問させてください。
最近サイトの荒しが多くて、IPとホストのドメインを取得しようとしています。
$ENV{'REMOTE_ADDR'}
$ENV{'REMOTE_HOST'}
で情報を得ようとしているのですが、REMOTE_ADDRの方は値が入っているのに、
REMOTE_HOSTの方は何も入っていません。ローカル起動ではないのですがなぜ
でしょうか?プロバイダの違う複数の端末からもためしてみたのですが、入っ
ていませんでした。
よろしくお願いします。
773nobodyさん:2005/10/05(水) 22:45:29 ID:???
>>772
つながってきた相手のIPアドレスは必ずわかるけど、
ホスト名はIPアドレスからDNSで逆引きしないと
出ないので、出そうとするとその分鯖の負荷になる。
なので、特に共用の鯖では逆引きしない設定にして
あることが多い。多分それじゃないかと。

774nobodyさん:2005/10/05(水) 23:15:07 ID:???
つまりこっちで関数使って逆引きすればいいってことね。
775nobodyさん:2005/10/06(木) 03:58:29 ID:???
げっとほすとばいあどれす
776nobodyさん:2005/10/06(木) 11:31:35 ID:???
>>764
> 機種依存文字
Shift_JIS だけど、
どこかに

/([\x85-\x87][\x40-\xff]|\x88[\x40-\x9e]|[\xeb-\xfc][\x40-\xff])/;
って書いてあった。
777nobodyさん:2005/10/06(木) 11:54:16 ID:???
>>767
foreach (@question) のループの中で、$key, $val, $aval
が全く変更されていない。従って、$rank_dataは常に同一の
文字列になる。もしかすると、
($rank_data) = split(/\t/); を、
($key,$val,$aval) = split(/\t/);
にすれば、望んだ結果が得られるかもしれない。
778nobodyさん:2005/10/06(木) 13:20:28 ID:Zoab/OuC
$db = PP->db;

$st = $db->prepare("$C{sqlbase} and ch=? and subch!='notice' and pubtime > now() - '1 day'::interval order by pubtime desc");

すいません、↑この一文は何をしているんでしょうか?
perlの文章の中に出てきたのですが、これはSQLの文の一部なんでしょうか
779nobodyさん:2005/10/06(木) 20:10:40 ID:???
>>778
PPクラスのdbメソッドの返値が代入されている$dbに対して
prepareメソッドを一つの引数とともに呼び、その返値を$stに代入してる。
引数は普通の文字列で、$C{sqlbase}が変数展開される。

SQL文の一部かどうかはそのプログラムを書いた人じゃないので知らん。
780778:2005/10/06(木) 21:47:25 ID:Zoab/OuC
ありがとうございます。かなり参考になりました。そのアドバイスを参考になんとか解析できそうです
781nobodyさん:2005/10/07(金) 04:33:20 ID:7A4FQYqd
http://hogehoge.co.jp/cgi-bin/hoge.cgi
でname=valueというクッキーを発行して
http://foo.jp/に渡したいんです

domain="http://foo.jp/";
path="/";
name="value";

というクッキーを作ったんですが受け取ってもらえませんでした。
どうすればいいんでしょうか。
782nobodyさん:2005/10/07(金) 07:25:00 ID:???
URLじゃなくてドメイン名なんだからfoo.jpじゃないと。
ただし、ピリオドが2つ以上含まれないといけないらしいが・・・
783nobodyさん:2005/10/07(金) 10:32:33 ID:???
>>778-779
そもそも
$db->prepare()
 ↑が何なのか分からん
784nobodyさん:2005/10/07(金) 11:40:23 ID:???
>>781
domain属性がドメイン名でないという782の指摘は正しいが、
ドメイン名foo.jpに直したとしても、クッキーを発行するホストの
ホスト名hogehoge.co.jpがドメイン一致しないので、拒否される
んじゃないだろうか。実際とは変えてあるのだろうからなんとも
言えんが。

RFC2965の「3.3.2クッキーの拒否」
ttp://www.studyinghttp.net/cgi-bin/rfc.cgi?2965
785nobodyさん:2005/10/07(金) 11:54:42 ID:???
IE の インターネットオプション → プライバシー → 詳細設定 に 「サードパーティの Cookie」 ってあるから、拒否されるかどうかはそこで決まるんじゃないかな。
786nobodyさん:2005/10/07(金) 12:11:20 ID:???
>>783
$dbはPPクラスのオブジェクトじゃないの?
推測だけど。

>>781
他所のCookieを読み込みたいのですが
http://pc8.2ch.net/test/read.cgi/php/997686085/

ほんと、古いスレがあるよなぁ。

>>785
それは、コンテンツに第三者のコンテンツを埋め込んで、
そこでクッキーを発行する方法っしょ。
787nobodyさん:2005/10/07(金) 12:23:51 ID:???
>>783
オレの推測ではDBIのデータベースハンドルじゃないかなー。


788nobodyさん:2005/10/08(土) 11:15:59 ID:???
答はNoだ
789nobodyさん:2005/10/08(土) 18:30:12 ID:???
>>783
これは本当のこと言ったらいかんの? >>786-788の流れは…。
790nobodyさん:2005/10/09(日) 12:58:13 ID:???
こんなスクリプト書いて redir.cgi ってファイル名つけて実検してるんですけど、
500 エラーになります。試しに nph-redir.cgi という名前にすると 503 になります。
使ってるのは、apache2 です。よろしくおねがいします。
my $x = CGI->new();
print $x->redirect(
-location => $url,
-status => 301,
);

791790:2005/10/09(日) 13:04:30 ID:???
suexec のせいで 500 くらってますた。すんません。
792nobodyさん:2005/10/09(日) 20:13:06 ID:20mFB5Hk
初歩的な質問ですが、正規表現で、最後にsをつけるのとつけないのとの違いがわかりません。
mは各行ごとに^や$が使えるようになるみたいですが。
どなたかおしえてください。
793nobodyさん:2005/10/09(日) 20:25:55 ID:???
与えられた文字列を一行として扱う。.が改行にマッチする。
http://search.cpan.org/dist/perl/pod/perlre.pod
794nobodyさん:2005/10/09(日) 20:32:38 ID:???
sオプションを使うことは稀ですから、sオプションがあるのを知っている時点で
その説明を読んでいる可能性が高いのではないでしょうか。

マニュアルページを読むだけで、解決する質問がかなり多いような気がします。
ぐぐるだけではなく、手元のマニュアルページも調べてみましょう。
795nobodyさん:2005/10/09(日) 20:38:17 ID:???
まあ後はトライだな。
796nobodyさん:2005/10/09(日) 22:47:29 ID:???
ハッシュのキーを正規表現で指定することは可能でしょうか
797nobodyさん:2005/10/09(日) 22:51:07 ID:???
>>796
アルゴリズム上、無理です。
798nobodyさん:2005/10/09(日) 22:56:16 ID:???
あ、tie して、そういうハッシュを作れば可能かな。面倒だけど
799ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/09(日) 22:56:57 ID:???
>>796
Tie Hash Reg で CPAN Search
800nobodyさん:2005/10/10(月) 00:05:51 ID:???
>>796の質問の意味がわからん。
キーを正規表現で取り出すのとはちがうのか?
801nobodyさん:2005/10/10(月) 00:11:38 ID:???
キーに対して値は1つ、
で正規表現で複数マッチしたら何を取り出すつもりだ
802nobodyさん:2005/10/10(月) 00:12:41 ID:???
>>800
正規表現でキーを表現したいということでしょ。

$hash{/^ab/} = 3;
とか。

実際には tie して
$hash->{'^ab'} = 3;
みたいになるんだろうけど
803nobodyさん:2005/10/10(月) 00:14:08 ID:???
>>801
複数マッチしたら、配列で返ってくるとかじゃないかな?たぶん
804nobodyさん:2005/10/10(月) 00:22:16 ID:???
grepじゃできないようなことなのだろうか。
805nobodyさん:2005/10/10(月) 00:23:35 ID:???
ハッシュ引くだけなら grep で出来そうだね
806nobodyさん:2005/10/10(月) 00:35:51 ID:???
>>803
マジでーーー知らなかったスマソ
807nobodyさん:2005/10/10(月) 01:54:54 ID:???
>>802
> 正規表現でキーを表現したい
それだけなら tie なんざせんでも。

my $str = 'abcabcdefdefabcdefabef';
my %hash;
$hash{$_} = [ $str =~ /($_)/g ] for (
  qr/^abc/,
  qr/ab./,
  qr/.fd.*?f/,
  qr/\d/,
);
print "$_ : ", join(', ', @{$hash{$_}}), "\n" for sort keys %hash;

正規表現にマッチするキーが持つ値を

@values = $hash{ qr/^abc/ };

のように取り出したいというのなら、ラッパーを
探すなり書くなり、という話になると思うが。
808nobodyさん:2005/10/10(月) 03:48:24 ID:???
>>796
単純に

print grep { /$regex/ } keys %hash;

でOK。
809nobodyさん:2005/10/10(月) 03:50:32 ID:???
マッチするキーの値を求めたいなら

print map { $hash{$_} } grep { /$regex/ } keys %hash;
810nobodyさん:2005/10/10(月) 09:58:24 ID:???
@hash{grep /$regex/, keys %hash }
811nobodyさん:2005/10/10(月) 11:52:25 ID:gKZw7BFl
質問させて下さい。

見よう見まねで以下のようにgethostbyaddrを使ってみたのですが
$addr = $ENV{'REMOTE_ADDR'};
$wkaddr = pack('C4', $addr);
use Socket;
$host = gethostbyaddr($wkaddr, AF_INET);

結果にYahooBB〜.bbtec.netってのが返ってきました。
使い方はこれであってるんでしょうか?
812nobodyさん:2005/10/10(月) 12:56:52 ID:???
是が非でもマニュアルは読みたくないと、そうおっしゃるか。
813nobodyさん:2005/10/10(月) 13:53:46 ID:???
>>811
つかおまいはどういう結果を期待してgethostbyaddrを使ったんだ
814nobodyさん:2005/10/10(月) 13:58:02 ID:???
見よう見まねって・・
815811:2005/10/10(月) 16:13:54 ID:gKZw7BFl
gethostbyaddrの結果がYahooBBだけは入っているのですが、それ以外のプロバイダは空に
なっています。どうしてでしょうか?
お願いします。
816nobodyさん:2005/10/10(月) 16:18:09 ID:???
どうなるのか分からない関数を
何が欲しいのか分からない状態で使って
結果が正しいのかどうかも分からないって…
それは質問なのか?
817nobodyさん:2005/10/10(月) 16:22:46 ID:1/g44L9c BE:180711348-##
とりあえず pack('C4', split(/\./, $addr)) だろ。
818nobodyさん:2005/10/10(月) 22:40:59 ID:???
今Perlでプログラム組んでいてほぼ完全に動作しているのですが、原因が分からないのですが何かの切っ掛けでこの部分がたまにエラーを吐いてきます。

129 : foreach(keys %an){
130 :  $data = sprintf("%08d\t$_",$an{$_});
131 :  push(@count,$data);
132 : }

エラー内容は
Modification of a read-only value attempted at test.cgi line 130.
なのですが、このエラーの修正方法が分かりません。
このスレでいいのかちょっと謎ですが宜しくお願いします。
819nobodyさん:2005/10/10(月) 22:55:19 ID:???
>>818
分からないエラーが出たときには、そのエラーメッセージでぐぐると良いですよ。
$dataが定数になっていたり、その行の変数、どれか tieしてませんか?
820nobodyさん:2005/10/10(月) 23:44:14 ID:j4NUbQ7s
質問です。。
学校の宿題なんですが・・・初歩の初歩で質問するのもはずかしー問題かもしれません・・・
Hex number を入力してそのNumberをDecに変換し、さらにoctal number を decimal にするプログラムを作れ。
っていう問題です。
一応自分で書いたのは・・

#!/perl
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print $hex,;

とりあえず、Hex→Decの変換をやってみようと思ってここまで書きました。
これだと、例えば、0xFFっていれても255って返ってこずにそのまま、0xFFって出ちゃうんですよね・・・
神様助けて・・・
821nobodyさん:2005/10/10(月) 23:52:05 ID:???
822nobodyさん:2005/10/10(月) 23:52:46 ID:???
>>820
それさ、そこに書いてある部分が問題文、
というか「これを拡張して書け」みたいな感じなんじゃない?

変換しろって言うんだから、変換しなよ。簡単だぞ。
がんばれよ。
823820:2005/10/11(火) 00:01:28 ID:ydWxrZ97
>>821,822 さんレスありがとうございます。
んー。。
変換する式みたいなもんがあるんでしょうか?
print 0xFF,;
って書くと勝手にPerlが普通の数字に変換してくれますが、内部でどのように変換してるんでしょか?
なんか、三角形の面積を求める公式みたいな計算式があればできるっぽいんですけど。。
もう一度一から教科書読み直して勉強してみます・・・。
824nobodyさん:2005/10/11(火) 00:02:58 ID:???
先生としては、きちんと基数変換のコードを
書いてもらいたいんだろうなぁ。
825nobodyさん:2005/10/11(火) 00:09:26 ID:???
>>824
それひどくねー?
826820:2005/10/11(火) 00:22:37 ID:m+2zbTP9
えー。途中経過です・・

#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print hex $hex,;

としたら、0xFF→255
となって変換できたんですけど・・こんなエラーが↓

Illegal hexadecimal digit'
' ignored at ex2.plx line7, <STDIN> line 1.
255

このエラーの最後に255って出たんですけど。。このエラーは無視したら怒られますか??
ま、いっか。おし、次はOctal!
827nobodyさん:2005/10/11(火) 00:28:56 ID:???
ヒント:$hexの中にはあれも入って…
う〜ん。怒られないと思うけど、初歩的な悪い例として取り上げられるかもw
828nobodyさん:2005/10/11(火) 00:39:23 ID:???
<STDIN>使うなら、chompも書いておいた方がいいかと
829820:2005/10/11(火) 00:44:24 ID:m+2zbTP9
hex と同じように octal も

#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print hex $hex,;
print "\n Please enter the Octal number:";
my $oct = <STDIN>;
print oct #oct,;

って感じに書いたら、、、
Use of uninitialized value in oct at ex2.plx line 10, <STDIN> line 2.
0

ってなって数字が0に!!

うーん。初歩的な悪い例ですか・・・$hex の中になにか良くないものが入ってるっぽいんですね・・・。
しかし、なんでOctalの場合だと0に・・・

もうちょいがむばってみます・・・
830827:2005/10/11(火) 00:44:30 ID:???
>>828
そうなんだけど、宿題だからヒントで止めておいたw
しっかし、まだあこで引っかかりそうだな。
831827:2005/10/11(火) 01:01:39 ID:???
>>828ででちゃたんで書きますけど…
>>826のソースでエラーがでるのは$hexにchomp関数を使用していないからです。
$hexの中には0xFF\nと入ってます。その\nを取り除くためにchomp関数を使います。

chomp関数とはなんぞや?
ttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl&method=chomp

>>829についてはEasy mistake

それでは、おやすみなさい。
832nobodyさん:2005/10/11(火) 01:12:14 ID:???
も− print eval(<STDIN>); でいいんでない? 点数もらえないだろうけど。
833nobodyさん:2005/10/11(火) 01:12:39 ID:???
>chomp関数とはなんぞや?
いや、お前よりかはみんな知ってると思うが・・・^^;
834827:2005/10/11(火) 01:22:05 ID:???
>>833
馬鹿め!>>820宛に書いた文章だぞ。俺だってchompぐらい知ってる。

chomp関数とはなんぞや?(その下の行に簡単にわかるリンク先)
ttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl&method=chomp

俺ってなんて優しいんだw
835nobodyさん:2005/10/11(火) 01:26:50 ID:???
その前に誰か >>829
× print oct #oct,;
〇 print oct $oct;
って教えてやれよw
836827:2005/10/11(火) 01:32:09 ID:???
>>835
はっきりとは教えないようにしてたんだよ。
宿題だし、本人はやる気あるみたいだからな。
837nobodyさん:2005/10/11(火) 01:45:08 ID:???
メモ帳で書いてるんかね。
テキストエディタだったらすぐ気づきそうな。
838nobodyさん:2005/10/11(火) 02:14:26 ID:???
きっとvi使ってるんだろう
839nobodyさん:2005/10/11(火) 10:24:06 ID:4r4FVZwb
#!/usr/bin/perl
$kexp= 200;
$pexp= 676;
$bexp= 267;
$kexp= $a;
$pexp= $b;
$bexp= $c;
$a + $b + $c= $d;
print $d;

何がいけないのかな?
840nobodyさん:2005/10/11(火) 10:28:16 ID:???
>>839
数学ではなく、算数からやり直してきてください。
841nobodyさん:2005/10/11(火) 10:33:04 ID:4r4FVZwb
算数ぐらいできますよお〜
それを、cgiとして使うと500になるんです。
数字の200とかは、適当に使ってるやつで、
ただのテストCGIなんだけど、上手く動かないorz

どこを改善すればいいんだ・・・。
842nobodyさん:2005/10/11(火) 10:40:14 ID:???
>>839
httpヘッダ出してないからだろ。
加えて一行目のperlパスが違うってのもあるかもしれないが。
843842:2005/10/11(火) 10:45:14 ID:???
あ、違うわ。そもそもおまい代入の方向間違ってるよ。
「=」の左辺に右辺の結果が代入されるんだぞ。
ちょっと勉強しなおして来い。一発で見抜けなかった俺も修行してくるから。
844nobodyさん:2005/10/11(火) 10:49:14 ID:4r4FVZwb
ぉ、よ〜く考えてみればそうだ・・・
じぇんじぇん頭が回ってなかったなw
よ〜し、では修正に逝ってきますw
845nobodyさん:2005/10/11(火) 10:53:23 ID:4r4FVZwb
#!/usr/bin/perl
$kexp= 200;
$pexp= 676;
$bexp= 267;
$a= $kexp;
$b= $pexp;
$c= $bexp;
$d= $a + $b + $c;
print $d;

んで、一応上記のとおりに直しました。
その後はどうすればいいんですかね??
まじ、初歩的ですまんorz
846nobodyさん:2005/10/11(火) 11:03:44 ID:iD4ymnU6
Server: Apache/1.3.33 (Unix) mod_perl/1.29
Image::Magickで画像の出力を試しているのですが、
Firefoxで以下のエラーメッセージが表示され上手くできません。
"画像ファイル "http://test.notw.biz/sample.cgi" は壊れいているため、表示できませんでした。"

シェルから実行したところ上手く画像は出来ているのですが、
ブラウザから動かすとうまく行きません。
http://www.gac.jp/article/index.php?stats=question&category=12&id=15812&command=msg
も参考にしましたが駄目でした。

use Image::Magick;

my $img_bg = new Image::Magick;
$img_bg->Set(size=>"90x9");
$img_bg->ReadImage("xc:pink");

print ("Content-type: image/png \n\n");
binmode STDOUT;
$img_bg->Write("png:-");
print "\n";

解決方法は何かないでしょうか?
>> $img_bg->Write("png:-");
を強制的にフラッシュ出来れば何とかなりそうな気はするのですが。。。
847nobodyさん:2005/10/11(火) 11:24:44 ID:???
ハゲワラwww
848nobodyさん:2005/10/11(火) 11:26:44 ID:???
>>818
>原因が分からないのですが何かの切っ掛けでこの部分がたまにエラーを吐いてきます。
>
>129 : foreach(keys %an){
>130 :  $data = sprintf("%08d\t$_",$an{$_});
>131 :  push(@count,$data);
>132 : }

"%08d\t$_"は、$_の内容に応じて、展開結果が変わる。
展開結果の中に書式指定文字列としてタブーなものが混じることもあるから、
「たまにエラーを吐く」ということになるのだろう。
$data = sprintf("%08d\t%s", $an{$_}, $_);
のようにすると解決すると思われ。
849nobodyさん:2005/10/11(火) 11:59:20 ID:???
たぶん printf "%n"; みたいなことになったんじゃ?
850nobodyさん:2005/10/11(火) 12:14:19 ID:???
>>845
どうすればいいって、直した結果どうなったのよ?
相変わらず500エラーなん? >>842とか確認したん?
851nobodyさん:2005/10/11(火) 12:26:14 ID:4r4FVZwb
相変わらず500です。
ヘッダーの足し方がいまいち不明で、
どこら辺に足せばいいのかがわからなくて、
ただいま格闘しておりました・・・。

ですが、ヘッダーがどんな物かはわかるんだけど、
やはり場所が不明で500になってしまいます。
852nobodyさん:2005/10/11(火) 12:30:16 ID:8zYGlOye
すいません
質問があります。
foreach(sort @data){
としたいのですが@dataの中身はカンマ区切りで2番目と3番目のキー
でソートしたいのですが方法はありますでしょうか?
853nobodyさん:2005/10/11(火) 12:30:33 ID:???
>>846
最後の print"\n"; が要らないんじゃないかなぁ。
Firefox以外のブラウザだとどうなのさ?
854nobodyさん:2005/10/11(火) 12:34:55 ID:???
>>851
わかってないことをわかったように言うな。
#!/usr/bin/perl
print "content-type:text/plain\n\n";
$kexp= 200;
$pexp= 676;
$bexp= 267;
$a= $kexp;
$b= $pexp;
$c= $bexp;
$d= $a + $b + $c;
print $d;

これで動かなきゃあとは一行目だ。
855nobodyさん:2005/10/11(火) 13:18:47 ID:???
「今度はダウンロードになってしまいます」、とか言ってきそうだ。
856nobodyさん:2005/10/11(火) 13:28:06 ID:???
こういう輩に限って動き始めると事後報告そっちのけになるからな
857846:2005/10/11(火) 15:16:03 ID:???
>>853
print を抜いても
IE、Operaで試してみても駄目でした。

色々調べているのですが
どうにも手に負えそうにないので別な方法を考えようと思います。

ありがとうございました。
858nobodyさん:2005/10/11(火) 15:39:12 ID:???
>>852
sort について調べなされ。
自分で条件を書けるから。
859nobodyさん:2005/10/11(火) 15:40:53 ID:XkXcz5GJ
perlは、
$1と書かなければならないところで\1と書くとうまく動作しませんが、
\1をすべて$1と書きかえて問題が生じることはありますか?
860nobodyさん:2005/10/11(火) 15:45:22 ID:???
>>859
あります。
861796:2005/10/11(火) 19:28:50 ID:???
皆様、遅ればせながらご返答有難うございました。

私のやりたかったことは、
if($form{read/([0-9a-zA-Z]+)/]}){ print $1; }
このような判定がかけられればと質問させていただいた次第です。
説明不足ですみませんでした。

順次試させていただきます。
有難うございました。
862nobodyさん:2005/10/11(火) 21:15:56 ID:???
>>859
とりあえず簡単な例は "\\1" だな。
863nobodyさん:2005/10/11(火) 21:18:28 ID:???
>>796
お前がそう書いたらどういう風に動くことを期待しているのか
説明してくれないと結局何がなんだかわからないわけだが。
864820:2005/10/11(火) 21:49:41 ID:???
みなさんご指導ありがとうございました。おかげさまで宿題無事にSubmitでけそうです・・・
一応できたの載せときます。
#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
chomp($hex);
print hex $hex,;
print "\n Please enter the Octal number:";
my $oct = <STDIN>;
print oct $oct,;

一番まいったのが$と#の違いに気づくのに1時間近くかかったことでしょうか・・・
いや〜Perlって奥が深い
865nobodyさん:2005/10/11(火) 21:54:48 ID:???
>>864
とりあえず、動きましたねw
おめでとう!
866820:2005/10/11(火) 21:55:29 ID:m+2zbTP9
質問です・・・・
Decimalを256以下の数字で聞いてきて、それをBinaryにコンバートするプログラムをつくっれ
っていうものなんですが・・・ヒントがあって、(bitwise operator 8回使用)
っていう問題なんです。
これって、IF使わないとだめなんでしょうか?それともIF使わないでもできるっぽいです?
まだIF習ってないのでもしかしてこれは誤問題じゃないか!?
って疑惑があがって来てるんですけど。。
できるんですか?教えて神様
867nobodyさん:2005/10/11(火) 21:57:37 ID:???
>>864 バグありますよ
868796:2005/10/11(火) 21:58:13 ID:???
>>863
すみません。

existsってありますよね。
これの正規表現版のようなことをしたかった次第でございます。
そして可能であれば存在するキーの一部を後方参照できれば、と
先ほどの書き込みをさせていただきました。
869nobodyさん:2005/10/11(火) 22:06:58 ID:???
>>796
つまりあるハッシュが与えられた正規表現にマッチするキーを
もってるかどうか判定したいということだろうか。
870nobodyさん:2005/10/11(火) 22:15:43 ID:???
つまりgrepで十分なので既に回答はでてると。
871nobodyさん:2005/10/11(火) 22:30:14 ID:???
>>866
とりあえずIF文はいらんよ。
つかネット環境まであるなら宿題は自分で調べようや。
872nobodyさん:2005/10/11(火) 22:32:14 ID:???
まず>>1をよく読む
873796:2005/10/11(火) 22:41:01 ID:???
>>869
おっしゃるとおりです。
可能であれば、+後方参照もということでした。

>>870
帰宅後やってみたいと思います。

色々とご返答有難うございました。
874nobodyさん:2005/10/11(火) 23:03:18 ID:C7OEkxia
$hoge = "運転中";
$hoge2 = "運転";

if($hoge =~ /$hoge2/){
print "ok";
}

マッチしないんですけど、なぜでしょうか。。
875nobodyさん:2005/10/11(火) 23:03:56 ID:???
>>851
えーとな、sort サブルーチン以外の場所で $a と $b を使うのはやめれ。
俺が混乱するから。
876nobodyさん:2005/10/11(火) 23:08:27 ID:???
>848
激しくありがとう!
877nobodyさん:2005/10/11(火) 23:25:44 ID:???
>>874
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#errors
の、「マッチするはずなのにマッチしない (1)」
878nobodyさん:2005/10/11(火) 23:28:54 ID:???
>>874
quotemeta 使え
879nobodyさん:2005/10/11(火) 23:33:36 ID:???
それよりもSJISやEUCの違いに触れてやった方が、
今後のためにもいいんじゃないのか
880nobodyさん:2005/10/11(火) 23:39:41 ID:???
quotemetaが何をするかを調べれば自ずと分かるから、良い回答だと思うけど。。
今後は結局本人次第かと。
881820:2005/10/12(水) 00:22:26 ID:???
宿題は昔から自分でやれという決まりですよね。。。と、いうことで、一応できたので載せときます・・・念のため。。。
#!/perl
print "Please enther the decimal number which is between 0 and 255\n";
my $input = <STDIN>;
if ($input >= 127) {print "1";
$input = $input - 126;
}else{print"0";}
if ($input >=64){print"1";
$input = $input - 64;
}else{print"0"; }
if ($input >=32){print"1";
$input = $input -32;
}else{print"0"; }
if ($input >=16){print"1";
$input = $input -16;
}else{ print"0"; }
if ($input >=8){print"1";
$input =$input -8;
}else{print"0"; }
if ($input >=4){print"1";
$input = $input -4;
}else{print"0"; }
if ($input >=2){print"1";
$input =$input - 2;
}else{print"0"; }
if ($input >=1){print"1";
$input =$input -1;
}else{print"0"; }
IF使う方法しかどうしても解りませんでした・・・なにはともあれ御指導ありがとうござました。
882nobodyさん:2005/10/12(水) 00:23:12 ID:???
久々に目がくらんだ
883nobodyさん:2005/10/12(水) 00:28:47 ID:???
ビックリ!
884nobodyさん:2005/10/12(水) 00:38:54 ID:???
>>881
俺が直してやるよ。
Please input a number between 0 and 255.
885nobodyさん:2005/10/12(水) 00:41:00 ID:???
自分でやれってか友達いねーのかよと。
886nobodyさん:2005/10/12(水) 00:50:53 ID:???
>>881
>>864のバグはわかったの?
887nobodyさん:2005/10/12(水) 00:52:30 ID:???
>>886 優越感に浸りたいだけの馬鹿は嫌われるぞ。
888886:2005/10/12(水) 00:55:45 ID:???
>>887
(°Д°)ハァ?
バグがあるからあると指摘しているだけだけど…
優越感に浸りたいのはお前だろ!
889nobodyさん:2005/10/12(水) 01:11:03 ID:???
>>888
わかったからその目がキモい顔文字を引っ込めてからまた来ような
890nobodyさん:2005/10/12(水) 02:02:11 ID:???
>>881
ヒント:pack/unpackの"B"。
891871:2005/10/12(水) 02:14:08 ID:???
>>881
ちょwwwおまwwwwwビット演算子使えって言われてるのに
どうしてそういう答えになるんだよw ビットシフト使うんだよw
おまい授業ちゃんと聞いてないだろ。ちょと必死に基礎から勉強しなおせ
892nobodyさん:2005/10/12(水) 02:36:00 ID:???
しかし if すら習ってないのに、あまり使わないビット演算なんか教えるんだ?
変わってる気がするのは俺だけか。
まあ hex や oct も習ってるしその延長かなあ。
perl なんだから、もっと目的があって作ってて楽しいことから教えればいいのに、って思っちゃう。
893nobodyさん:2005/10/12(水) 03:01:29 ID:???
>>892
IFとかの基礎部分を習ったのに忘れてるだけだと思う
894nobodyさん:2005/10/12(水) 05:26:24 ID:???
お手軽なperlを使ってbit処理の概念とかを学ばせようとしている希ガス
つかif文使うにしても>>881はあんまりだろw
895nobodyさん:2005/10/12(水) 11:38:44 ID:???
確かに、ビット演算子を使わなくていいなら、これで決まりだよな。

my $input = <STDIN>;
printf ("\nbinary = %b", $input);
896nobodyさん:2005/10/12(水) 12:02:57 ID:fQz+s6Mx
配列から特定の値をとりだすにはどうしたいいですか?

たとえば@dataの中にあいえおかきけこさしすせそ
が入ってるとします。「け」の文字だけ抜き出して$keにいれる
のはどうしたいいですか?順番が変わらないで$data[6]と添え字にすればいいかも
しれませんが、「け」の位置がいつもそことは決まってないんです。
先頭に来る場合もあれば、2番目にくる場合もあるんですね。

こういう場合、配列から取り出したい文字列を抜き出すのはどうやったら
いいのでしょうか?

ご教授お願いいたします。
897nobodyさん:2005/10/12(水) 13:00:06 ID:???
>>896

@dataを使う必要はない。
$ke = 'け';
898nobodyさん:2005/10/12(水) 13:32:50 ID:???
たしかに取り出したい文字列があらかじめわかっているなら
取り出す必要はないよなw
899nobodyさん:2005/10/12(水) 15:39:29 ID:???
なななんだ!?>>896はつりだったのか!?
900nobodyさん:2005/10/12(水) 16:08:46 ID:???
>>881
>宿題は昔から自分でやれという決まりですよね。。。

本来はそうなのだが、今回は特別だ。
教官が感激してくれるようなものを作ってやったぞ。

print "input number: ";
my $input = <STDIN>;
printf ("\n【照合用】 %08b", $input);

print "\nmybinary = ".binconv(0x80, $input);

sub binconv{
my ($binseed, $input) = @_;
return ($binseed ||"") && (($input & $binseed) && 1).binconv($binseed >> 1, $input);
}
901nobodyさん:2005/10/12(水) 16:19:17 ID:???
>>900先生!
print "input number: ";
my $input = <STDIN>;
printf ("\n【照合用】 %08b", $input);
これだけでもいいかと思うんですが…
>>820の教官の問題にも問題があると思ってるのは漏れだけですか?
902nobodyさん:2005/10/12(水) 18:37:38 ID:???
>>901

>>900 の回答は、>>866 の宿題に対するものだけど、
「ビット演算子を8回使う」という条件があるみたいだから、
printfの出力はあくまでも参考のみ。
903901:2005/10/12(水) 18:55:56 ID:???
>>902
>>900先生のコードはすばらしいと思うのですが…
なんでこんな問題を…と少し思ったしだいです。
>>820がどんな教科書で勉強してるのかも興味ありです。
904nobodyさん:2005/10/12(水) 19:14:52 ID:???
ハッシュって値を格納した時点で箱の中のランダムの枠内に
入れられてしまうので、その後に入れた順番でソートをかける
ことは不可能という認識で間違いございませんでしょうか。
905nobodyさん:2005/10/12(水) 19:50:30 ID:???
>>904
ハッシュを eash/keys/values/配列コンテキスト等で読み出した
際の順序は、人間にとっては一見ランダムだが、perl 自身に
とってはランダムではないし、何回呼んでも必ず同じ順序になる。

入れた順序に関係なく、目的の値を分かり易い名前で素早く取り
出せるように作られているのが今の perl の実装なので、入れた
順序が重要なら、それに適したデータ構造 -- 配列を利用するか、
Tie::IxHash のようなラッパーを使う。
906820:2005/10/12(水) 22:09:26 ID:???
>>900
すごいプログラムありがとうございます。
ですが宿題はすでに提出してしまいました。。
なので今後の参考にさせていただきます

>>903
使ってる教科書は学校でSubject毎に買わされる・・・なんていうんでしょう・・・。
70ページくらいのノートブック?っといったほうがいいかもしれません。

学校はオーストラリアのCollegeで日本で言う職業訓練校を低レベルにしたみたいなとこでしょうか・・・。
今回のSubjectの題名がNetwork Application Solution でこの教科書の2/3程がPerlについて、
残りがVBのDebuggingについてとか、あとはJAVAはなんだ、ActiveXはなんだProxyServerがどうとか
いう説明がちょちょってあるほんとにみすぼらしい構成になっております。
ちなみにこの教科書にはIFとかの説明は載ってません。
さらに今回のSubjectはALL Selfstudyなので先生はまったくと言ってイイほどなにも教えてくれません。
ここに書いた二つの問題はこのエセ教科書の”Acitivy"からの問題です。

以上の理由により、多少奇抜な内容になっています。>>903 さんが興味をもったのもうなずけます・・・。

なにはともあれPerlのセクションの宿題は今回ので無事全部終わりました。
レスくれた皆様ありがとです!
907nobodyさん:2005/10/12(水) 22:12:57 ID:???
オーストラリアか。。
908nobodyさん:2005/10/12(水) 22:19:58 ID:???
夜中の12時オーストラリアの地図を描く
909nobodyさん:2005/10/13(木) 00:17:06 ID:???
NULL文字を正規表現で表すとどのようになるのでしょうか。

ご教示いただけますと幸いです。
910903:2005/10/13(木) 00:29:57 ID:???
>>906
なるほど。そうでしたか…何か妙な感じがしたんですよね。
お疲れ様でした&今後もがんばってください。
911nobodyさん:2005/10/13(木) 00:32:47 ID:???
>>909
NULLという文字列?NULL定義された変数?
definedが知りたいのかな?
912909:2005/10/13(木) 00:33:27 ID:???
すみません。
やりたいことは、QUERY_STRINGの判定に
(\W|)c=3
このようなイメージの指定をしたいのですが、ようは英数字以外が
cの前にきた場合と「?c=3」と前に何もない場合を指定したいという
ことです。

説明下手ですみません。
913nobodyさん:2005/10/13(木) 00:34:52 ID:???
>>911
Cの文字列のターミネータになるASCIIコード0のことじゃなかろか

ということで>>909
/\0/
914nobodyさん:2005/10/13(木) 00:37:18 ID:???
>>912
ああ、失礼、それなら先読み否定アサーションを使うべし
(?<!\w)
915nobodyさん:2005/10/13(木) 00:40:44 ID:???
>>820 のperlの勉強は終わったらしいが、まだ perl の p も始めてない気がするなあ。カワイソス。
916nobodyさん:2005/10/13(木) 00:42:22 ID:???
CPU食わないで指定秒ストップさせることは出来ますか?
sleepだと5%ぐらい使ってしまってるみたいで・・・
917914:2005/10/13(木) 00:43:52 ID:???
後読み否定だったorzハズカシス
ついでだから>>912のようにやるならばという別解も書いとこう
(^|\W)
918909:2005/10/13(木) 00:46:02 ID:???
>>913-914
ご教示有難うございます。
ぐぐって調べてみましたが、どうやらこれは

(?<!...) ゼロ幅の否定後読み表明

みたいですね。
私には少し敷居が高そうなので、もう少し勉強してみます。
とにかく有難うございます。
919909:2005/10/13(木) 00:52:49 ID:???
>>917
すみません、行き違いになりました。
なるほど、と試してみましたが、なぜか引っかからなくなって
しまいました。

調べてみます。
920766:2005/10/13(木) 00:53:02 ID:???
>>777 766です。大変遅ればせながら
921909:2005/10/13(木) 01:00:44 ID:???
経過報告です。

× (^|\W)c=1
× (^)c=1
○ ^c=1

なんででしょうね。。
もう少し調べてみます。
922766:2005/10/13(木) 01:07:08 ID:???
↑Enterで書き込みになってた。。。スレ汚しすません

>>777
遅ればせながらレス有難うございます。
しかしながらいまだcsvへの書き込みが上手くいきません。。

やりたいのは、csv開いたときに

名前,Q1の回答,Q2の回答,Q3の回答。。。。
空欄,Q1の正解,Q2の正解,Q3の正解。。。。

と横並びにカンマ区切りで出したいのですがいろんなソースを入れてみても
上手くいきません。。泣
しかも名前を普通にFORM POSTからとりたいんだけど、どこにソース入れてもエラーになる。。

923766:2005/10/13(木) 01:08:08 ID:???
現在のソース要約はこんなのです。(.incのファイルはやめて普通にhtml→cgiにした。)

【question_1cgi】
# 質問の取得

&ReadParse;

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
}



924766:2005/10/13(木) 01:09:22 ID:???
# 回答の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
}
925766:2005/10/13(木) 01:09:56 ID:???
# csv書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT"ここがわかりません。。。";
print WRITE_BBSDAT"$val,$aval ←じゃ縦にならんじゃう。横にそれぞれ上下で表示したい。";
close(WRITE_BBSDAT);


どなたかお助けください。。お願い申し上げます。
926nobodyさん:2005/10/13(木) 01:12:17 ID:???
何が × なんだ?

my $query = 'c=0&d=1';
とか
my $query = 'ac=1&c=0&dc=0';

c=0 だけにマッチさせたいんだよな?

if ($query =~ /(?:^|(?<=\W))c=0(?:(?=\W)|$)/) {
print 'ok?';
}
でない?
927nobodyさん:2005/10/13(木) 01:13:53 ID:???
>>921
ありゃ、もしかしてPerlのバージョンが古いと動かなかったりするのかな
バージョンいくつか分かる?とりあえず5.6.1と5.8.7では動作したけど・・・
Perl4探してこよう・・・
928926:2005/10/13(木) 01:14:07 ID:???
>>921
929909:2005/10/13(木) 01:18:14 ID:???
>>926
おっしゃるとおりの条件にマッチさせたいと思っております。
そしてご回答有難うございます。
ちょっと私にはもう少し理解する時間が必要になりそうですが、
一つ一つ勉強していきたいと思います。有難うございます。

>>927
v5.8.4ですので、バージョンは問題ないかと思います。
検証してみます。お手数おかけしましてすみません。
930nobodyさん:2005/10/13(木) 01:28:27 ID:???
>>929
$query =~ /(?:^|(?<=\W))c=0(?:(?=\W)|$)/

分解すると

:^c=0 : $query の最初に c=0 があるとマッチ
(?<=\W)c=0 : c=0 の前に "[_0-9a-zA-Z] 以外" があったらマッチ
c=0(?=\W) : c=0 の後に "[_0-9a-zA-Z] 以外" があったらマッチ
c=0$ : $query の最後に c=0 があるとマッチ

(c=0(?=\W)) ってやらないで (c=0\W) ってやると、$1 に \W の文字が入ってしまうし、次のマッチの開始も \W の後の字からになってしまう。

つか正規表現スレにいくのはどうか。
931nobodyさん:2005/10/13(木) 01:37:50 ID:???
>>766,920,922-925
相変わらず何やってるのかわからんw
もうちょっとソースの中に #コメント を入れてみたらどうか。
自分で見て何やってるか分かったとしても、他人はそうではないのだから。

csv なのに
split(/,/); じゃなくて split(/\t/); ってやってるのはいいんだっけ?

あと
> print WRITE_BBSDAT"$val,$aval ←じゃ縦にならんじゃう。横にそれぞれ上下で表示したい。";
わからん。
縦になったのなら 「それぞれ上下」 にはなったんではないのか。

$val,$aval
ってなりたいのか
$val
$aval
ってなりたいのか。

とりあえず入力されたデータに改行が入ってるままファイルに書き出したらアホなことになるから、
foreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}
とか &ReadParse; の後にやってみたら?
932nobodyさん:2005/10/13(木) 01:47:35 ID:???
>>922
ふう、やっとやりたいことがわかった
まず処理手順が問題。今の処理手順だと質問一つずるに対して出力処理をしようとしているけれど、
全ての質問を一つの行にまとめたいなら、保存しておいて後で出力しないと。

# 回答の表示
の頭で
my @vals = ();
my @avals = ();
の二変数を作ってforeachの最後で
push @vals, $val;
push @avals, $aval;
で、foreachを閉じてから、cvs出力で、
print WRITE_BBSDAT join(',', $in{name}, @vals);
print WRITE_BBSDAT join(',', '', @avals);
って感じ。
933nobodyさん:2005/10/13(木) 01:56:30 ID:???
>>932 よくがんばったえらい
934nobodyさん:2005/10/13(木) 02:05:22 ID:???
>>930
コレじゃダメなん?
(?:^|\W)c=0(?:\W|$)
935909:2005/10/13(木) 03:20:42 ID:???
>>930,934
すみません、色々と勉強してました。
試してみましたが、おかげさまでうまくいきました。

しかしながら私の知識がまだ追いついていないこともございますので、
これから精進していきたいと思います。

本当にご親切に有難うございました。
936766:2005/10/13(木) 11:12:08 ID:???


レス有難う御座います。勉強足らずで申し訳ないです。

教えていただいたとおりにやってみますた。
でもやっぱりcsvをexcelで開いた時に思う通りになつてなかた。。なんでだろう
もうわからん。。

最終的にはexcelで開いた時

$in{name} ←これはくり返さない。1回だけ表示(下のセルへ)
$val ←これはその問題数分だけ横にくり返し。excelの横セルはひとつずつ違うセルに。(下のセルへ)
$aval  ←同様。(下のセルへ)

次の人
$in{name}
$val 
$aval

てなっててほしいんです。
説明へたでごめんなさい。
937766:2005/10/13(木) 11:16:18 ID:???
現状ソース

# 回答の表示
my @vals = (1,2,3);
my @avals = (1,2,3);

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/,/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;

push (@vals, $val);
push (@avals, $aval);
}
938766:2005/10/13(木) 11:17:24 ID:???
# csvへ書き込み

open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, @vals);
print WRITE_BBSDAT join(',', '', @avals);
close(WRITE_BBSDAT);

すいません。。ここまで教えてもらったのに。。
939nobodyさん:2005/10/13(木) 17:05:23 ID:tGcMLHwK
文字列の一部分を置き換える、という処理はどうすればいいでしょうか

入力されたデータによって、5文字目だったり12文字目の2文字分を
こちらで用意している(これも種類がいくつかある)2文字に置き換えたいんです

aaaaabbbbccddddeee → aaaaxxbbbccddddeee
aaabbbbcccdddddeef → aaabbbbcccddyydeef

一応
  ・置き換えたい位置を確認
  ・それより前をまず転記
  ・置き換え文字を転記
  ・置き換えたい位置よりあとを転記
という風にすれば可能だとは思うのですが、もう少しスマートな方法というのはあるのでしょうか?
940ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/13(木) 17:12:57 ID:???
>>939
substr() は?置換もできる。

my $str = 'foobarbaz';

substr($str, 1, 2) = 'OO';    # $str is 'fOObarbaz'
941nobodyさん:2005/10/13(木) 17:16:09 ID:???
>>939
s/// か
substr() をあたりなされ。

aaaaabbbbccddddeee → aaaaxxbbbccddddeee
5文字目から2文字分を置換なら、

my $str = 'aaaaabbbbccddddeee';
substr($str, 4, 2) = 'xx';

お、先に書き込みが。
942nobodyさん:2005/10/13(木) 22:16:24 ID:NiH4hrTC
ひさしぶりに掲示板を作ってます。
なんとか徹夜で終えて、明日の朝に間に合わせたいと思ってます。

思ったより疲れていて思い出せないのですが、
Text::CSV_XSの使い方何ですが、

「あいうえお
かきくえこ」

これってcombineを使えば改行をエスケープしてくれて、parseをしたときに自動で
元に戻してくれると思ってたのですが、勘違いですかね?
改行などその他すべての文字は必要に応じて自分でエスケープなどしないといけないのでしょうか?

でもそれだとこのモジュールの意味がないですよね・・・・;
CSVでのメタ文字?をエスケープしてくれた記憶があるのですが。。。。

どうぞよろしくお願いします。自分でも調べてみます。
943nobodyさん:2005/10/13(木) 22:19:27 ID:???
944942:2005/10/13(木) 22:26:57 ID:NiH4hrTC
>>943
英語は読めないので
http://www.perldoc.jp/docs/modules/Text-CVS_XS-0.23/Text-CVS_XS-0.23.pod
これは見ました。

ここに書いてないということは自分で<br>に変換するものでしたっけ?
よくよく考えたら別に自分でやっても大して面倒でもないレベルなのでどうでもいいですが。
"これだけかな?大丈夫なのは。
945942:2005/10/13(木) 22:50:16 ID:NiH4hrTC
返事がこないorz

もういいや

946nobodyさん:2005/10/13(木) 23:08:14 ID:???
>>945
どのような高速返信処理をお求めで?
947nobodyさん:2005/10/13(木) 23:23:07 ID:???
40分で返らないとだめなんかw
948nobodyさん:2005/10/13(木) 23:34:41 ID:???
> 思ったより疲れていて思い出せないのですが、
ここワロタ
949nobodyさん:2005/10/13(木) 23:40:28 ID:???
 徹夜するから3時ぐらいまででいいん…zzz
  <⌒/ヽ-、___
/<_/____/
950nobodyさん:2005/10/14(金) 01:39:33 ID:???
>>936-938
入れる場所そこじゃなーいorz
配列の初期データはテストデータだろうから置いておくとしても…

foreach (@question) {
...
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
} # このforeachの中じゃない

push (@vals, $val);
push (@avals, $aval);
} # pushしたらforeach (@question)のブロックは終わり

# csvへ書き込み
...

だ。も一つ問題点。ログ出力するとき改行忘れてた。スマソ
print WRITE_BBSDAT join(',', $in{name}, @vals), "\n";
print WRITE_BBSDAT join(',', '', @avals), "\n";

> $in{name} ←これはくり返さない。1回だけ表示(下のセルへ)
> $val ←これはその問題数分だけ横にくり返し。excelの横セルはひとつずつ違うセルに。(下のセルへ)
> $aval  ←同様。(下のセルへ)
>>922といってることが違う気がするのだが。
名前を別の行にしたいなら、そこだけ出せばよろし

>>931が指摘してる点の修正もお忘れなく
> とりあえず入力されたデータに改行が入ってるままファイルに書き出したらアホなことになるから、
951nobodyさん:2005/10/14(金) 02:57:23 ID:???
モジュールがどんな機能なのか一覧になっているとこはどこでしょうか。
日本語で。
952nobodyさん:2005/10/14(金) 06:40:23 ID:???
953939:2005/10/14(金) 12:01:06 ID:???
>>940-941
ありがとうございました
もっとよく調べればよかった・・・orz
954766:2005/10/14(金) 14:02:22 ID:???
>>950

レス有難う御座います。ほんとうに感謝です。


やっぱり配列の初期データ違いますよね。。。orz


この場合は何をいれたらいいんでしょうか?
$valは自分の選択した解答番号、&avalは正解解答番号
なので、これでいいとおもったんですが。。。

oreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}
とか &ReadParse; の後に。。。

ていうのもどこにそのそーすいれたらいいのか
わかりません。。

955766:2005/10/14(金) 14:05:19 ID:???
現状

# 回答の表示

  my($val) = ????; ←不明
   my($aval) = ????;  ←不明
my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/,/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
       }


956766:2005/10/14(金) 14:06:55 ID:???
push (@val, $val);
push (@aval, $aval);
} # pushしたらforeach (@question)のブロックは終わり

#csvへの書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, @val), "\n";
print WRITE_BBSDAT join(',', '', @aval), "\n";
close(WRITE_BBSDAT);
957nobodyさん:2005/10/14(金) 20:23:06 ID:???
がんばれ >>950
958nobodyさん:2005/10/15(土) 05:56:59 ID:???
>>954-956
おまい…配列(@)とスカラ($)を混同してるだろ…
初期化のところは何も入れなくて良いんだよ。中身はpushのところで入れてるんだから
my @vals = ();
my @avals = ();
で。むしろ混乱しているならこの部分自体なくてもよろしい

> ていうのもどこにそのそーすいれたらいいのか
だから&ReadParse;の後だって。>>923のソースの一番最初にあるでしょ

ってか、そのソースなら間違ってるところもあるがとりあえずは動くはずなんだが…
ソース全体をうpして見たらどうだろう。期待する出力結果についても、$valとか使わず、
実際にどういう風に出力されて欲しいのかを具体的に書いてもらえないと多分みんな分かってない。
漏れの認識としては、
1問目の正解:1 1人目の回答:2 2人目の回答:3
2問目の正解:2 1人目の回答:3 2人目の回答:1
3問目の正解:3 1人目の回答:1 2人目の回答:2
なら
----------------------
1人目の名前,1,2,3
,2,3,1
2人目の名前,1,2,3
,3,1,2
----------------------
という感じなんだが…

漏れの説明能力も限界ですorz 誰か他の人に任...
959nobodyさん:2005/10/15(土) 13:04:17 ID:???
乙w
とりあえず誰かが作ったほうが早いことはわかったw
960nobodyさん:2005/10/15(土) 14:18:15 ID:???
phpからの移行かなぁ。
アレだと配列もスカラもハッシュも$だからなぁ。(あの仕様はどうかと思う)
961nobodyさん:2005/10/15(土) 14:28:17 ID:???
他の言語は $ すらつかないのも多々あるけど、
どうせ $ つけるなら perl に合わせてくれてもいいのにな、とは思った。
962nobodyさん:2005/10/15(土) 15:59:18 ID:vVuUdULb
CSV形式のログファイルで掲示板を作ったのですが、
改行をどうしようか悩んでます。

\nなどを見つけたら<br>にしてから書き込んで見ました。
しかし読込表示処理の法で、HTMLエスケープしてるので<br>がエスケープされてしまいました。

それで改行を<br>以外にちかんして、読み込むときにそれを<br>に戻してやろうと思いました。
で、何に置換するかで悩んでます。

いまのところ\tとかしかないかなと思ってますが、ほかにもっといいのはありますか?
963962:2005/10/15(土) 16:19:46 ID:vVuUdULb
返事ないか・・・
もういいや
964nobodyさん:2005/10/15(土) 16:27:50 ID:???
&#13; とかオススメ。 今考えたけど。
つか最近こらえ性の無い人が多いですね。
965nobodyさん:2005/10/15(土) 16:33:09 ID:???
いやそれ以前の問題でっしゃろ・・・二十分て
# 回答員はこのスレべったり張り付いてるわけじゃないということをry

phpBBに習った構造なんかもありだと思うよ。[br]みたいにしておいて出力時にtr/[]/<>/
こっちのほうがちと冗長だけど汎用性はある
966nobodyさん:2005/10/15(土) 16:51:14 ID:???
次は10分だな。

ちなみに俺の回答は読み込み表示処理の見直しかな。
967nobodyさん:2005/10/15(土) 17:30:53 ID:???
回答員ていいなw 点呼したら5人くらいしかいなさそうだが
エンティティは書き込み時に行うのが一番いいと思うなり
968nobodyさん:2005/10/15(土) 17:31:58 ID:???
>964-966
掲示板とはどういうものかすらわかってない池沼はスルーで。
969nobodyさん:2005/10/15(土) 17:50:45 ID:???
うむ、HTMLエスケープ → \n 直し → ログ書き込み → ログ読み込み ってやればそんなことおきないもんな
970nobodyさん:2005/10/15(土) 18:07:03 ID:???
/\\/\\\\/g; /\r?\n/\\n/g;
もいいかもね。
971nobodyさん:2005/10/15(土) 18:38:22 ID:???
>>970
そうすると 'hogehoge\n\\n<改行>' と書いたときに 'hogehoge\\n\\\\n\n' ってなるんだけど、
一発で '\\n' や '\\\\n' にマッチしないで '\n' だけにマッチするのって難しくない?
972nobodyさん:2005/10/15(土) 20:53:21 ID:???
>>971
えっと、言ってる意味がよくわからないんだけど、コレじゃダメかな?

$txt = "hogehoge\\n\\\\n\n";
$txt =~ s/\\/\\\\/g; $txt =~ s/\r?\n/\\n/g; # escape
$txt =~ s/\\(.)/($1eq'n')?"\n":$1/ge; # unescape
973nobodyさん:2005/10/15(土) 23:27:59 ID:???
例えば
<f\o\r\m \n\a\m\e="test" />
こうなってるHTMLタグから\を消そうと思い

$str = '<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />';
$str =~s/(<[^>]*)?\\([^<]*>)/$1$2/g;

とやったのですがうまくいきません。結果として$strには

<div>\\<form name="test" />\\<br />

と、タグ内だけの\を省きたいのですがどのようにすればよいでしょうか?
974nobodyさん:2005/10/15(土) 23:41:42 ID:???
>>973
ここでの問答や今やってる事を全て忘れて、
入門書を一冊買って読めばいいんじゃないかな。
もしくはつきっきりで教えてくれる人でも探すとか。
今の状態だと何スレ消費しても先に進まなそうだし。
975nobodyさん:2005/10/15(土) 23:43:09 ID:???
Perlコーディングに関係ねーし
976nobodyさん:2005/10/15(土) 23:49:17 ID:???
>>974
その反応待ってました。と言う事は難しく考えなければいいのか。
久々にやるから基本忘れてしまった・・・
977nobodyさん:2005/10/15(土) 23:51:09 ID:???
時々でいいから正規表現道場の事を思い出してあげてくださいです・・・
http://pc8.2ch.net/test/read.cgi/php/1105930285/
978nobodyさん:2005/10/16(日) 00:09:56 ID:???
>>973
タグ内だけ処理がしたいと。

my $str = '<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />';
my @tag = ();
$str =~ s/(<.*?>)/push(@tag,$1);'<>';/eg;
foreach (@tag) {
s/\\//g;#好き勝手に処理
}
$str =~ s/<>/shift(@tag);/eg;

そもそもなんでそんな処理が必要なの?仕様の方を疑っちゃうよ。
979nobodyさん:2005/10/16(日) 00:33:05 ID:???
>>978
サンキューです。
深い意味は無いですが、昔Perl使ってたの思い出してもう一度使おうかと思いとりあえず正規表現思い出すために自分で作った例題みたいな。
980nobodyさん:2005/10/16(日) 18:58:16 ID:???
>>973
その正規表現で最初のキャプチャはこう
<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />
     |←   $1   →| |← $2  →|
\e が最初なのは [^>]* が \ も食う最大マッチだからね
で、formタグ側は既にマッチし終えたから
(gオプションの)次はbrの方に行っちゃうのが一番大きい間違いだと思う
あとシングルクォート内でも \\ は \ に置き換えられるよ

gを使うならルックアラウンドアサーション使うか
1 while $str =~ s///; の形にするか
>>978のように2段階に分けて
sub myfunc { my $tmp = shift; $tmp =~ s/\\//g; $tmp; }
$str =~ s/(<[^>]*>)/ myfunc($1) /eg;
とかすればいいと思う
981766:2005/10/16(日) 21:56:12 ID:???
>>958

わけわかってなくてほんとうにゴメンなさい。。レス有難うございます。
csvに書き出して、それをDLしてExcelで開いたときに表示させたいのは、

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

です。

現状は
name1、hoge1
”空欄”,anser1
name1、hoge2
”空欄”,anser2
name1、hoge3
”空欄”,anser3

て縦に並んでしましまいます。。


982766:2005/10/16(日) 22:17:35 ID:???

今の全ソースです。普通のFORM POST .htmlから飛ばしてます。
【question1.cgi】

#!/usr/bin/perl
require "cgi-lib.pl";
# 質問の取得

&ReadParse;
foreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
} else {
&Print_Error("質問設定ファイルを読み込めませんでした。");
}


983766:2005/10/16(日) 22:18:42 ID:???
# 回答ページの表示
print "Content-type: text/html\n\n";
print qq!
<HTML>
<HEAD>
<META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP">
<TITLE>回答</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<TABLE BORDER=1 WIDTH="800px" BGCOLOR="#ffffff">
<TR BGCOLOR="E2E2EE">
<TD WIDTH="60px"><FONT SIZE=2><B>質問番号</B></FONT></TD>
<TD><FONT SIZE=2><B>あなたの回答</B></FONT></TD>
<TD WIDTH="50px"><FONT SIZE=2><B>結果</B></FONT></TD>
</TR>
!;

984766:2005/10/16(日) 22:19:34 ID:???
# 回答の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;

}

push (@val, $val);
push (@aval, $aval);
985nobodyさん:2005/10/16(日) 22:23:39 ID:???
何レスも使うんだったらどっかにうpしる
986766:2005/10/16(日) 22:25:05 ID:???
# csvへの書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, $val), "\n";
print WRITE_BBSDAT join(',', '', $year), "\n";
close(WRITE_BBSDAT);

print qq!
<TR BGCOLOR="#ffffff">
<TD><FONT SIZE=2><B>$key</B></FONT></TD>
<TD><FONT SIZE=2>$val</FONT></TD>
<TD><FONT SIZE=2>$aval</FONT></TD>
</TR>
!;
}

print qq!
</TABLE>
</HTML>
!;

あとこれに名前がはいっていなかったら送信できないようにする機能も
つけたいです。。

csvの書き込みと名前はいってなかったらエラーが動いたら完成なんです。
perlとかこれがほんとに初めてで、なんとかここまでやりました。。
どうかご指導お願いいたします。。実は仕事なんです。助けてください。。泣
987nobodyさん:2005/10/16(日) 22:31:22 ID:???
よもまつだな。
988nobodyさん:2005/10/16(日) 22:38:54 ID:???
>>986
おまいのコードのデバッグをしてやるスレじゃないよ。

問題が再現する最短のコードを載せるべし。

> 今の全ソースです。

今の全ソースなど載せるなよ。
989766:2005/10/16(日) 22:51:45 ID:???
みなさんのおっしゃるとおりです。。スレの無駄遣いすいません。。
990nobodyさん:2005/10/16(日) 22:59:21 ID:???
>>987の日本語が釣りであることを願う
991nobodyさん:2005/10/16(日) 23:04:21 ID:???
>>990が釣りであることを願う
992nobodyさん:2005/10/16(日) 23:45:46 ID:???
>>766
手伝ってやろうかとも思ったが「仕事」の二文字を見た瞬間にその気が失せた。
おまいもう少し考えて行動汁。
993766:2005/10/16(日) 23:51:24 ID:???
すません。。ここしかたよるところがなくて。。なんとかご指導願えませんでしょうか?ヒントだけでも結構です。後は自分でなんとかしたいと思っています。

何卒宜しくお願いいたします。。
994nobodyさん:2005/10/16(日) 23:56:43 ID:???
ヒントならいっぱい出てるし。
がんばって勉強してください。
仕事ならなおさらです。
995nobodyさん:2005/10/16(日) 23:59:50 ID:???
>>766
正直、このスレに完璧な答えが出てる。
これでわからないならもうその仕事は破棄しなさいな。
それが先方とお前の為だよ。
996nobodyさん:2005/10/17(月) 00:15:20 ID:???
え、仕事をこのスレで質問?
よもまつですな。

ヒキがいうのもなんだけど。
997932=950=958:2005/10/17(月) 00:45:14 ID:???
すまん、ソース全うpを提案したのは漏れだ。
>>766のところに上げて欲しかったんだけどな…

とりあえず次スレたててくる
998nobodyさん:2005/10/17(月) 00:48:33 ID:???
Perlコーディング初心者質問スレ Part 44
ttp://pc8.2ch.net/test/read.cgi/php/1129477637/
999nobodyさん:2005/10/17(月) 00:48:38 ID:???
仕事は今週中に   あと2日もあれば
やるぞ♪         余裕余裕         週末家で・・・        怒られればいいか・・・
  ∧∧    ∧∧      ∧∧  . .::::::::::::::::::::::::::┃::::::::::::::::::::::::::::::::::::::::::::  ∧||∧
 (・∀・)  ∩・∀・)   (・∀・)∩..::: ∧∧:::::::::::┃:::::::::::::::::::::::::::::::::::::::::::::::::(  ⌒ヽ
 / ⊃⊃ ヽ  ⊃ノ  /⊃  / .. :::('д` )::::::::┃::::∧ ∧::::::::::::::::::::::::::::::::::: ∪  ノ
 (  (    ヽ  )つ〜( ヽノ ...:::と  ヽ::::::::┃: ('д` )::::::(   )⌒ヽ;:::::::::: ∪∪
  (/(/'    (/     し^ J.. ...:::⊂,,_UO〜:┃:::(∩∩ ):::::|/.|/uと  )〜:::::::::::::::
      まだ2日間しか     残業すれば・・・    2chで聞けば・・・
                                         ↑
                                        今ここら辺
1000nobodyさん:2005/10/17(月) 00:49:51 ID:???
次スレたってる模様

Perlコーディング初心者質問スレ Part 44
http://pc8.2ch.net/test/read.cgi/php/1129477637/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。