Perlコーディング初心者質問スレ Part 44
Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
9 :
766 :2005/10/17(月) 00:55:59 ID:???
>>997 すいません。。ほんとに。おいらが悪いんです。ごめんなさいです。
前スレ999ワラタ
全然勉強してないうえ仕事でわかんなくて悩むんだったら、 誰か (ちゃんとしたスクリプトを書いてくれるとこ) に依頼した方が会社もお前もいい判断だろうに。 1〜2週間やそこら悩んでできないくらいだったらそのほうがはるかにコストパフォーマンスがよいハズ。 つかそんなことで雇ってもらえてるのが、何ていうか、うらやましい。
同じく、前スレ999ワラタ
13 :
766 :2005/10/17(月) 01:57:00 ID:???
>>11 おっしゃるとおりです。おいらもできるってゆっちゃったのがいけなかったんです。ほんとに前スレの999ですね。。。情けないです。
14 :
766 :2005/10/17(月) 01:59:05 ID:???
色々調べて何回もいろんなソース試したりしてここまでやったんですが、、もうだめぽ。。泣 今回だけマジで助けてほしい。。お願いします。
15 :
nobodyさん :2005/10/17(月) 02:03:32 ID:xem7pvIg BE:135532883-##
めずらしくこのスレ盛り上がってるじゃん。 うれしいよ。。
まだ766はいるのかな? まだ出来てないなら要点まとめて頂戴。 まずは、送信したフォームの情報が正しく所得できているのか。 ↓ POSTでなく、GETで値をみられるようにする。 データを保存する方法はわかっているのか。 ↓ 変数に入れた文字が保存できたのか調べる。
すみません、教えていただきたいのですが。 買い物などのWEBで、検索や完了まで時間がかかるとき、「ただいま検索(登録)中です」のような一時的画面を表示させたいのですが、 perlではどのような方法があるでしょうか? 一定時間(例えば1分とか)は、特定の一時ページを表示して、 完了した時に完了ページを表示するものをイメージしています。 javaなどでは時々このようなページを使っているとこがあるのですが。。。。 一応、小枝とかその他有名なサイトは見たんですが、 こういう点での会報がわからなくて。。。。
18 :
766 :2005/10/17(月) 02:50:52 ID:???
>>16 すいません。ありがとうございますです。
・送信したフォームの情報はexcelで開いたとき、名前が文字化け(EUCでやってるからだと思いますが、解決策わからず。。)
・変数にいれた文字(回答番号 1とか2とか)はcsvに数字で保存できています。
【お手上げ】
・前スレ
>>981 に書いたような並びでexcelに保存ができなし。。
・名前をいれてなかったらエラー(送信できない)ようにしたい。
です。何卒ご指導お願いいたします。。まじですいません。
19 :
16 :2005/10/17(月) 03:04:21 ID:???
まず、先にこれだけいっておきます。 「エクセルは関係ない」。 エクセルで読める表示形式で保存したいって言うのは最後の手段で、今はそこまでいってないので頭から忘れてください。 送信する ↓ データを受け取る ↓ ファイルに保存する 第一段階でHTMLのメソッドをgetに・・・ って現段階のコード、どっかにアップしてもらったほうが早そうね。 もうちょっと常駐しとく。
20 :
16 :2005/10/17(月) 03:21:03 ID:???
納期遅れのいいわけ考えながら寝ちゃったのかな?
というかまず766は出来ないことは「できない」と言う事を学ぶべきだと思う じゃないとまた同じ事繰り返す羽目になる
23 :
16 :2005/10/17(月) 04:19:43 ID:???
暇でネタもないので、とりあえず作ってみてる。
25 :
766 :2005/10/17(月) 04:40:42 ID:???
>>21 レス有難うございます。
ヒントだけでも結構です。。後はもちろん自分でなんとか完成させるつもりです。
何卒宜しくお願いいたします。
>>17 それ、perlとは関係ないだろう。
meta refresh か JavaScript 使いなされ。
27 :
766 :2005/10/17(月) 04:54:56 ID:???
28 :
16 :2005/10/17(月) 05:03:25 ID:???
最初のファイルを編集してるので。 希望動作は最初のとおりでいいのよね?
29 :
16 :2005/10/17(月) 05:12:34 ID:???
アプロダの指定よろ
30 :
766 :2005/10/17(月) 05:13:39 ID:???
>>28 まじですか ほんとに有難うございます。。
はい。希望動作は
>>18 に書いたものです。
今なんとか自分でもとりあえずエラー機能をつけようと思って
#入力チェック
if ($in{name} eq '') { &error('名前を入力してください',''); }
を頭につけてみたんですが、動きませんでした。。orz
何卒宜しくお願いいたします。
31 :
766 :2005/10/17(月) 05:16:11 ID:???
32 :
16 :2005/10/17(月) 05:30:28 ID:???
とりあえずあぷ ソース汚いままだけど保存はちゃんとされるはず。 読みにくかったfont size=2はスタイルに勝手に変えちゃったままですが。
33 :
16 :2005/10/17(月) 05:32:40 ID:???
やばっ、フォントの閉じたぐ全部消しちゃってるw
34 :
16 :2005/10/17(月) 05:41:52 ID:???
Lintで怒られまくったので、最低限もとのHTMLになるように戻しておきますた。
35 :
766 :2005/10/17(月) 05:42:40 ID:???
>>16 有難うございますです。マジで感謝です。
今試してみたんでうが、動かない。。泣
パーミッションもなおしますた。
はじめのはquestion_1.inc っていうふぁいると連動してたんですが、
作っていただいたものは関係ありますか?
question_1.cgiにいきなりアクセスですよね?
36 :
16 :2005/10/17(月) 05:44:24 ID:???
あ、1行目戻してないです。 usestrictでエラー追いやすいように一つにまとめました。
37 :
766 :2005/10/17(月) 05:53:08 ID:???
>>16 !!!!
でけてるー!!! 感謝です!
こんな朝方まで付き合ってくださって本当にありがとうございます。大泣
ソースみたらやっぱり全然違いますた。。
これは質問をquestion_1.tsvから読み込まなくても、index.html → post でquestion.cgiでももしかしていけますか?
38 :
16 :2005/10/17(月) 05:57:15 ID:???
質問を表示したソースをHTMLとして保存すれば出来ます。 perlの中の変数はかなり弄ったけど、フォームの部分は触ってません。
39 :
766 :2005/10/17(月) 06:04:44 ID:???
>>16 わかりましたです!やってみますです。
本当に有難うございます。
あと名前をcsvに書き出したいんですが、$in{name}で書き出せるのでしょうか?(配列は自力でやりますです。)
あとその名前が入っていなかったら、エラーにしたいんですが、さっき入れた if ($in{name} eq '') { &error('名前を入力してください',''); } じゃだめでしょうか?
これで最後の質問です。。ご指導おねがいできませんでしょうか?
40 :
766 :2005/10/17(月) 06:16:25 ID:???
>>16 すませんです。。せっかく作っていただいたのですが、
1人目の名前: name1
その人の1〜3問目の回答番号: hoge1, hoge2, hoge3,
1〜3問目の正解番号: anser1,anser2,anser3
2人目の名前: name2
・
とすると
name1、hoge1, hoge2, hoge3,(改行)
”空欄”,anser1,anser2,anser3(改行)
name2、hoge1, hoge2, hoge3,(改行)
”空欄”,anser1,anser2,anser3(改行)
・
になってませんでした。。。泣
hoge1,anser1(改行)
hoge2,anser2(改行)
・
になってました。。もう一度みてもらえませんでしょうか、、再度大泣
41 :
16 :2005/10/17(月) 06:23:47 ID:???
40をみてないときの39への回答 いつのまにか名前入力とか増えてたのね。 >あと名前をcsvに書き出したいんですが、$in{name}で書き出せるのでしょうか?(配列は自力でやりますです。) フォームで<input type="text" name="name" value="">としていれば$in{name}に入る。 >あとその名前が入っていなかったら、エラーにしたいんですが、さっき入れた if ($in{name} eq '') { &error('名前を入力してください',''); } じゃだめでしょうか? cgi-lib.plでのエラー表示用はCgiDie。CgiErrorでもいいけどどっちがいいとかは忘れた。 unless ($in{name}) { &CgiDie('名前を入力してください');} とりあえず、ヒキなおいらに頼るような仕事は今後受けないようしましょうね。 昔、友達に頼まれたCGIが、これによく似てたから作ってみただけですので。 ↑これも、ただ働きだったけど。
42 :
766 :2005/10/17(月) 06:36:14 ID:???
>>16 さん
レス有難うございます。やってみますです。
はいです。今後出来ない仕事は請けないです。(絶対)
>>40 の内容をいただいたソースもとにいじってみたんですけど
やぱりエラーでした。。
# CSVへの書き出し
open (CSV , '>>file.csv');
flock (CSV,2);
print CSV join(',', $in{name}, $in{'Q'.$i}), "\n";
print CSV join(',', '', $array[1]), "\n";
flock (CSV,8);
close (CSV);
43 :
16 :2005/10/17(月) 06:36:39 ID:???
>>40 こゆこと?
my$data;
my@q1;
my@q2;
for (my$i = 1; $i <= @question; $i ++) {
my@array = split("\t", $question[$i - 1]);
push(@q1, $in{'Q'.$i});
push(@q2, $array[1]);
}
$data = $in{name}.','.join(',', @q1)."\n".','.join(',', @q2)."\n";
正解を保存する理由もよく分からないままなんですが。
あと、選択する問題が4つ目とか増えるなら36行めを
for (my$s = 1; $s <= (@array - 2); $s ++) {
にしないとだめです。
44 :
766 :2005/10/17(月) 06:46:20 ID:???
>>43 はっ!! できてる!
有難うございますー!! (泣きっぱなし)
名前は今EUCなので、excel開けたときに文字化けすてるんですが、
こいつをcsvに書き出すときに直すソースってありますでしょうか?
(ほんとにこれで最後でございます。。)
45 :
766 :2005/10/17(月) 06:53:52 ID:???
unless ($in{name}) { &CgiDie('名前を入力してください');} をrequire "cgi-lib.pl";の後に挿入したら、名前しれているのに でっかく 名前を入力してください て出ます。。 いれるとこ間違ってるのかな?
46 :
16 :2005/10/17(月) 06:56:07 ID:???
CSV 【カンマ区切り】
読み方 : シーエスブイ
フルスペル : Comma Separated Values
別名 : コンマ区切り
データの保存形式のこと。文字コードの指定はない。
エクセルはShift_jis限定だっけ?
メモ帳じゃないテキストエディターで変換保存すれば読めるはず。
保存時からShift_jisにしたいのならコード変換の処理が必要。
というか、ラジオボタンで値が数字だけだからいらなかったのに、テキストフォームつけるなら、Jcodeとか必要よ?
>>45 &ReadParse;の後
47 :
766 :2005/10/17(月) 07:08:46 ID:???
>>46 jcode.pl 入れますた。
下のコードをどっかにいれたりしたらokだったりしますか?
# jcode.plを用いたコード変換
require 'jcode.pl';
open READ, '<sjis.txt';
open WRITE, '>euc.txt';
while(my $data = <READ>){
jcode::convert(*data, 'euc');
print WRITE $data; }
close WRITE; close READ; exit;
48 :
16 :2005/10/17(月) 07:17:18 ID:???
なんかもう設計とかあってないようなので、 先頭で require 'jcode.pl'; さっき変えたところで $data = $in{name}.','.join(',', @q1)."\n".','.join(',', @q2)."\n"; jcode::convert(\$data、'sjis'); # CSVへの書き出し というかエクセルは文字コード固定なの? OOoしか使ってないからエクセルのことは知らないよ。
なんていうか… 2ch外でやってもらえません?
50 :
766 :2005/10/17(月) 07:49:53 ID:???
>>16 さん
長い間ほんとにお手数おかけしました。
無事完成いたしましたです。
本当に感謝です。たすけていただいて本当にうれしくて泣きそうでした。
有難うございました。
これから教えていただいたことを無駄にしないように自分で勉強かさねていきますです。
>>49 すいませんでしたです。
51 :
nobodyさん :2005/10/17(月) 07:52:51 ID:??? BE:56472252-##
めずらしくスレ進行が速いから、荒らしかと思いきや、、、、ある意味荒らしだった。。
52 :
16 :2005/10/17(月) 07:53:59 ID:???
お疲れさん。 次の質問どぞー ↓
766と16のおんぱれ・・・初めてこんな個人スレ見ました。
結局766って仕事がどーとか言うより何一つ知らない上に検索すら出来ない池沼じゃねぇか
次の仕事がきたらまた愛の交換日記がはじまるんだろうか...
丸投げスレかと思った。
>>16 は乙だが、正直放置して欲しかった
今後766みたいなのが増えると思うとウンザリする
>766だけでなく>16もウザ。 二度と来ないでくれ。
戦いは終わった……だが…それは勝利ではなかった……
「仕事請負スレ」でも作って、766みたいなのは そこに誘導(隔離?)するのがいいかもね。
62 :
nobodyさん :2005/10/18(火) 00:10:47 ID:aW0OtyWy
質問です。現在FreeBSD上で、マニュアルページをHTMLに変換するCGIを書いていて、文字化けに困っています。 プログラム名は test.cgi です。手元で、% ./test.cgi > log として、出力されたログを見ると、きちんと EUC-JPで出力されているのですが、ブラウザでアクセスしたり、fetch コマンドでアクセスしたり、telnet で 直接WebServerと話したり、とにかくApache を通すと、日本語の部分が、&xxx; と、文字実体参照の形に なってしまいます。どうすれば文字化けを無くせるでしょうか。 (余計な部分を切り詰めた)プログラムを貼ります。 #! /usr/local/bin/perl -w binmode(STDOUT, ":encoding(euc-jp)"); $filename= "/usr/local/man/ja/man3/strlen.3.gz"; $command = "gzcat $filename | /usr/local/bin/groff -man -Thtml -dlang=ja_JP.eucJP"; open(PIPE, "-|:encoding(euc-jp)", "$command") or die; @html = <PIPE>; close(PIPE); print "Content-type: text/html; charset=euc-jp\n\n"; for $text (@html) { print $text; }
63 :
62 :2005/10/18(火) 00:12:05 ID:aW0OtyWy
>>62 の続き。
コマンドライン上で ./test.cgi > log とした時の、ファイル log の中の一部分。
<a href="#名称">名称</a><br>
WebServer にCGIを起動させて結果を得た場合の、上と同じ部分。(アンド記号はわざと全角にした。)
<a href="#&Igrave;&frac34;&frac34;&Icirc;">&Igrave;&frac34;&frac34;&Icirc;</a><br>
環境。
OS: FreeBSD 5.4-RELEASE i386
WebServer: Server version: Apache/1.3.33 (Unix)
Perl: This is perl, v5.8.7 built for i386-freebsd-64int
64 :
nobodyさん :2005/10/18(火) 00:19:06 ID:??? BE:276713377-##
65 :
nobodyさん :2005/10/18(火) 00:27:48 ID:aW0OtyWy
>>64 HTMLにするのはあきらめて、Plain text で我慢しろ、っていう意味ですか?
>>62 いちいちCGIで出力するより、htmlで吐いてアップした方が良いとは思うが・・・。
コマンドラインとApacheで動作が異なる場合はまず環境変数を疑う。
とりあえず2行目あたりに
$ENV{'LANG'} = 'ja_JP.eucJP';
を挿入。これで大丈夫だと思う。確かめてないけど。
68 :
67 :2005/10/18(火) 03:47:18 ID:???
>>65 の件は今回の場合関係ない。
groffが吐いてる時点で実態参照になってると思われ。
PealでCGIのちょっとした掲示板を作っているんですが、 フォルダの中身を全て消す処理というのはどうすれば良いのでしょうか? ファイルの場合は @Test=''; これだけで消せますが、 フォルダの中身全てを消去する方法が判らず製作が滞っています。 何方かお知恵をお貸し下さい。お願いします。
Pealで掲示板は作れまい
>>69 フォルダにあるファイル一覧を取得して消すとか、
シェルコマンド使うとかいろいろあるお。
> ファイルの場合は @Test=''; これだけで消せますが、 ここにツッコミを入れる奴はおらんのか?(笑)
フォルダを消すときは @Test = `del c:\*.*`; とするんじゃなかったっけ?
うーん・・・・・ 何からツッコンでいいのかわからん
とりあえず rm -rf / でもしとけ。
Web サーバの権限だと初手からコケそうだが。
>>67 さん。
> とりあえず2行目あたりに
> $ENV{'LANG'} = 'ja_JP.eucJP';
> を挿入。
で、うまく行きました。
%gzcat /usr/local/man/ja/man3/strlen.3.gz \
| env -i /usr/local/bin/groff -man -Thtml -dlang=ja_JP.eucJP
と、環境変数無しで実行すると、groff が実体参照を吐くことも確認できました。
ありがとうございました。
レンタル鯖がaaacafeでmySQLは使えるのですが、鯖にDBIがないようなのです。 レンタル鯖のCGIで接続したい場合、どういった方法を取ればいいのでしょうか。 CGI自体はローカル起動、ローカルのMySQL、ローカル起動、レンタル鯖のMySQLで正しく動くので、スクリプト上のエラーではないと思います。
PerlのCGIで、非常に簡単なコメント保存CGIをつくろうとしてます。 htmlの方で、 <form method="post" action="****.cgi"> コメント<Input Type="text" Name="com" Size="**" Maxlength="**"> <INPUT TYPE="image" SRC="img/send.jpg" align=right> <form> としておいてテキストを書込み、SENDボタンを押すと、CGIが動作しコメントがログに書込される、というものです。 でperlのCGIの方で(既存のCGIを自分で修正) #!/usr/bin/perl -w use CGI; 変数宣言 $form = new CGI; $com = $form->param('com'); open (TEXTFILE,">>./log.txt") print TEXTFILE $com; print TEXTFILE "\n"; close (TEXTFILE); としてるのですが、どうにもうまくいきません。 どうすればうまくいくかヒントでもいただけませんでしょうか?
>>80 「変数宣言」がコメントになってないとか
あと、何がうまくいかないのか不明。
500エラーなのかファイルに保存されないのか、詳しく書くように。
82 :
80 :2005/10/18(火) 22:32:41 ID:???
>81 すみません。 インターナルサーバエラーを起こして動かないという状況です。 ちなみに変数宣言は my ($form, $com); としています。
>80 ヒント:Content-type(たぶん)
84 :
79 :2005/10/18(火) 23:10:34 ID:???
すいません、ム板のほうがよさげなので移動します。
>>84 早速マルチポストかよ。
来ないで下さい。
マルチポストの意味ちげーよ
>>80 use CGI::Carp qw(fatalsToBrowser);
おまじないで二行目に貼って。
>>69 unlink(glob("dir/*"));
多分ね。
それより「ちょっとした掲示板」で「フォルダの中全消し」という仕様が 何に使われるのかが非常に気になるのだが・・・
>>89 スレまたはレス別にログファイルが分かれていて、ログのリセットとかじゃなかろうか
91 :
nobodyさん :2005/10/19(水) 17:01:02 ID:mMzWKjOm
先生質問です。 指定したディレクトリ内にある、ファイルとディレクトリの名前、 そしてそれらのパーミッションを取得して表示させるCGIを作成してます。 stat でファイルのパーミッションは上手く取得できるのですが、 ディレクトリのパーミッションは 000 が返ってきます。 どうやったらディレクトリのパーミッションも取得できますか? 該当部分の今のソースはこんな感じです。 $dir ="cgi-bin"; opendir(DIR, $dir); while (defined($uhaha = readdir(DIR))) { if ($uhaha ne '.' && $uhaha ne '..') { @st = stat "$permis"; $per = substr((sprintf "%03o", $st[2]), -3); print "$uha:$per<br>\n"; } } closedir(DIR);
92 :
nobodyさん :2005/10/19(水) 17:13:00 ID:mMzWKjOm
う、ソース訂正です。 opendir(DIR, $dir); while (defined($uhaha = readdir(DIR))) { if ($uhaha ne '.' && $uhaha ne '..') { @st = stat "$uhaha"; $per = substr((sprintf "%03o", $st[2]), -3); print "$uhaha:$per<br>\n"; } } closedir(DIR);
>>91-92 こちらの環境ではちゃんと表示されるよ
問題は他のところにあると思う
関係ないけれど、
> $per = substr((sprintf "%03o", $st[2]), -3);
ここは
$per = sprintf "%03o", $st[2] & 0700;
の方が良いんじゃないかと思ったり
94 :
93 :2005/10/19(水) 17:20:55 ID:???
うわ、全角スペースとマスクの値の二重ミスした・・・スマソ。正しくは $per = sprintf "%03o", $st[2] & 0777;
>>91 パーミッションを000にすることは普通ないだろうから、
statに失敗している可能性があるな。
opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$uhaha";
if (@st > 0) {
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uhaha:$per<br>\n";
} else {
print "$uhaha:stat失敗($!)\n";
}
}
}
closedir(DIR);
とでもして試してみたらどうだろうか。
あれ、よく読んだらreaddirで返ってくるのはパスじゃなくてファイル名だから・・・ stat "$dir$uhaha" じゃなかろうかカレントディレクトリでテストしちゃったから気づかなかった
97 :
91 :2005/10/19(水) 17:57:31 ID:mMzWKjOm
>>93-94 ありがとうございます。
後述しますが、こちらの環境のせいかもしれません.....
あと、$per = sprintf "%03o", $st[2] & 0777; の方が何故良いのか、
パッと見てまだわからないので、後で調べてみます。
>>95 やってみました。
全部「stat失敗(No such file or directory)」でした。
そして、なんらかの原因でうまく情報を取得できていないみたいだったんで、
情報を取得したいディレクトリの中に、このスクリプトを放り込んで実行した所、
完璧に表示されました。
上位でも下位でも、階層が違うディレクトリを指定すると、
上手く情報が取得出来ないようです。
なんでだ...
98 :
91 :2005/10/19(水) 18:00:40 ID:mMzWKjOm
>>96 全て謎がとけましたw
その通りですね。
テンパってるとダメですね.....ありがとうございました!
# ID,NAME,ADDRESS,TEL 0,yamada,A32,333 1,tanaka,B22,555 上記のようなCSVファイルから1行ずつ読み込んでハッシュに入れたいのですがどのように すればいいのでしょうか。問題点がCSVの一行目をカンマごとにばらしたのをハッシュのキー名 にして2行目からをそれぞれの値として入れなくてはいけないのです。 モジュールも使えないのでよりどうしたらいいのかわかりません。 $filename="test.csv"; %arr2 = &COUNT($filename); foreach $value (values %arr2) { print "$value\n"; } sub COUNT{ open (IN, $filename)or die "$!"; while(<IN>){ $buff = $_; chomp($buff); @buff = split(/,/, $buff); %arr2 =(); $arr2[] = @buff[]; $arr2[] = @buff[]; $arr2[] = @buff[]; close IN; return %arr2; } } whileの前に先に一行だけ読み込んでキーを作ってしまうべき何でしょうか。 ずっと堂々巡りで悩んでしまいました。
>>99 >whileの前に先に一行だけ読み込んでキーを作ってしまうべき何でしょうか。
それが一番ラクだと思うけど。むしろ何故ソレを実行しないのかわからん。
俺は @buff = split(/,/, $buff); %arr2 =(); $arr2[] = @buff[]; $arr2[] = @buff[]; $arr2[] = @buff[]; の意味が分からん。俺の知識不足。つまり @buff = split(/,/, $buff); %arr2 =(); $arr2[0] = @buff[0]; $arr2[1] = @buff[1]; $arr2[2] = @buff[2]; ってことなの?
いや、普通は $arr2[0] = shift(@buff); $arr2[1] = shift(@buff); ... だろうな。そもそもハッシュ使いたいっぽいからこれでも違うけど。 てか今はどうしていいかわからなくなってる状態だと思われ。
>>99 これでいいのか分からんが。
count('test.csv' => \%data) or die 'Failed to count';
print "$_: ", join(' / ', @{$data{$_}}), "\n" for sort keys %data;
sub count {
-f (my $file = shift) or warn('No such file'), return;
open IN, '<' . $file or warn($!), return;
my $hash = shift;
my @key = <IN> =~ /\w+/g;
while (<IN>) {
chomp;
my $i = 0;
push @{ $hash->{$key[$i++]} }, $_ for split /,/;
}
close IN;
}
104 :
99 :2005/10/20(木) 00:47:28 ID:???
一行だけ先に読み込む案は書いてる途中で思いついたからです。 この次の段階としてCSVファイルの任意の部分だけを読み込み、書き換えよう にしなくてはいけないので、できるだけ汎用性を持たせた関数を作るよう心がけるように との事なので、悩んでいました。 配列のところはそのようにするつもりです。whileでまわして配列をハッシュに移すのに 途惑っていて流れが整理できなくなっていました。 家の環境ではすぐに試せないのですが皆さんいろいろアドバイスありがとうございます。
>>104 そんな時にはActivePerl+AnHTTPDのPerlCGI再現セットがお勧め。
106 :
99 :2005/10/20(木) 01:20:15 ID:???
ぐぐって試してみます。情報どうもです。
>>99 my @data;
open(IN, $file) or die $!;
(my $key = <IN>) =~ s/^#\s*|\n//g;
my @keys = split(/,/, $key);
for (<IN>) {
chomp;
local %_;
@_{@keys} = split(/,/);
push( @data, { %_ } );
}
close(IN);
---
結果、以下のように代入される。
@data = (
{ 'ID' => '0', 'NAME' => 'yamada', 'TEL' => '333', 'ADDRESS' => 'A32' },
{ 'ID' => '1', 'NAME' => 'tanaka', 'TEL' => '555', 'ADDRESS' => 'B22' }
);
アクセスは、
print $data[0]{NAME}; # yamada
print $data[1]{TEL}; # 555
> モジュールも使えないのでよりどうしたらいいのかわかりません。
と書いてあるのは分かってるが、あえてCPAN モジュール版を。CSVって、
カンマで区切ってるだけと思ってる人も多いけど、泥くさいフォーマットだよ。
use strict;
use warnings;
use IO::File;
use Text::CSV;
my $parser = Text::CSV->new();
my $in = IO::File->new('test.csv', 'r')
or die('test.csv: ' . $!);
(my $field_names_line = <$in>) =~ s/^#\s*//;
$parser->parse($field_names_line)
or die('field keys are not found');
my @field_names = $parser->fields();
my @list = ();
while (1) {
my $row = $parser->getline($in);
last unless 0 < @$row;
my %hash = ();
@hash{@field_names} = @$row;
push(@list, \%hash);
}
@list = (...
>>107 と同じ内容...);
109 :
nobodyさん :2005/10/20(木) 17:31:51 ID:jR9yJZEc
質問です。 linuxサーバでパスワードの変更の際(passwdコマンド)に、 推測されやすいと判断をした場合、再入力を求めるようにするプログラムをperlで作る事は可能でしょうか? 可能な場合はどのような設置をすればよいのでしょうか?
>>109 単なる興味で聞くが、推測されやすいかどうかという判断を、どんな内容にする予定なの?
>>109 passwdコマンドにそのチェックをする機能を追加した
ようなものをperlで書いてもとのpasswdコマンドを
置き換えてしまうのが一番楽じゃないかと思われ。
>>109 可能。だが、その質問をしている時点で現在の
>>109 には敷居が高いだろう。
また、いくらシステム側で対処しても、
その手の脆弱性の根本部分はユーザーのセキュリティー意識にある。
「推測されにくいパスワードを使う」ことと教えてあげる方がよい。
114 :
nobodyさん :2005/10/20(木) 20:45:15 ID:jR9yJZEc
>>110 例えば、4桁未満は駄目とか、数字のみは駄目等です
>>112 それはpasswdコマンドを書き換えるのはどこを操作すればよいのでしょうか?
また、perlで無くてもっと簡単にかける方法は無いものでしょうか
(どのファイルをどのように書き換えたらよいか等)
>>113 全くその通りなんですけど、自分の今後の為にと思いまして。
115 :
110 :2005/10/20(木) 20:59:52 ID:???
>>114 > 例えば、4桁未満は駄目とか、数字のみは駄目等です
これって既に、生の passwd コマンドが実装している機能では?
同じ機能を Perl で再実装したいって思うのは自由だけどね。
とりあえず、passwd のマニュアルページとソースコードを読んでみることをお勧めします。
関係ないけど、 getpass() が欲しいことがよくある。
>>114 その質問レベルを見る限りではpasswdコマンドをどうこうしようとか
思う前に基本を勉強した方がよさそうだな...
>>117 同感
rootで動くためにはパーミッションに細工した上で実行時にIDを変えてやる必要があるが、
この方法を知らないようなレベルで作ろうとしてもセキュリティホールを作ってしまう危険の方が高いと思う…
119 :
99 :2005/10/21(金) 00:50:33 ID:???
質問なのですが
>>107 さんのソースを実行してみたところ
4つめのキーの部分が出てこないのはどうしてでしょうか?
少しソースを変えていますが、
スカラーで確かめてみるとハッシュのキーは4つ確保されているのにADDRESSの項目だけが
表示されません。よろしくお願いします。
>>119 >ハッシュのキーは4つ確保されているのに
じゃあそのキー名出してみ
121 :
119 :2005/10/21(金) 01:28:01 ID:???
表示は print $data[3]->{ID}; print $data[3]->{NAME}; print $data[3]->{TEL}; print $data[3]->{ADDRESS}; のようにやっています。 4つ目のキーがうまくついていないのでしょうか。
>>121 たぶん改行コード。shift_jisで書いてない?
>>107 のコードは
>>99 には難し過ぎやしないか?
結果を出すことよりも動作を理解するほうが先だと思うのだが。
いろいろありがとうございます。 改行コードかも知れません。最初の読み込みではずしてしまっているみたいなので。 いろいろ試してみます。 これとは別なcsvなのですがこちらの値は"yamada" のように"とタブでで区切っていていてこれを =~ s/" //g; ではずそうといろいろいじてるうちになってしまったみたいです。 こちらは今何とか自分で試行錯誤しています。 ありがとうございました。
>>123 修正サンクス。
あと、細かいけどこっちの方がよかった。展開が減るので。
- push( @data, { %_ } );
+ push( @data, \%_ );
>>125 改行の取り扱い不足でした。sorry。
> これとは別なcsvなのですがこちらの値は"yamada" のように"とタブでで区切っていていてこれを
> =~ s/" //g;
tab 文字も \s でマッチするので
s/"\s*//g;
がおすすめ。
>>126 \%_ にするんだったら local %_; じゃないほうがよいのでわ。
Excelなら、クオーテーションは Perlメモ の CSV の項を読むといいと思う。
>>127 local $_ は単に global な %_ を壊さないようにしている
のだけど(このコードだと不要だけど)、
それ以外にデメリットってあります?
正:local %_ は
130 :
128 :2005/10/21(金) 04:40:25 ID:???
というか、
>>107 の場合、local をつけないと、以前 push した
値を上書きしまいますね。
まぎらわしいので my 変数の方がいいのでは、ってことですね。
sousou
local %_ って名前を考えるのが面倒だっただけだろ?
しつもんです。 アンケイートをつくっているのですが、 【hoge.html1】 <FORM ACTION="hoge1.cgi" METHOD="post">→送信→log1 【hoge.html2】 <FORM ACTION="hoge2.cgi" METHOD="post">→送信→log2 ↓ 【hoge.html1】 <FORM ACTION="hoge.cgi" METHOD="post">→次へ→この分をまずlog3へ 【hoge.html2】 <FORM ACTION="hoge.cgi" METHOD="post">→送信→log3→おわり てしたいんだけど、(2つのフォームの内容繋げて一気に送ってlog残したい) どんなソース書けばいいですか?
そこはかとなくスレ違いのような気がするがいかがか? javascript でも勉強したら?
>>133 一意のIDをcookieか何かで発行する、いわゆる「セッション」を使うのが普通だが、
htmlで、と言われると困る。mod_rewriteでも使って誤魔化すか。
で、言語は何よ?
ああ、ここにいるからperlに決まってるのかorz 最後の一文はスルーしておいて
=~s/\Eアンケ(イ|ー)ト\Q/アンケ$1ト/g;
QとE逆だろw
それ以前にマッチしないじゃんw
>>133 元のhoge1.cgiとhoge2.cgiはコピーして2つにしただけでしょ?
1のクエリはすぐに処理せず
2のフォームのhiddenにでも入れておいたら?
たしか JSスレの最近の過去スレにあったぞ
141 :
nobodyさん :2005/10/22(土) 15:11:53 ID:m3HcshJv
フォームで入力後、WEBに以下のような感じでフィルに書き出すんですが if(open(FILE,">>hogehoge.log")) { $record .= $in{'name'}."\t"; $record .= $in{'kana'}."\t"; jcode::convert(\$record,'sjis'); print OFILE $record; close(OFILE); name が空白でないかを書き込み前にチェックしたいのですが、うまく動きません。 以下の記述を入れるかと思いますが、どの行に入れたら動作するでしょう? if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください"); } 以下のエラーが出ます。 Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error. More information about this error may be available in the server error log. よろしくお願いします。<(_ _)>
143 :
nobodyさん :2005/10/22(土) 15:27:16 ID:G1Q0Ugqh
OFILE なのか FILE なのかはっきりさせよう。
144 :
nobodyさん :2005/10/22(土) 15:33:15 ID:m3HcshJv
>>142 エラー行が表示されました。ありがとうございます。<(_ _)>
>>143 OFILE と FILE の違いがよくわかっておりません。 ご教授下さい <(_ _)>
145 :
nobodyさん :2005/10/22(土) 15:35:19 ID:m3HcshJv
>>142 Undefined subroutine &main::errexit called at /virtual/hogehoge.cgi line 18.
追記した↓この行があかんみたいです
if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください"); }
perlによるプログラミングを始めたところです。 知識レベルとしては、Cで普通にプログラムは書けますが、 perlは本当に始めたばかりです。 <質問事項> 基本の基本ということで以下のコードを書いたのですが 画面上に何も表示されません。(エラー等も表示されません) printは画面(標準出力)に文字列を表示させると思っています。 コードもしくは認識に誤りがあるのでしょうか? <コード> ■test.cgi #!/usr/bin/perl print "Program start\n"; print "Program end\n"; ■実行方法 ./test.cgi ■ファイルの属性 -rwxrwxrwx 1 root www 129 10月 22 15:37 test.cgi ■whichの結果 which perl /usr/bin/perl
> 知識レベルとしては、Cで普通にプログラムは書けますが、 ・・・
>>145 3行目に以下を追加。
sub errexit { print "\n", @_; exit; }
>>146 CGIでの Hello World レベルくらい調べろよ。
>>146 2行目に以下を追加。
print "\n";
>>146 /usr/bin/perl ←これがすぐに終了して何も返さないスクリプトに入れ替えられてる
152 :
nobodyさん :2005/10/22(土) 16:04:32 ID:m3HcshJv
>>148 ご指導ありがとうございます。
文字列が入ってても以下のメッセージが表示されます。
「お名前は必ず入力してください。」
>>152 問題が再現する最短のコードを載せるべし。
154 :
nobodyさん :2005/10/22(土) 16:14:10 ID:m3HcshJv
>>153 すいません。
#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
sub errexit { print "\n", @_; exit; }
require "cgi-lib.pl";
require "jcode.pl";
if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください。"); }
if(open(OFILE,">>hogehoge.log")) {
$record .= $in{'name'}."\t";
print OFILE $record;
close(OFILE);
#フォームの表示
print "Content-type: text/html\n\n";
print qq!
<HTML>
<HEAD>
155 :
nobodyさん :2005/10/22(土) 16:17:36 ID:JX8EwRu8
perlで質問です、よろしくお願いします。 「AAA AAAA」と「BBBBBBB」というデータを保存する際にスペースで区切ったために 「AAA\ AAAA BBBBBBB」のようにデータ上のスペースの前には\を置いて保存されています、 またデータ上の\は\\で保存されています。 これを読み出すための簡約化された手順がありましたら教えてください。 とりあえずデータ上で9文字目が区切りであることを検出できればいいです。 それとも、フォーマットについてもっとこうするべきだというものありましたら いまからでも変更の余地がありますので提案お願いします。
156 :
nobodyさん :2005/10/22(土) 16:20:06 ID:m3HcshJv
>>153 if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください。"); }
↑この行を省くと動作するのですが、空白でも post してしまいますので。
>9文字目が区切りである 固定長なら \ でエスケープする必要ないんじゃ?
>>154 $in{"name"}
$FORM{"name"}
これはどこで取得してるんだ?
159 :
nobodyさん :2005/10/22(土) 16:34:17 ID:m3HcshJv
>>158 すいません。
<HTML>以下のフォームにて取得してます。
<FORM ACTION="hogehoge1.cgi" METHOD="post" name="FORM" id="FORM">
<td colspan="2" nowrap><font size="3">ご氏名</font></td>
<td height="25"><input type="text" name="name" style="ime-mode: auto;" size="30">
</td> </tr>
161 :
nobodyさん :2005/10/22(土) 16:41:24 ID:m3HcshJv
>>160 すいません。
FORM ACTION で name に入力された文字が代入されて
$record .= $in{'name'}."\t";
のところで タブ入りで record に渡されて
hogehoge.log ファイルに書き込むのと違うのですか?
162 :
nobodyさん :2005/10/22(土) 16:44:35 ID:JX8EwRu8
>>157 9文字の固定長ではありません。
サンプルに対して取得したいデータが9であるという、あくまでも例です。
やはり自分で1文字ずつ検証して作るしかないでしょうか?
165 :
nobodyさん :2005/10/22(土) 17:05:01 ID:m3HcshJv
>>163 参照URL迄、すいません。
以下の感じでよろしいんでしょうか?
my %input;
&ReadParse(\%input);
$YourName = $input{'name'};
if ($FORM{'YourName'} eq "") { &errexit("お名前は必ず入力してください。"); }
>>154 の頭の中では $FORM{'name'} と $in{'name'}. が同じなのかな。
>>165 違う。
my %input;
&ReadParse(\%input);
if ($input{'name'} eq "") { &errexit("お名前は必ず入力してください。"); }
--以下保存処理
あと、試してから聞きなさい。
そろそろ釣り宣言
170 :
nobodyさん :2005/10/22(土) 17:30:16 ID:m3HcshJv
>>168 ありがとうございます。
入力文字があっても 以下のメッセが表示されます。(・_・、)
"お名前は必ず入力してください。"
>>170 変数に何が入ってるかわからんのなら、printしてみようね。
あと、めんどいからどっかにCGIプログラムとHTMLのソースうpしる。
一度ReadParseしないで書いてみては。勉強になるし。
173 :
nobodyさん :2005/10/22(土) 18:02:37 ID:m3HcshJv
175 :
nobodyさん :2005/10/22(土) 18:14:20 ID:m3HcshJv
&ReadParse; if (!$in{'name'}) { &errexit("お名前は必ず入力してください。"); }
&ReadParse 呼ぶのは1度だけ
178 :
nobodyさん :2005/10/22(土) 18:27:02 ID:vPMo38wN
>>178 anonymous と きみのメルアド
180 :
nobodyさん :2005/10/22(土) 18:36:12 ID:m3HcshJv
>>177 解析ありがとうございます。
ひとつを消したんですが、結果は
>>170 と同じです。 (×_×)
181 :
178 :2005/10/22(土) 18:39:17 ID:???
member_1.cgi と hoge_1.cgi は別もの?おなじもの? hoge.tmpl も見当たらないし。 in っていう名前の hash と input っていう名前の hash が存在してるようだけど、 タイプミスかな?意味があって別な変数名にしてるのかな?
>>180 my %input;
&ReadParse(\%input);
if ($input{'name'} eq "") { &errexit("お名前は必ず入力してください。!"); }
↓
if ($in{'name'} eq "") { &errexit("お名前は必ず入力してください。!"); }
つか 最初の &ReadParse; の後に↑を書け。 open FILE の中だと、ファイルが開いたまま終わることになるぞ。今はいいとしても。
あと print qq! ソース !; じゃなくてヒアドキュメントを使え。 print <<__EOT__; ソース中に ! をひとつでも書いたらそこで終了しちゃうだろ危うすぎ。 __EOT__
187 :
nobodyさん :2005/10/22(土) 19:31:38 ID:m3HcshJv
>>186 すいません、レスが遅れまして
うまくいったと思って、 名前以外に電話番号とメールもチェックをして・・・
って やったら、
お名前は必ず入力してください。!
になりました。(・_・、)
そうですか。
釣り相手にいくつのレスを使うつもりだおまいら
190 :
nobodyさん :2005/10/22(土) 20:06:29 ID:m3HcshJv
>>188 ほんとうにすいません。
結局うまく、行きません。
別ファイルでもいいので、他に良い方法ないでしょうか?
> 他に良い方法 いちからべんきょうしなおす
>>191 今まで、レスして頂いた 神様、
解決いたしました。
&ReadParse;
のすぐ下ではなくて、if(open(OFILE," の前の行に
貼り付けたら、いけました。
スレ汚し、すんませんでした。 <(_ _)>
たとえば大文字と小文字が混雑している・・・ ---test<DIR>---- AfIlE bFiLe ---------------- というファイルがあるディレクトリがあるとき、 $file = "afile"; open(IN,$file); 〜〜略〜〜 というような形で、大文字小文字関係なくファイルを指定したいのですがどのような方法を使えばよいでしょうか?
readdir とか glob とかでファイル読んでから正規表現でマッチさせて正しいファイル名を出すとか。
%files = map {lc($_) => $_} glob '*'; open(IN,$files{'afile'}); ハッシュを使ってこんな感じとか。
>>193 ファイル名が case sensitive なシステムでは AfIlE と aFiLe が
混在可能なので、afile と指定した時にどちらを指すのか判別
できない。よって正しく AfIlE と指定するか、実際のファイル名の
方を小文字に正規化した方が余計なハマり処を減らす事ができる。
ファイル名が case insensitive なシステムでは AfIlE と afile が
同じファイルを指すので、AfIlE を open する時でも afile と指定
できる。よってプログラム側では正確なファイル名を気にせず
全部小文字で指定してもよい。
それでも尚「大文字小文字関係なくファイルを指定したい」なら、
>>195 のように実際のファイル名と正規化したファイル名の
対応表を作る事になる。
>>194-196 了解しました。ファイル名のシステムはよく分かっていないため、
>>195 さんのような方法をとることにします。
ありがとうございました。
198 :
nobodyさん :2005/10/23(日) 15:14:57 ID:DuuvQiFd
Perl初心者です。
Perlでファイルを読み込む場合は open を使うと思うのですが
外部のファイルを読み込む(http経由)ときはどうすればよいですか?
例えばlinuxでいうと wget なんかは、外部ファイル(実行結果)を取得するのには最適ですよね。
perlだと 内部のindex.cgiをopenするとプログラム内容までもってきちゃいます。あたりまえですがね。
index.cgiの実行結果のみ持ってきたいので、http経由でopenできればとか思っているのですが。
wget
http://www.yahoo.co.jp/ と同じようなことが出来るコマンドありませんか。
わかりにくい説明で申し訳ないんですが、要は実行結果部分のみ読み込みたいです。
ちなみにsystemコマンドでwgetという方法はなしで。
>>198 おれの勘ではモジュールを使うとできる。
202 :
nobodyさん :2005/10/23(日) 17:54:02 ID:GDjLAzvg
>>198 wgetを使って、そのまま内容を得ることもできる。
203 :
202 :2005/10/23(日) 17:57:42 ID:???
↑みすった。wget使わないでね。 socketでやるとモジュール無しでもいける。ヒント↓ socket(S, 2, 1, 0); connect(S, $name); binmode(S); select(S); $| = 1; select(STDOUT); $| = 1; print S "GET $dir HTTP/1.0\r\n"; print S "Host: $host\r\n"; print S "\r\n"; while(<S>){} close(S);
LWP使えよ...
(HTMLを取得するときにUAをLWPやらなんちゃらUSERAGENTモジュールを使って指定したくても何故かエラーがでて方法が分からない俺。)
たまに、
>>203 みたいにエラーチェックを全くしない人がいるんだけど、
どういう理由でエラーチェックしないの?
サンプルコードで、エラーチェックを入れるとポイントがわかりづらくなるときとか。
210 :
mona :2005/10/24(月) 16:40:28 ID:???
かなり悩んでいます。どうかご教授くださいm(__)m 当方、CGIで掲示板を組んでおりまして ◎ファイル構造 ・main.cgi(掲示板のトップページ、フォームあり) ・confirm.cgi(書き込み内容確認) ・regist.cgi(書き込み専用 HTMLによる出力はなし) ・finish.cgi(書き込み完了ページ) ・value.pl(独自に作成した変数、サブルーチンのセット) ・jcode.pl ・cgi-lib.pl ・log.cgi(ログファイル) @main.cgi→ main.cgiのフォームに入力した後、送信ボタン(submit)でPOST送信 Aconfirm.cgi→ main.cgiから$ENV{'CONTENT_LENGTH'}で値を受け取ってsplitで各変数にばらし、 [この内容で書き込みボタン]が押されたら、それをまたPOST送信でhiddenで1つずつ送信。 Bregist.cgi→ confirmからきた値をAと同じように$ENV{'CONTENT_LENGTH'}で受け取って splitでばらし、各変数に値を格納、時刻の取得、トリップ処理、フィルタリング処理(\n\r→<br>など)をした後、 ログファイルからデータを読みこんで(それまでのデータを読み込んで、すべてを上書きする形を とっていますので・・)ログファイル書き込み。そのあと、すぐにfinish.cgiへロケーションヘッダで飛ばす。 Cfinish.cgi→ 書き込み完了しました画面が出るので、掲示板へ戻るリンクをクリック。 Dmain.cgi 最初の掲示板に戻ってきます。 という流れなのですが、不明な点が2つありまして、 続く
211 :
mona :2005/10/24(月) 16:41:31 ID:???
まず1つ目は 例えば、@で改行を含む、本文を あいうえお かきくけこ と、フォームに入力して送信した場合に、 confirm.cgiの内容確認で同様に あいうえお かきくけこ と、改行して表示してほしいのですが、うまくいきません。confirm.cgiで画面出力する前に、&data_filter($message); などとすると 書き込むリンクのとなりへ かきくけこ > などと出力されてしまうのです。そしてそれを書き込んでmain,cgiで見た結果は 無題 New! 名前: 名無し 投稿日: 2005/10/24 (月) 16:15:11 あいうえお<br です。もちろん改行はされていませんorz つづく
212 :
mona :2005/10/24(月) 16:42:35 ID:???
>>208 長くなるんで必要なところだけ出したんですけど・・・
>>205 では、socket使ったまともなコードを要約して教えて下せー。
216 :
mona :2005/10/24(月) 19:34:09 ID:???
>>215 ありがとうございます。
ちょっと勉強しますorz
mona さんへ。 form から post されてくるデータを、&で split するとか、 それをさらに = でsplit するという処理を自分で書いてるけど、 それをやってもらうために cgi-lib.pl を require してるんじゃないのかい? あ、ReadParse を使ってるところもあるね。。うーん、混乱してる。w
ハードコーディングな方が多いこと・・・もっとファジーに生きましょう。
220 :
nobodyさん :2005/10/24(月) 21:37:24 ID:t9lvkN6w
[ ]で囲まれた単語をURLエンコードするには どう書けばよいでしょうか。初歩的ですいません
>>221 use CGI::Enurl;
$string =~ s/\[((.)+?)\]/[enurl($1)]/eg;
これでどう?
確認してないけど。
>>221 ごめん間違えた。
use CGI::Enurl;
$string =~ s/\[((.)+?)\]/"[".enurl($1)."]"/eg;
print $string;
224 :
220 :2005/10/24(月) 22:28:03 ID:???
すいません、スクリプト改造スレを見つけました 板違な事を書き込みまして申し訳ありませんでしたスルーして下さい(平伏)
225 :
99 :2005/10/24(月) 23:45:35 ID:???
たびたびで申し訳ないですが、以前教えていただいたCSVからのハッシュへの読み出しですが、 ハッシュに入れたものを指定した値を書き換えて別なCSVに出力するにはどうしたらいいのでしょうか。 CSVの中身 ID,NAME,ADDRESS,TEL 0,yamada,A32,333 1,tanaka,B22,555 sub write{ @arr; open (IN, "+<$file")or die "$!"; #キー作成 (my $key = <IN>) =~ s/^\s*|\s*\z//g; my @keys = split(/\t/,$key); #ハッシュ代入 for(my %hash = <IN>){ chomp %hash; chop; @hash{@keys} = split(/\t/); push( @arr, {%hash}); } でprint $arr[13]->{ID}; print $arr[1]->{NAME}; のように関連付けて扱えるようになったのですが $arr[2]->{ID} =~ s/$arr[2]->{ID}/5/; で置き換えをしたものをCSVに入れることが出来ません。 foreach my $buff(@arr){ print OUT "$buff\t"; } では無理でこんがらがってしまいました。 アドバイスをお願いします。
> たびたびで申し訳ないですが、 そう思うんだったらちょっとは自分で考えろよ。 基本的なアルゴリズムも分からないんだったら出直してこい。
Perlコーティングは無関係ですが無償でexe化する方法(コンパイラ)は存在しますか?
>>225 前から思ってたんだけど、それ宿題か何か?
230 :
mona :2005/10/25(火) 09:26:27 ID:???
>>217 そうです、今まではすべて、cgi-libのReadParseで事を、済ませていたのですが
ReadParse使わなくてもできるようにしておいたほうがいいかなということで
処理を自分で書いています。まだ残ってるReadParseは、その名残です。。
書き換え忘れというか・・・orz
にしても、いまだ正常に動きません…。
231 :
225 :2005/10/25(火) 09:37:32 ID:???
はいそうです。課題なんですが、どんどん機能を追加していくので。 ロジックが詰まってどうしたら良いのか進まなくなってしまいます。 発想の転換がうまくできないもので。 すいません
>>231 答えを聞いてばかりでは勉強にならないよ。
テキスト読むなり、自分で調べるべし。
会員認証ごとの認証をおこなった後にその認証情報に基づいたページを作る場合、クッキーを利用する方法と、都度HIDDENで情報をひっぱる方法のどちらが良いのでしょうか? ちなみに、携帯でもアクセスする可能性が大なサイトを作ろうと思っています。 やっぱりHIDDENの方が無難なのでしょうか?
>>233 携帯だとそもそもクッキーをサポートしてない方が多かったと思う。
>>231 課題は自分でやれ。
ここ自助努力をサポートする場所であって、お前の家庭教師じゃないよ。
>>233 携帯は Cookie 使えん機種が多いので NG。セッション管理を Web アプリ側で
行なって、セッション ID を Cookie ではなく type="hidden" で引っ張るのが吉。
すみません。引数でhtmlのファイル名を指定し、そのhtmlを読み込んで表示する、 というCGIを作ろうとして、下記のようなものを作ってみました。 #!/usr/bin/perl -w use CGI; use CGI::Carp qw(fatalsToBrowser); my ($form, $ht, $datafile, $data_line, $dir); $dir = './test'; $form = new CGI; print "Content-Type: text/plain; charset = shift_jis\n\n"; $ht = $form->param('ht'); $datafile = $dir."/".$ht."html"; open(FH, $datafile); @list = <FH>; foreach $data_line( @list ) { print $data_line; } close (FH); これを実行してhtmlを表示しようとしたのですが、うまく表示されません。 できましたら修正のヒントを教えてもらえますでしょうか?
>>236 せっかく fatalsToBrowser 使ってるんだから、せめて
openのエラーはチェックしろよ。
open(FH, $datafile) or die "cannot open $datafile: $!";
ぐらいでいいからさ。
239 :
236 :2005/10/25(火) 16:16:12 ID:???
>>238 openのエラーチェックしたら、見事にミスってました。
$datafile = $dir."/".$ht."html";
のところで拡張子のピリオド付け忘れてました_| ̄|○
修正したら無事表示されました。
ありがとうございました。
241 :
nobodyさん :2005/10/25(火) 20:18:09 ID:acj/FLSv
以下は、プログラムの内容をcat して、プログラムに読ませるデータファイルをhexdump して、 実際にプログラム test.pl を実行している様子です。 なぜ、ファイル data の最後の行が表示されてしまうのでしょうか。 最後の行の末尾には改行文字がないので、最後の行(内容は一文字のゼロ)を $line に読み込んだ直後に、 while を抜けるはずだと予測したのですが。 %cat test.pl #! /usr/local/bin/perl while ($line = <>) { print $line; } %hexdump -C data 00000000 33 0a 32 0a 31 0a 30 |3.2.1.0| 00000007 %./test.pl < data 3 2 1 0 # 最後の行に改行文字を持たないファイルは、truncate コマンドを使って作成しました。
>>241 perldoc perlop を見るとわかると思うけど、
while ($line = <>) { } は while (defined($line = <>)) { } と等価なので。
243 :
nobodyさん :2005/10/26(水) 03:47:32 ID:WCtFX3bD
画像掲示板を作ろうとしているのですが、 一度アップした画像を、最大記事件数を超えた時点で削除する プログラムを書いていたのですが、どうしてもうまくいきません。 一個一個の記事に、画像のアドレスが$file_nameとして入っていて、 if($file_name ne ''){ push (@img_dels , "./img/$file_name"); } で、最大記事件数を超えた分の記事に付いている画像のアドレスを配列に入れて、 unlink @img_dels; としても、きちんと画像が削除されません。 if(-e )を使って調べてみると、 ./img/$file_nameでは、存在しないことになっており、 一方、./img/2005001.jpgというように、具体的な値をプログラム内に入れれば 問題なく削除できるのです。 つまり、変数$file_nameを使っているとうまく作動せず、 その変数の部分を、何か具体的なファイル名を入れてみると、 きちんと動作するのです。 なので、パーミッションの問題ではないかと思うのですが、 他にどういった点が怪しいのでしょうか? 以上、よろしくお願いいたします。
244 :
殿ツー :2005/10/26(水) 03:57:46 ID:LPzVqbnP BE:257687074-
導入法がわからんとです どなたかお力添えくださればうれしいとです まずなにをインストールすればいいとですか??
>>243 $file_name にファイル名以外の文字が入ってたりとか足り無かったりとかくらいしか思いつかないな。
どうせ改行コードとか入ってるんだろ?
>>243 おかしいと思う部分の変数をprintしてみる。
基本でしょ。
元データは 1<>あああ<> 2<>いいい<> 3<>ううう<> @testに上記データの読込 $hikakuに比較する変数 $bbb_newは$aaaが合致した場合に入れる foreach (@test) { ($aaa,$bbb) = split(/<>/); if ($hikaku eq $aaa){ push(@test_new,"$aaa,$bbb_new"); } else { push(@test_new,"$aaa,$bbb"); } } 全上書きで@test_newをデータ書き込み こんな感じで、要はデータ修正用のものを組んでみたのですがなぜかこれを走らせる都度先頭に半角スペースが入ってしまいます。 1<>あああ<> 2<>いいい<> 3<>ううう<> なぜなんでしょうか?
>>249 もしかして出力処理で
print "@test_new"
とかダブルクォーテーションで括ったりしてない?
改行コード間違えてんじゃね? 走らせるって@test_newをprintするとってことか? そもそも push(@test_new,"$aaa,$bbb_new"); は push(@test_new,"$aaa<>$bbb_new"); にしたいんじゃないかと
252 :
249 :2005/10/26(水) 15:11:27 ID:???
>>250 >>251 すいません。カキコ時ミスでした。
そうです。
push(@test_new,"$aaa<>$bbb_new<>\n");
です。
保存時は
&Memory2($dataname,"@test_new");
…とし、保存時流用のため、サブに飛ばしています。
そのサブは以下のようにしています。
sub Memory2 {
local ($param) = @_[0];
local (@param2) = @_[1];
open(OUT, "> $param");
print(OUT @param2);
close(OUT);
chmod(0666,$param);
}
…お前何の本見ながら勉強してんの?
>>252 > &Memory2($dataname,"@test_new");
~~~~~~~~~~~~~
しっかり括ってるじゃないか・・・原因はこれ
ダブルクォーテーションで括った場合の配列変数の展開は以下と同等
join(@array, $")
$"のデフォルト値は半角スペースだからこういうことになる。
&Memory2($dataname,@test_new);
とすればよい
255 :
254 :2005/10/26(水) 15:30:08 ID:???
うへ、joinの引数順間違えた join($", @array) が正解
256 :
249 :2005/10/26(水) 16:01:49 ID:???
>>254 &Memory2($dataname,@test_new);
…とすると1行目の変数しか書き込まなかったので、ダブルクォーテーションを付けていました。
サブに飛ばさず、
open(OUT, "> $dataname");
print(OUT @test_new);
close(OUT);
…とすれば、半角スペース問題が解決しました。
本当にありがとうございました!!
>>256 ああ、スマソサブルーチンのほうをよく読んでなかった。こっちも間違ってるな
local ($param) = shift @_;
local (@param2) = @_;
とか
local ($param) = @_[0];
local (@param2) = @_[1..$#_];
とかにしないと。
でも、いまさらlocalは古いと思うが・・・
Perl4にも対応しなくてはならないということでなければmyを使うのがお勧め
my $param = shift;
my @param2 = @_;
258 :
249 :2005/10/26(水) 16:22:44 ID:???
>>257 ほんと、重ね重ねありがとうございます。
無事、サブルーチンに渡してもうまくいくようになりました!!
ファイルから探さずに、ディレクトリ読めばいいだけじゃないの?
260 :
nobodyさん :2005/10/27(木) 18:26:04 ID:MmBYG7yb
すいません。 @flagの中に一つでも1があったら 1を返したいのですがよい方法があったら教えていただけないでしょうか? 今の所 if(@flag == 1 && $flag[0] == 1){ return 1; }elsif(@flag == 2 && $flag[0] == 1&& $flag[1] == 1){ return 1; }elsif(@flag == 3 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1){ return 1; }elsif(@flag == 4 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1&& $flag[3] == 1){ return 1; }elsif(@flag == 5 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1&& $flag[3] == 1&& $flag[4] == 1){ return 1; }else{ return 0; } とやっているのですが不恰好なので。
261 :
260 :2005/10/27(木) 18:29:10 ID:MmBYG7yb
あ、、、すいません。 >@flagの中に一つでも1があったら じゃなくて@flagの中全部1だったらです。
return @flag == grep($_ == 1, @flag) ? 1 : 0;
>>263 それも思い付いたけど、@flag が (1, 1, 1, ..., 1) とかだと遅い。
265 :
nobodyさん :2005/10/28(金) 01:41:57 ID:bf2gwUIh
foreach (@flag) { /(^0^)/; /(f^_^)/; }
orz=3;
267 :
nobodyさん :2005/10/28(金) 06:37:45 ID:OMxdiAJ2
>>260 foreach (@flag){
if($_ == 1){ return 1; }
}
じゃ駄目?
>>257 my($param, @param2) = @_;
ってやっちゃ駄目ですか?
自分のスクリプトではこうやって渡しちゃってるんですが・・・
268 :
nobodyさん :2005/10/28(金) 06:48:30 ID:zLDMG+JK
>261 sub flagcheck{ my(@flag) = @_; foreach (@flag){ if(!$_){ return 0; }} return 1; }
269 :
nobodyさん :2005/10/28(金) 06:49:19 ID:zLDMG+JK
sub flagcheck{ foreach (@_){ if(!$_){ return 0; }} return 1; } これでよかったか
超好みの問題だけども if(!$_){ return 0; より return 0 unless $_; の方が……どうでもいいか。 それより、0と1しか入っていないことは保障されてる?
271 :
nobodyさん :2005/10/28(金) 07:11:26 ID:zLDMG+JK
>>270 書きながらそれは思ったけど、質問の段階で 0 と 1 しか出てこなかったので ^^;
1 以外が入ってれば … も考えるなら
if($_ != 1){ return $_; }
かな?
unless ($_) { return 0; } または return 0 unless $_; 次の行に return $_; 個人的にだけど、否定だけで分岐する場合にはunlessが見やすいと思う。
273 :
nobodyさん :2005/10/28(金) 07:33:02 ID:FKANG7gP
use strictを使うように心がけようと思い、ここ最近ののソースには書いているのですが、 requireしたファイルの中でグローバルを宣言するにはどうしたらいいのでしょうか? requireしたソース中でmy宣言したらその中でしか見えず、エラーが出てしまいました
>requireしたファイルの中でグローバルを宣言するにはどうしたらいいのでしょうか? kentのように、1つの変数をずっと使うような設計は止めたほうがいい。 >requireしたソース中でmy宣言したらその中でしか見えず、エラーが出てしまいました ソースのmyというか、スコープをもう一度勉強して。 むりやりstrictでエラーを出させないようにするなら、qw($hoge);
>>273 274の言うように可能なら変数を見せなくてすむように設計を見直した方が
いい場合が多いが、どうしてもやりたいのならモジュールにしてimport/export
するのがいいんじゃないかね。
276 :
nobodyさん :2005/10/28(金) 09:15:21 ID:FKANG7gP
レスありがとです。 requireした先でのグローバル確保したいってのは止めた方がいいというのは分かってはいるのですが・・・ やっぱ面倒くさがりはじめるとエラーが多くなるんでしょうかね。 出来る限り引数、戻り値を設定して呼ぶようソース見直します。 ありがとうございました。
悪い癖を覚えないうちにアドバイス。 コーディングはファイルサイズ増えても、半角スペースとタブをうまく使うようにするといいよ。 あと、コメントも適度にあるといいね。
>>273 参照/設定専用のサブルーチンを作ってそれでアクセスするようにすればいい。
オブジェクト指向で言うところのアクセサってやつ。
my(@flag) = @_; といったカッコをつけたコードはどういう意味があるのでしょうか?
多分こういうことを聞きたかったのかとエスパーしてみた。 myをまとめて指定する場合()でくくる必要がある。 別にmy @flag = @_;でも可 my ($hoge,@flag) = @_; としていて、$hogeを消した名残かもしれない。 my (@flag) = @_; my ($foo, $bar); my (@age, @sage); と連続して書く場合、見た目の為?に括弧くくりしてあるのも見かける。
282 :
nobodyさん :2005/10/28(金) 11:26:27 ID:3fcMXuGT
my($a, $b); ってする時に括弧をつけるので、見た目統一のために1つのみの宣言でも括弧を付けてます。
283 :
279 :2005/10/28(金) 12:31:13 ID:???
すみません281さんの通りです。 右辺のコンテキストを変えた、もしくはmyの適用範囲を指定したコーディングでもないのに カッコを付けるのが紛らわしく感じたのです。
>>267 > my($param, @param2) = @_;
> ってやっちゃ駄目ですか?
もちろん構わない
shiftを使って引数を取り出すかリストコンテキストで一気に代入するかは好みが現れる所だろうな
しかし、自分でも書いた後、説明とはいえ
> local ($param) = @_[0];
> local (@param2) = @_[1..$#_];
こんな回りくどいやり方は無いなと思った…しかも上間違えてるし$_[0]
>>277 それ激しく同感。上手くタブとスペースを使い分けて書かれてるソースってめったに見られないよな
よくあるのがこういうインデントだけど、タブ幅が変わると悲惨なことになる
if (expression) {
____for (range) {
[_TAB__]{ #Some blocks
[_TAB__]____function(multiline,
[_TAB__][_TAB__]_____arguments)
[_TAB__]}
____}
}
漏れの思う理想形はこんな感じ。これならタブ幅がいくら変わっても適切なインデントで見られる
if (expression) {
[TAB]for (range) {
[TAB][TAB]{ #Some blocks
[TAB][TAB][TAB]function(multiline,
[TAB][TAB][TAB]_________arguments)
[TAB][TAB]}
[TAB]}
}
>>285 上の例、ひどすぎないか?
tab size を 8 にして、indent size を 4 にしているということ?
> よくあるのがこういうインデントだけど、
よくあるのか・・・?
>>286 そういうこと
Perlの標準モジュールとか見てみれ 大半がこんなだよつд`)
CGI.pmとかMemoize.pmとか
>>286 同じソースを複数人で弄っていて、コーディング規約も何もない場合
tab と space が混在してもっとひどいことに・・・。
>>286 Emacs のデフォルトがそんなんだったような。
漏れの思う理想形は、タブは一切使わず SPACE のみでインデント。
Emacs なら (setq-default indent-tabs-mode nil) しると。
>>289 スペースのみか、それも良いな
でも、漏れが読むときは全部タブに置換することが度々
スペースで固定しちゃうと、その人の好みのインデント幅に合わせて
読めないというのがあるんだよなぁ…
# 個人的に、使い慣れてるエディタ上でのタブを表す→を、
# インデントとしてみるように目が慣れちゃってるのもあるのかも
まあ好みは人それぞれ分かれるから、他人のソースを読むときは
PerlTidyを通すのを習慣付けろってことか、これは
インデントはタブ、関数など括弧の前後は半角スペースで統一してます。
>>287 CGI.pm見たけどタブは使わずスペースのみだった。
お願いします。 ファイルハンドルを局所化することは可能でしょうか。 再帰したサブルーチンの中で毎回違うファイルを扱いたいのです。
すみません、何も考えずに質問したわけではないのですが、書いた後に ファイルハンドルへのリファレンスだか型グロブだか(よく理解していない)を 局所化した変数に入れておけば解決できるのではと思いつきました。 その方向で調べてみますが、方向性が間違っていましたら教えてください。
オープン、処理、クローズまで一連の動作をするサブルーチンなら、難しいこと考えなくてもいいのでは。 引数にファイルを指定するぐらいかな?
ちょっと込み入ったことになってまして、 オープン、処理、クローズの、処理の部分でもう一度再帰的に自分自身を呼び出しているので、 クローズする前に同じハンドルで別ファイルをオープンしてしまってるんです。
>>298 ありがとうございます!!そのままずばりの質問でしかもFAQということで
まことに恐縮です。おかげさまで解決しました。
>>299 FAQに書いて無いようなので補足
モジュールが使える環境ならIO::Fileを使うことをお勧めする
301 :
nobodyさん :2005/10/30(日) 23:02:00 ID:ZWocYOMF
初心者です。 意味を教えて、と言うものです。ごめんなさい。 既存のソースを使って勉強中に、フォームをデコードしたい部分で read(*******略*******); undef(%in); というものが出てきました。 undef とはどういう関数なのでしょうか。 リファレンスで探してみたのですが、名前付き単項演算子として列記されているだけで、 解説が載っていませんでした(初心者向けだから?) ぐぐってみたものの、他の項目の解説用のソースばかり出てきてしまい、 undef の解説が見つけられず、困っています。よろしくお願いします。
見つからないわけねーだろ。 どういう調べ方してんだ。
303 :
nobodyさん :2005/10/30(日) 23:09:40 ID:ZWocYOMF
pear undef で検索してみたのですが… 何か手がかりがあれば教えていただきたいのですが。お願いします。
>>303 ってpearじゃなくてper「l」だヾ(゚Д゚#)ノ゙ゴルァ
306 :
nobodyさん :2005/10/30(日) 23:20:17 ID:ZWocYOMF
ありがとうございます。 (つづりまちがいは、ここに書いたときだけでした;) ソースに undef(%in); と出てくるものの、 %in は後にも先にもここ一つなのですが…、 どこにも出てこない変数をクリアすることに意味はあるんでしょうか? (もしかして、悪いモノを見本にしてしまったのでしょうか) (呼び出しているプログラムは jcode.plのみです)
>>306 多分、%in は使っていないけど、$in{.......}
は使っているというオチだろうな。
>>306 %inじゃなくて$in{...}の形ででてきてるかもね。
しかし%inをundefして使いまわそうとしている
あたりあまり筋がよさそうではないので、手本に
はしないほうがいいんじゃないかなー。
>>306 > (もしかして、悪いモノを見本にしてしまったのでしょうか)
模範的といえるような綺麗なPerlスクリプトって正直なかなか無いからねぇ。
現状良い見本を見て育った人のほうが少ない気もする
駱駝本買っとけ
>>308 myで宣言してスコープアウトで自動で破棄させるべき、かな
312 :
301 :2005/10/31(月) 00:25:50 ID:8r5lDkYL
本屋で買った、初心者用CGIの本を頼りにやっていたので 載っていないことが多かったのですが、 教えていただいたリファレンスとかも読んで、わかってきました。 これまでに、COBOLしかやったことがなかったので、 勘違いしていることもありました(汗 ありがとうございました。
%inはcgi-lib.plからreadparseしてる予感!
[TAB]ってなんですか?
正規表現で使う「\t」の代替文字のことかな? phpとかrubyでは良くみるけどperlで使えたっけ?
316 :
301 :2005/10/31(月) 00:50:00 ID:8r5lDkYL
>>313 cgi-lib.plは使ってないんです。
コボラーとしては、宣言もなしに変数がイキナリ使われていることに慣れません…
>>316 use strict;してないのはそんなのばっかりですよ。
大手よりも細々とやってるとこの方が、意外としっかりしたコードかいてることが多いです。
kentのはジンマシン出るかもしれないので注意してください。
319 :
301 :2005/10/31(月) 01:17:17 ID:???
use strict ってなんですか? てか、[安全ではないコンストラクトを制限]と言われても 具体的にピンと来ないのですが・・・ 自分で全部ソース書くよりも、 便利なモジュール使ったほうが間違いがない…ってことですかね。 Kent-webのCGIは、そのまま(改造とかナシで)使ったことがあります。 見た感じでは、ダラダラ〜っと大きいルーチンが書いてあって 読みづらいと思ったのですが(だからあんまり見てない) 見本にするには不向きってことですか?<ジンマシン
>>319 use strictは一言で言えば安全にプログラミングするためのプラグマだが…
とりあえず、一番のご利益は宣言の強制かな
my宣言をせずにいきなり変数を使おうとすると
エラーにするなどの機能を有効にする。というようなのがuse strict 'vars';
my $hoge = 'hogehoge';
print $hage; # use strict;すれば$hageは宣言されて無いのでエラー
見たいなミスを予防したりできる。
Kentは・・・まあ見本にはお勧めしないとだけ言っておこうか
KENTは悪い見本。最悪レベル。 いい見本は、コアモジュールのコードを読めばいいと思う。あと高いけど駱駝本
駱駝本は長い目で見れば高くはないさ。
>>321 良いにくいことをはっきり言うね…まあ同感なわけだけど
324 :
名無し募集中。。。 :2005/10/31(月) 03:15:06 ID:s3JdPwyc
ラクダ本見辛いって思うのは私だけ?
325 :
301 :2005/10/31(月) 03:24:24 ID:???
>>302 ありがとうございます。
VBで言うところの、Option Explicit みたいな役割ってことでしょうか。
またまた質問なんですが、グローバル変数の宣言は、
$hensu;
だけでOKなんですか?
my とか local に相当する言葉はナシで良いのでしょうか。
(my と localについての解説しか見当たらないので)
検索していて our というのも見つかりましたが…
>>324 見るんじゃない、感じるんだ。
>>325 文法を 1 から 10 まで習うつもりか?
入門書か、perlsyn と strict.pm の perldoc ぐらい読んでから来いよ。
327 :
321 :2005/10/31(月) 10:23:36 ID:???
>>323 ま、ああいう言いにくいことは、自分のblogで書けないからね
ここでなら言っちゃってもいいかなーって思ってぶっちゃけたw
かと言って初心者がC-Board見ても仕方無いだろうなあ
329 :
nobodyさん :2005/10/31(月) 16:26:16 ID:mS98tkDz
文字列中の、<div id="aaa">から、それに対応する</div>までを消すにはどのように表せばいいんでしょうか? <div id="aaa">から</div>までの間には、<div id="bbb">〜</div>とか<div id="cc">〜</div>とかがいっぱい入ってるんですが。。。
divの数を数えればいいじゃん。 開きが見つかれば+1 閉じが見つかれば-1 0の時点で閉じがあれば、そこで終了。
use strict; use warnings; use HTML::TreeBuilder; my $doc = HTML::TreeBuilder->new_from_file('test.html'); map { $_->delete() } $doc->look_down('_tag' => 'div', 'id' => 'aaa'); print $doc->as_HTML(); こんでいいかね。
>>332 あぁ、そうね。スマンカッタ。
$_->delete() for $doc->look_down('_tag' => 'div', 'id' => 'aaa');
if($test == $sample){ print"OK!!\n"; } $test =1, $sample =1, の時変数が数字なのか文字列なのかそれとも両方混じっているのか分からない時の 演算子はどうしたら言いのでしょうか。 eqで事足りると思うのですが、文字列と数字は分けなくて演算子をつかわなくてはいけないそうなのです。 すごく初心者的な質問ですいません。
>>334 たぶん宿題かなんかなんだろうが、お前はperlの前に
まず日本語を勉強しろ。何が言いたいのかさっぱり
わからん。
>>334 使わなくてはいけない、ではなくて自分がその中身をどう扱いたいか。
数値として扱いたいなら==を使えば良いし、文字列として扱いたいならeqを使えば良い。
数値として扱うというのは、"1.0"と"001"みたいなのも同じ1とする。
文字列として扱うというのは、これらを別のものとして扱うということだ。
337 :
336 :2005/10/31(月) 23:01:33 ID:???
>>334 質問にちゃんと答えてなかったかな。補足。
数値として扱えない文字が入っているのに数値として扱おうとする場合、
それ以降は無視される(1q3 => 1)
数値が入っているか文字列が入っているかわからないときに比較したいということは、
1q3と1axが同じ、と判断されちゃまずいということだよな。なら文字列として扱えば良い
338 :
334 :2005/10/31(月) 23:43:09 ID:???
レスありがとうございます。 演算子で数字と文字列同じように使えるeqの方が便利だからと言う理由でeqを多く使っていたのですが、 計算するわけでもないので、無理して==を使う必要がなく、「いけないではなくどう扱いたいか」で 凄く納得がいきました。 解りやすく説明していただきありがとうございます。
>>334 $hoge = "abc";
$hoge++;
一応こんなのも学んでおくといいかも
340 :
334 :2005/11/01(火) 01:06:49 ID:???
いろいろもう一度最初から見なおして見ます。 基礎的過ぎて詳しく説明しているところがあまりなかったので。 ありがとうございました。
341 :
nobodyさん :2005/11/02(水) 15:33:18 ID:lpDOmIjl
2台のサーバーにCSVテキストデータとCGIを別々において CGIからCSVを読み込むにはどのようにすればよいでしょうか? お願いします。
2台のサーバを統合する。 Socketモジュール系を使う ftp.plライブラリを使う
>>341 nfs, ssh, http, ftp あたりでデータのやりとりすればOK。
344 :
341 :2005/11/02(水) 16:38:32 ID:lpDOmIjl
>>342-343 返信ありがとうございます。
ftp.plライブラリはどのようにして使うんでしょうか?
また、テキストファイルを定期的に更新したいんですが
どのようにすればよいでしょうか?
お願いします。
>>344 定期的な更新はcronコマンド。
ftp.plの使い方はググルのが吉。
346 :
345 :2005/11/02(水) 16:42:13 ID:???
↑我ながら「グルル」は良くないとおもた。 「ぐぐる」か「ググる」方が的確かl。
さすがにグルルはだめでしょう グルルは
>>344 も少し詳しく書かないと分からないよ。
> また、テキストファイルを定期的に更新したいんですが
> どのようにすればよいでしょうか?
環境は? win? unix?
また、CGIスクリプトから更新したいの? 他のプログラムから?
CGI.pmを使って,スクリプトの状態をファイルに書き出しています. if($cgi -> param(save)){ open(OUT,"> ./test.dat") || die; $cgi -> save(OUT); close(OUT); } このように,テキストエリアとチェックボックスのフォームデータを保存して, 別のcgiファイルで,読み込みをしています. #フォームデータの読み込み $file = "./test.dat"; open(IN,$file) if (-f $file); $cgi = new CGI(IN); close(IN); テキストエリアはきちんと保存値が表示されたのですが, チェックボックスが全て未チェックの状態になってしまいます. なにかチェックボックスでは処理が必要なのでしょうか?
>>349 <input type="checkbox" name="hoge" value="hage" checked>
>>349 チェックボックスをチェックOn状態にするにはchecked属性が必要というのは理解してる?HTMLの話。
CGI側はvalueを複数受け取るけどね。
分かんないかも知れないから書き換え pirnt $保存値 eq '保存値' ? qq|<input type="checkbox" name="hoge" value="hage" checked> : qq|<input type="checkbox" name="hoge" value="hage">| ;|
>>352 事故レスorz
pirnt $保存値 eq '保存値'
? qq|<input type="checkbox" name="hoge" value="hage" checked>|
: qq|<input type="checkbox" name="hoge" value="hage">|
;
ファイルのオープンエラーをdieで終わらすのか・・
チェックボックスのチェックをいれるには,checkedが必要だということは認識しています. そうやって,デフォルト値を操作して,チェックを入れた状態で表示するのではなく, $cgi = new CGI (IN); こうやって,ファイルを渡してあげて,保存値を反映したいのです. テキストエリアではこの方法が上手く使えたのですが, チェックボックスでは保存値が反映されなかったのです. どうにかして,チェックボックスに保存値を反映したいのですが,どうすれば良いのでしょうか? という趣旨でした.混乱させてもうしわけありませんでした.
>>355 ドキュメントを熟読して問題を切り分けよう。
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod 1. フォームから送られてくるデータはプログラムに渡される時点で
コントロールの種別に関係なく name=value の形になっているので、
テキストエリアなら受け取れるがチェックボックスでは受け取れない
という事が起こるならそれはフォームの書き方かブラウザがおかしい。
2. save メソッドはドキュメントにあるように human readable な形で
書き出してくれるので、まず全てのデータが正常に受け取れ、且つ
書き出せているかを確認。更にファイルハンドルを渡して生成した
CGI オブジェクトが全ての保存値を読み込めているかを Vars メソッド
等で確認。ちなみに
>>349 の読み込みコードはファイルの読込権限
が無いと open に失敗するのでエラーチェックになっていない。
3. 読み込んだデータは 1. と同じく名前と値のペアの集合でしかない
ので、保存値を反映したフォームを出力したいなら、それらを適切な
要素に当てはめ直す作業が必要。→
>>350-353
詳細なアドバイスありがとうございます. 順を追って確認してみます. 特にVarsの使い方を教えていただき感謝いたします.
解決しました! 保存値はちゃんと渡せていましたが,チェックボックスの生成方法がオブジェクトを介さずに CGI::checkbox と行っていたためでした. みなさんほんとうに有り難うございました.
use utf8で文字列内やヒアドキュメント内で変数展開をすると 変数の後ろの文字列も含めて変数と解釈されてしまいます。 "${str}文字列" "$str\文字列" $str . "文字列" などのようにエスケープなり逐一処理するしかないのでしょうか?
>>359 そりゃそうだ。
個人的にはソースに直接マルチバイトな文字リテラルを入れるのがそもそも
イカンと思うがね。
勉強厨房でサーバー駆動に挑戦してますが
CPAN のエラーが出てモジュールを入れられなくてコマってます。
--01:20:02--
ftp://ftp.perl.org/pub/CPAN/authors/id/M/MS/MSCHWERN/CHECKSUMS.gz (試行:18) => `-'
ftp.perl.org[163.143.1.21]:21 に接続しています... 接続しました。
anonymous としてログインしています...
サーバの応答にエラーがあるので、接続を終了します。
再試行しています。
こんなのがでて、ずっと先へ勧めません。
いった移動してよいやらこまってます。
FTPへ手動での接続はできているんですけど・・・
Convert::UUlib
Convert::TNEF
あたりも、みんな ftp/perl.org への接続で失敗してるようです。
どなたかお知恵を拝借できればと思います。
よろしくおねがいします。
すいません、質問です。 文字列$commentがあって、 while($comment=~m//g){}を使って<tag>または</tag>を順々にマッチさせたいのです。 んでマッチしてから<tag>と</tag>のどちらがマッチ… あ、わかった…$&で判定できるんですね… 鬱だ死のう
(゚д゚)ポカーン
$&使うもよし、()でキャプチャして$1で読むもよし foreach( $comment =~ /<.*?>/g ){ print "tag = $_\n"; } みたいに先にリストに展開するもよし
たびたびの質問をお許し下さい.CGI.pmを使ってCGIを作成しています. #保存ボタンが押されたらデータをファイルに保存する if(($cgi -> param(add)) && ($cgi -> param(yomi)) && ($cgi -> param(kanji))){ open(OUT,">> $file") or die; $kanji = $cgi -> param(kanji); $yomi = $cgi -> param(yomi); $data = "$kanji\t$yomi\n"; $cgi -> delete_all(); print OUT $data; close(OUT); } param(add)には,submitボタンの値,yomiとkanjiにはテキストフィールドの値が入っています. 保存ボタンが押されるとちゃんと,ファイルにデータが追加されるのですが, 保存ボタンを押して,リロード(F5を押す)を行うと,データが繰り返し追加されてしまいます. delete_all()して,Varsでもパラメータは消去されているのを確かめたのですが, リロードすると,やはり値が繰り返し追加されてしまいます.
途中で送信してしまいました,申し訳ありません. 続き… delete_allを行ったにもかかわらず,値が追加されるということは,どこかに値が保存されている ということだと思いますが,それはどこにあるのでしょうか? よろしくお願いします.
ブラウザが覚えてるからリロードするとそうなる 解決策はググルとたぶん見つかる どっかで見た
うん、二重投稿をエラーにすればいい
コメントからタグだけを削除したいのですが $comment =~ s/<.*?>//gs; これだけでは何か穴がありますか?
372 :
366 :2005/11/06(日) 20:09:02 ID:???
ブラウザの機能だったんですね.てっきり自分のコードにミスがあるかと思っていました. 以前のログを参照して,同じ投稿がないかチェックするようにして,二重投稿を防ぐようにして解決しました. みなさんありがとうございました.
373 :
nobodyさん :2005/11/07(月) 11:47:17 ID:92Mo7mCM
DBI初心者なのですが、Perl+PostgreSQLでWebアプリを作っています。 DBI::Pg使用し、1度の接続で下記要件を満たすSQL文を教えて下さい。 SQLではなく、Perl+DBIのプログラミング方法で可能であれば、その方法を教えて下さい。 顧客テーブルと購入履歴テーブルがあります。 顧客一覧を出力する時に、顧客ごとに購入件数も表示したいです。 顧客一覧をwhile($hash= $sth->fetchrow_hashref){}で取得し、 whileの中でさらに、$hash->{hoge_no}から購入履歴をSELECTしたのですが、 うまくいきません。お願いします。
SQLでコケてるのか、ハッシュを見る段階でコケてるのか、切り分けができてない。 Data::Dumperモジュールなどを使ってハッシュ内容をダンプしてみれ。
377 :
nobodyさん :2005/11/07(月) 21:52:51 ID:ErqtfEJb
1: 画像の「横幅」を判別して設定値以上なら縮小 設定値以下ならそのまま表示というのをしたいです。 2: if文で何とかなると思い、扱えるように勉強しましたが、 「画像の横幅を判別する」というのはどうやってやったらいいのか・・・。 ヒントだけでも構いません。宜しくおながいします。
379 :
nobodyさん :2005/11/07(月) 21:59:49 ID:ErqtfEJb
>>378 即レスどうも
と言うことはできるんですね。
勉強してきます。
ImageMagic ってすごいよね?
鯖負担すごいね
GIFは先頭から7,8バイト目が横幅。BMPなら19〜22バイト目。PNGなら17〜20バイト目。JPGはちょいと面倒だから割愛。 横幅取得くらいなら自前コーディングで十分。
GDに比べてGIFが遅すぎ
>>377 サイズだけ取得するのならImage::Sizeでも。
>>384 DoCoMo用にGIFで吐かなきゃならんのだ。
質問です。 すごい久し振りにCGIをうPしたら、まったく忘れていたらしくエラーが出てしまいます。 しょうがないので、初心に返ってhello perlを出力しようとしたら、これもエラーです。 むかついたので、別に契約してあるプロバイダにCGIチェッカがついてるので うPして何がおかしいか調べたら、 ファイルの先頭が #!/bin/perl #!/usr/bin/perl #!/usr/local/bin/perl でないか、CGI プログラムが ASCII モードで転送されていません だそうです。???? ちなみにソースは #!/usr/bin/perl # HTML表示 print "Content-Type: text/html\n\n"; print "<HTML><HEAD>\n"; print "<BODY>\n"; print "Hello Perl World!\n"; print "</BODY>\n"; print "</HTML>\n"; ASCII モードになってないんですかね? 秀丸でファイル名:hoge.cgi ファイルの種類:その他 文字コード:自動選択 で保存したものです。何年ぶりかなので何か忘れてるのかもしれません。 ど素人で済みませんがお願いします。
388 :
387 :2005/11/09(水) 07:30:43 ID:VFhSh5VA
ああ、sageてました。ageときます。
390 :
387 :2005/11/09(水) 08:05:29 ID:5otQfz0T
EUCで改行LFでもCR+LFでもダメでした。
391 :
387 :2005/11/09(水) 08:16:09 ID:5otQfz0T
とおもったら、
>>389 で元のロリポではできました。
wakwakの解析が逝かれてるのですかね?
ひとのせいにする前に勉強しろ
393 :
nobodyさん :2005/11/09(水) 09:06:00 ID:BFWlWPsi
@imglist=grep *.jpg, readdir DIR; がエラーです。 多分正規表現の指定がおかしいと思います。
>>393 正規表現なら
@imglist = grep /\.jpg$/, readdir DIR;
ワイルドカード使おうとしてるところを見るとこのへんと混同してるのかも
@imglist = glob("*.jpg");
@imglist = <*.jpg>;
>>387 ちゃんとASCIIモードで転送しているのか?
ファイルの先頭に変なバイナリが付いていないかバイナリエディタ等で確認したのか?(UTF-8保存とかね)
>>387 > ファイルの先頭が
> #!/bin/perl
> #!/usr/bin/perl
> #!/usr/local/bin/perl
> でないか、
このメッセージは、列挙された3つの行のうち好きなものを書けば
いい、という意味ではなく、サーバに対して指定された、何れか一つの行を
書かなきゃだめ、ということだと思うが。
#!/usr/bin/perl
は本当に正しいのかな?
>>387 ASCIIモードかどうかは、文字コードとかの問題じゃなくて
FTP転送の問題ジャマイカ?
ていうかここまで来るともはやスレ違い。
どうでもいいのだけど
>>387 に一言言いたい。
ヒアドキュメント使え。
niku.2ch.netみたいなDNSBLに登録されているか調べるモジュールは何ですか? PHPでNet_DNSBLを使っていて、PerlでもDNSBLチェックをしたいです。
ありがとうございます! 入れました
403 :
387 :2005/11/10(木) 06:37:47 ID:XPue5Djf
おお、まんまり反応ないし
>>392 もあるんであきらめてたけど
色々ありがとう。
とりあえず
>>389 で、ロリポは動きました。
で、
>>395 御指摘のutf-8でwakwakも逝けました。
解決できました。
>>396 >サーバに対して指定された、何れか一つの行を
>書かなきゃだめ、ということだと思うが。
そうみたいですね。
#!/usr/bin/perlはダメで、#!/usr/local/bin/perlはいけました。
>>397 のリンクで
>スクリプト先頭行には #!/usr/local/bin/perl と記述して下さい。
と書いてありました。
でもあの書き方ではわかんないですよ。僕だけですかね・・・
>FTP転送の問題
でなくてよかったです。
とにかく、supecial thnxです。
>>403 >でもあの書き方ではわかんないですよ。僕だけですかね・・・
おまいだけ。あと「supecial thnx」は恥ずかしいからやめておけ。
釣られるなよ
407 :
nobodyさん :2005/11/10(木) 10:52:53 ID:CqV/pVhD
perlの開発ソフトってないですか? ビルダーとかみたいな
質問です。 現在フォームメールを作っているのですが、どうもうまくいきません。 スクリプトの流れとしては、 (サブルーチンA)フォームデータの取り込み、デコード、データをハッシュ(%FORM)に代入。 ハッシュのデータをソートしてメールボディー用の変数($body。もちろんグローバル変数)へ代入。 ↓ (メインルーチン)送信ボタンが押されたかチェック。 押されたら送信用のサブルーチンへ。 ↓ (サブルーチンB)確認ページの表示。ハッシュのデータをソートして表示。 なのですが、確認ページで送信ボタン(キー名はsubmit)を押すとハッシュの中身はsubmitだけになってしまうし、$bodyはどこかへ消えてしまうし、どうにもさっぱりです。 どなたか導いてください。宜しくお願いします。
とりあえずソースを全部、どこかのアップローダに上げろ
>>409 送信ボタンが押されたかのチェックなんてPerlの範疇じゃないと思うが
cgi.pm使ってdumpしてみりゃ
そもそもやりたいことがよくわからんのだが。 サブルーチンとか言ってるけど、ページの遷移はないってこと?
フリーのできるだけシンプルなフォームメール見て勉強するといいよ
質問です。 Perlでテキストファイルから1行ずつ読み込んで処理する時には while(<>){} で済みますが、 既に変数に入っているテキストを1行ずつ処理する場合、どうしたらよいのでしょうか?
改行をsplitでもすればぁ
Perl の標準で一行ずつ巡回する方法 (メソッド) って無いんだっけ? テキストの内容がでかいとでかい配列ができちゃうのがイヤだけど、 foreach my $line (split(/^/, $txt)) { # $line に何かする }
>>417 ,418
レスありがとうございます。
>>418 すいません。splitの/^/というのは??
この場合の^は行頭を表す^ですか?
420 :
418 :2005/11/11(金) 19:22:14 ID:???
>>420 それで改行で切れるんですね。知りませんでした。
ありがとうございます。
while (/^(.*)$/smg) { 処理($1) } とかでも
423 :
418 :2005/11/11(金) 20:51:55 ID:???
>>422 うお、そっちの方が無駄な配列生成しない分スマートじゃんね。吊ってくるわ・・・
>>422 ありがとうございます。
だいたいどんな事をやっているのか理解するのに
しばらくかかりました。^^;
オプションを使いこなせると便利になりそうですね。
WindowsXP、Perl5.8.7でPPMからDBD-SQLiteをインストールしましたが、connectやdisconnectは出来る(ファイルも生成される)ものの、prepareやdoメソッドを呼ぶとPerlインタープリタが強制終了してしまいます。 原因は何でしょうか?
よくある
$ua->credentials($netloc, $realm, $uname, $pass): これを使ってBasic認証通過させたいんですが 鯖側の$realmが日本語になってるせい?なのか失敗します アドバイスお願いします。。
>>427 文字コードがわからなければLWP::UserAgentのget_basic_credentialsを再定義して
$realmになに渡ってきてるのか調べてあわせてやればいいと思うよ。
431 :
nobodyさん :2005/11/14(月) 11:00:01 ID:W63Ukjvm
ReadParse()を使用してフォームから取得した変数を open関数を使用して、UTF-8でテキストファイルに出力したいのですが その方法がよくわからず困っています。 フォームから取得した変数はSHIFT_JISなので、 そのままopen関数で出力すると、テキストファイルの文字コードは SHIFT_JISになってしまいます。 どなたか知っておられる方がいましたら、よろしくお願いします。
>>431 UTF-8だから
Jcode.pmを使えばいいのかなーとか思ったけど
433 :
nobodyさん :2005/11/14(月) 17:51:10 ID:WMignAMj
PHPでいうところのshuffleにあたる関数ってありますか? つまり、やりたいことは、配列をランダムに並び替えることです。
List::Util::shuffle がいいと思う。 パフォーマンスなんて問題になってから考えれば良い。 気になるならそもそも Perl なんか使わんし。
436 :
nobodyさん :2005/11/14(月) 18:39:21 ID:3zfzQPqE
438 :
436 :2005/11/14(月) 21:57:56 ID:3zfzQPqE
ActivePerlでIO::Socketやプロセスについて勉強するには どんな本やwebページがオススメですか?
>>438 とりあえずIO::Socketでググれ
perldoc
442 :
436 :2005/11/14(月) 22:23:16 ID:3zfzQPqE
もしかしてTCP/IPつかったconsoleチャットって難しい?^^; ラクダもドキュメントも読んだけどよくわかんね^^; 神はー神はいないのかー>w<;
とんでもねぇ、あたしゃ神様だよ
444 :
436 :2005/11/14(月) 22:59:47 ID:3zfzQPqE
神様がだめなら妖精さんでもいいから降臨たのむ・・・
>>442 ラクダもドキュメントも読んだのに分からないのなら、Socket や
ターミナルを扱う為の基本的な知識が君には欠けている。
そしてその解説はこのスレの範疇ではない。
446 :
436 :2005/11/14(月) 23:20:04 ID:3zfzQPqE
初心者質問という言葉に甘えすぎました。 出直してきます。
つか何がわかんねーのかわからん状態の奴に何を答えりゃいいんだ
お前を、殺す!
通報、しますた!
451 :
nobodyさん :2005/11/15(火) 18:19:07 ID:5cRd32ic
WEBページのアクセス数が多くなってきたため、ロードバランサを用いて負荷を分散しようと思います。 現行 インターネット--------WEBサーバ(DBなど含む) 現行↑の単純な構成を ↓の構成(WEBサーバ3台、DBサーバとにしたいのですが、 イメージ WEBサーバ1 インターネット--------ロードバランサ----WEBサーバ2--------Perlプログラム&DBサーバ WEBサーバ3 この時にPerlのプログラム等に関して注意事項、不具合予測等はありますか?
>>451 Perlが関わる部分なんて無いよ
大丈夫かおいw
453 :
nobodyさん :2005/11/15(火) 18:20:45 ID:5cRd32ic
WEBページのアクセス数が多くなってきたため、ロードバランサを用いて負荷を分散しようと思います。 現行 インターネット--------WEBサーバ(DBなど含む) 現行↑の単純な構成をロードバランサーを加えて ↓の構成(WEBサーバ3台、Perlプログラム&DBサーバ)にしたいのですが、 イメージ WEBサーバ1 インターネット--------ロードバランサ----WEBサーバ2--------Perlプログラム&DBサーバ WEBサーバ3
455 :
453 :2005/11/15(火) 18:26:44 ID:???
失礼つかまった。 退散します
456 :
nobodyさん :2005/11/16(水) 00:22:50 ID:F5yPWKpZ
ひろゆきさん、おめっとー
457 :
nobodyさん :2005/11/16(水) 00:53:15 ID:??? BE:90355182-##
手軽にワイルドカードDNSにしとけ
すみません、誘導されて来ました。 画像掲示板をCGI-Perlで作ったんですが、 アドレス先に画像が存在しているかどうかを判別する事は可能でしょうか?
>>458 アドレス先って何のこと?
ローカル? リモート?
ローカルだったら訊いてこねえだろw
いや、わからんぞw
>458 マルチすんな
>>462 誘導されて来た、ってんだからマルチじゃないんじゃないの?そゆことじゃなくて?
>>458 リモートのサーバにある画像なら、HTTP でアクセスして存在確認する必要があるかと。
LWP とか使って HTTP で HEAD とか GET することになると思うけど、
具体的なやり方はまずぐぐって調べてみれ。
464 :
659 :2005/11/16(水) 19:05:42 ID:nAWFz8ua
DBI::Pgを使用してPostgreSQL7.3を使用しています。 ページャー機能(ページ送り)を加えたいんどえすが、 DBI::Pagerがレンタルサーバに入っていないため、 簡単は方法はないかと探してます。何か方法はありませんか? pure perlなモジュールがあれば一番良いのですが。
465 :
nobodyさん :2005/11/17(木) 14:07:26 ID:AgumOSx0
簡単なデータベースのようなCGIを作ろうとしています。 更新記録CGIと検索CGIを別々に見つけてそれを合わせて実現させようとしています。 この中で「○円以内のもの」を抽出するというのをしたいんです。 ドロップダウンリストに 〜100円 101円〜200円 201円〜300円 〜〜 1,000円〜 という設定をしておいて、リストからその価格帯だけを表示させるという物です。 ドロップダウンリストに <option value="1">〜100円</option> <option value="2">101円〜200円</option> <option value="3">201円〜300円</option> として、普通にif文で if($FORM{'data'} eq '1'){ if($data =< 100){ ; } else { next; } } elseif($FORM{'data'} eq '2'){ if($data => 101 && $data =< 200 ){ ; } else { next; } } 〜〜 とすればOKなのでしょうか?(データには桁区切りのカンマが入ると思います。) ほかによい方法がありますか?または、参考となるCGIがあれば同時に教えてもらえるとありがたいです。
467 :
nobodyさん :2005/11/17(木) 14:32:54 ID:AgumOSx0
>>466 回答ありがとうございます。
自分で改造を考えているので、他のCGIを利用するとかすべてを作ってもらうわけでもないのですが、
ここじゃだめなんでしょうか?
>>465 >>467 データを array か hash に入れておき、grep 等で取り出せば OK。
ex.
my @data = (
{ name => 'a', price => 100, },
{ name => 'b', price => 200, },
...
};
...
my $lower = 100; # 実際は form から入力された値を検査し、代入。
my $upper = 200;
my @out = @data;
@out = grep { $_{price} >= $lower } @out if $lower;
@out = grep { $_{price} <= $upper } @out if $upper;
...
for (@out) {
print "$_{name}: $_{price}\n";
}
471 :
nobodyさん :2005/11/17(木) 17:05:22 ID:vCe+doXk
NFSでは使用できないflockの代わりに、lockfという関数があるみたいだけど、 lockfって実際どれくらいの実績があるのでしょう? バージョンはいくつから使えるのでしょうか?
473 :
nobodyさん :2005/11/17(木) 18:11:47 ID:+ypcUw74
すみません。失礼します。行き詰ったので質問させていただきます。 PHPの「setcookie($cookie,$setword,$expire);」で発行したCookieは、 CGI等で読み込めないのでしょうか?
475 :
nobodyさん :2005/11/17(木) 19:10:47 ID:vCe+doXk
476 :
nobodyさん :2005/11/17(木) 21:47:27 ID:7TvwAtma
http://perl.toshinari.net/cgi/bbs/new2ch/ この2ch型掲示板に表示されるIDを環境変数REMOTE_USERに一致させたいのですが
どうしたらよいでしょうか
sub id {
my($id,$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$month,$date,$identify);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$identify = substr($ENV{'REMOTE_ADDR'},-2).substr(crypt($ENV{'REMOTE_ADDR'},$year-$mon*100),2);
$id = crypt($identify,$mday."L");
$id = substr($id,-10);
return $id;
を
$id = $ENV{'REMOTE_USER'};
if ($id eq '') { $id = ":"; }
にしてみたりしたのですがよくわかりません。。
>>476 質問がよく分からん。
また、
> にしてみたりしたのですがよくわかりません。。
の、何がよくわからんのかよく分からん。
こんばんは。 携帯用のフォームを作ってるんですけど フォームから送信したデータって 当然、携帯のメモリ内にあるわけですよね? あるフォームから送信、その先にもフォームがあり そこからさらに今受け取ったデータも含めて新たなデータ送信と 要はどんどん送信するデータ増えていくわけですが こういうのは問題ないのでしょうか? どなたか教えてください。 よろしくお願いします。
ありがとう。移動します。
スレ違いのカスどもが多すぎるwwwww
483 :
nobodyさん :2005/11/18(金) 03:52:36 ID:b/mBx1Hf
連想配列に %hash = ( 'audio' => "オーディオ", 'video' => "ビデオ", 'cd' => "CD-ROM", 'dvd' => "DVD", 'bench' => "ベンチマーク", 'text' => "テキスト", 'bin' => "バイナリ" ); の様に値をセットして while(($k, $v) = each(%hash)){ print "$k = $v\n"; } とか foreach (keys(%hash)){ print "$_ = $hash{$_}\n"; } ってやっても 'audio', 'video', 'cd', 'dvd' => "DVD", 'bench', 'text', 'bin' の順番 (代入した順番) で出力してくれないんですけど、代入順での出力を 希望するなら @list = ('audio', 'video', 'cd', 'dvd' => "DVD", 'bench', 'text', 'bin'); の様に“順番”を別で保持しておくしか無いんでしょか? ちなみに上記のコードだと audio cd bin dvd video text bench の順番で出力されます。
>>483 そういうモジュールがある。
名前は忘れた。
486 :
485 :2005/11/18(金) 04:24:50 ID:???
>>483 tie を使って自分でそういう hash を作ることも可能。
%hash = ( 'audio' => {index=>0, value=>"オーディオ",}, 'video' => {index=>1, value=>"ビデオ",}, 'cd' => {index=>2, value=>"CD-ROM",}, ); オレはこれでやってる。。
eachの戻り値をキーと値のリストで受け取ってる奴が多いが、 キーだけ受け取って値はハッシュから取った方が効率がいい。
>>489 普通に考えるとeachがせっかく返す値を捨てて値をハッシュから
とったらハッシュをひく手間がかかる分損しそうなものだが...
foreach (keys ...)でまわせって意味かな? それならわかる。
とりあえず論よりベンチ。
use Benchmark;
my %h = (1..2000);
timethese(undef, {
foreach => sub {
foreach my $k (keys %h) {
my $v = $h{$k};
}
},
each => sub {
while(my($k, $v) = each %h) {
}
},
each_key => sub {
while(my($k) = each %h) {
my $v = $h{$k};
}
},
});
Benchmark: running each, each_key, foreach for at least 3 CPU seconds...
each: 3 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 594.34/s (n=1890)
each_key: 3 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 470.68/s (n=1525)
foreach: 3 wallclock secs ( 3.21 usr + 0.00 sys = 3.21 CPU) @ 686.60/s (n=2204)
ベンチとるときは、できるだけ同じ条件でやらないと timethese(undef, { foreach => sub { foreach $k (keys %h) { $h{$k}; }}, each => sub { while(($k, $v) = each %h) { $v; }}, each_key => sub { while(($k) = each %h) { $h{$k}; }}, undef => sub { while(($k,undef) = each %h) { $h{$k}; }}, });
面白い結果が出た
OS : Windows XP
Ver: Active Perl 5.8.7 build 815
CPU: Athlon 1.6GHz -> 1.0GHzにクロックダウン
Mem: 256MB
ベンチマーク部
>>491 のものに
>>492 の修正を加えて使用
my %h = (1 .. $data_count*2);
データ数 2^2
Benchmark: running each, each_key, foreach, undef for at least 3 CPU seconds...
each: 4 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 142105.46/s(n=427169)
each_key: 2 wallclock secs ( 3.11 usr + 0.02 sys = 3.13 CPU) @ 138342.29/s(n=432458)
foreach: 2 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 118013.55/s(n=374575)
undef: 4 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @ 124147.58/s(n=390320)
データ数 2^4
Benchmark: running each, each_key, foreach, undef for at least 3 CPU seconds...
each: 2 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 42106.14/s (n=133687)
each_key: 3 wallclock secs ( 3.00 usr + 0.01 sys = 3.01 CPU) @ 40220.63/s (n=120863)
foreach: 4 wallclock secs ( 3.30 usr + 0.00 sys = 3.30 CPU) @ 48033.28/s (n=158750)
undef: 3 wallclock secs ( 3.10 usr + 0.00 sys = 3.10 CPU) @ 35960.05/s (n=111620)
データがごく少ない場合においてはeachでまわしたほうが若干速い。
でも2^3個程度までの話だしkeysをforeachで回したほうが良さそうだな
うちじゃ逆だな。キー数が少ないうちはforeach+keysが速いが、 多くなるに連れて遅くなり7000個あたりでeach系に抜かれた。 list eachとscalar eachでは微妙にscalar eachのが速いが、 ループ内で値をたくさん使うならlist eachのがよさそう。
496 :
493 :2005/11/18(金) 16:18:46 ID:???
>>494 データ数1024よりも多くして実験してなかった・・・こちらでは2050付近で抜かれた
>>495 詳しい検証乙
データ数が増えるとkeysの戻り値の配列の大きさがネックになるわけか
CGI::Liteも5.8x系の標準モジュールにしてほしいんだけど、 こういうのはどこで言えばいいんだろ(´・ω・`)
499 :
nobodyさん :2005/11/18(金) 17:03:10 ID:b/mBx1Hf
>>485 @list = (['key' => 'val'], ...);
これで値をセットしたときってどうやって取り出すんでしょうか?
for(my($i) = 0; $i < $#list; $i += 2){
my($key, $val)= ($list[$i], $list[$i + 1]);
〜処理〜
}
って感じですか?
>>485 , 486
ちょっと使い方を覚えてみようかな
>>488 そうやって値をセットしたときの取り出しはどうやるんでしょか?
501 :
nobodyさん :2005/11/18(金) 17:25:13 ID:b/mBx1Hf
にゃるほろ2次元配列ってゆう考え方でしたか。 慣れるまでに時間かかりそうですが、ありがとうございました m(_ _)m
502 :
nobodyさん :2005/11/18(金) 17:35:46 ID:b/mBx1Hf
教えてもらった事を比較的自分に分かり易い様にしようと弄ってたらこんな感じになりました。 @list2 = ( {'audio' => "オーディオ"}, {'video' => "ビデオ"}, {'cd' => "CD-ROM"}, {'dvd' => "DVD"}, {'bench' => "ベンチマーク"}, {'text' => "テキスト"}, {'bin' => "バイナリ"} ); foreach (@list2){ my($key, $val) = each(%$_); print "$key => $val\n"; } 順番を保持しなくちゃならないときはこんな感じでいこうかなって思います。
>>502 ちなみに
>>485 みたいに配列使うなら
foreach my $elem (@list) {
my($key, $val) = @$elem;
}
で行ける。
>>502 のやり方だと要素が1つだけのハッシュがいくつか出来てしまうので
少しだけ空間効率が悪い。
まぁ、小さいから気にならないだろうけど。
504 :
nobodyさん :2005/11/18(金) 17:45:08 ID:b/mBx1Hf
>>503 おぉ〜、そのやり方のほうがスマートな気がする。
いやはや勉強になります。
>>499 「ハッシュはリストである」ということを知っていれば、簡単にわかる。
@foo = (1,10,2,20,3,30);
%bar = @foo;
print "$_ -> $bar{$_}\n" foreach keys %bar;
506 :
nobodyさん :2005/11/18(金) 18:15:31 ID:lIGSV4IR
>>506 要約すれば「保守性の高い、美しいコードを書く術を学び、書きましょう」ということです。
509 :
nobodyさん :2005/11/18(金) 18:32:14 ID:EJTafLuM
Perl版の新月(P2Pを用いた掲示板)をデバッグしたいのですがPerlでP2Pアプリを作成するチュートリアルのようなものをご存じの方いらっしゃいませんか? ぐぐっても九行で書かれたP2Pしか出てこなくてorz
>>509 デバッグに必要なのは「P2Pアプリを作成するチュートリアル」ではなくて
Perl のマニュアルではないのか?
>>7-8
>>510 すいません。やりたいことの整理が出来てませんでした。
新月作者がPerl版の開発を放棄してるので、余分な機能を付与しない掲示板だけのP2Pソフトを作りたいんです。
ただP2Pアプリを弄ったことがないものでどうしたものかなと。
ソース読んで改造するのがてっとりばやいにしても概念が分からないので・・
nyの技術 pdfで流れてる
丸一日質問がない
そう言う時はageて見ようぜ
すみません、パールインストールしたんですけれど、動かないです インストール成功したかの確認方法ってありますか?
>>518 コマンドプロンプトから「perl -v」
ていうか情報が何もかも足り無ぇ出直して来い
この流れほのぼのしててイイ
WebProg板らしくていい
523 :
nobodyさん :2005/11/20(日) 01:29:36 ID:q2W9WK5M
ああん?
(・∀・)ニヤニヤ
すみません、postのチェックボックスのステータスを大量に変数に格納したいのですが、 変数名をループで作り出すにはどうすればいいのでしょうか? my $chk0 = param('chk0'); ↑の数字をforループでインクリメントして宣言するにはどうしたらいいでしょうか?
>>525 配列を使えといいたいが
foreach(0 .. 9){
${'chk'.$_} = 適当;
}
名前1->得点1 名前2->得点2 っていうような配列があり、得点でソートする事までは出来た。 で、得点順に順位をつけるんだが、同点の場合同じ順位にし、次の順位は飛ばすって事ができなくて詰まっている。 現在は配列をforループし、$iをインクリメントして順位としている。 何かいい方法は無いだろうか。
>>528 素直にわかりませんって言えないんですか?
>>529 既に回答を用意してる漏れがはっきり言ってやろう
> 名前1->得点1 名前2->得点2 っていうような配列があり
ここが意味不明。
以下に漏れが適していると考えたデータ構造とそのソースを貼ったるから
これで満足できないならちゃんと伝わるように説明汁
my %name2score = (hoge => 100, fuga => 90, hage => 100);
my %score2name;
foreach my $name (keys(%name2score)) {
push @{$score2name{ $name2score{$name} }}, $name;
}
my $rank = 1;
foreach my $score (sort {$b <=> $a} keys(%score2name)) {
foreach my $name (@{$score2name{$score}}) {
printf "%2d: %s(%3dpt)\n", $rank, $name, $score;
}
$rank += @{$score2name{$score}};
}
最近質問者の態度が悪過ぎ
532 :
527 :2005/11/20(日) 20:46:03 ID:???
>>530 thx
考え方さえわかれば後は自分で弄れると思いましたので、データ構造を適当に書いてしまいました。
申し訳ありませんでした。
あ、
>>529 は自分ではありませんので、念のため。
だな
>>527 ←こんな口の聞き方も知らない奴に教えなくていいよ
小学校高学年ぐらいの子供だろけど。
>>532 ク、クマー 釣られたか。すまんかった
いつの間にか煽り耐性なくなってしまっとるな・・・気をつけなければ
( ´,_ゝ`)プッ
WebProg板らしいじゃないか
ほんと厨房が多いな さっさと強制IDにしろよこの板
質問者は age ればいいんでないか
スレの雰囲気悪くすると自分の首を締める事になるよ >厨房
>>535 嫌だ。
私はお前みたいなガキを眺めてるのが好きなのだ。
レン鯖板も、インターネット板も、WebProg板も…
ああまた騙りかウゼェな。トリップ付けるから。
レン鯖とネットは元からだろw それよりム板も・・
545 :
nobodyさん :2005/11/20(日) 21:42:34 ID:sql5orzi
厨房スレage
>>545 IDがSQLにorzなんて素晴らしいですね
547 :
nobodyさん :2005/11/20(日) 22:45:33 ID:Va/OuDM7
SUGEEEEEEEEEE!
次スレのテンプレには「質問者はトリップ推奨」といれよう。
釣られた人も必死だなー
ぷ
551 :
nobodyさん :2005/11/21(月) 03:36:00 ID:m9z0lXWM
>>527 純粋に順位を加えていく変数($i)と、状況に応じて順位を加えていく変数($j)の2つをつくる。
$iはループ中でひたすらインクリメントのみ。
$jは直前の人の点数と異なれば$iを採用する。 同じであれば$jをそのまま採用。
で出来ないかな?
552 :
nobodyさん :2005/11/21(月) 07:40:49 ID:HZcu4vs3
はじめまして。 質問があります。 perlで$ENV{'PATH_INFO'}を取得しようとしていますが、 なぜか取得してくれません。 これはサーバー側の設定が影響しているのでしょうか。 ちなみに、他の環境変数については、正常に取得しています。 よろしくお願いします。
>>552 それだけじゃ分からん。
取得する辺りのコードと、設置する鯖晒す。
554 :
552 :2005/11/21(月) 09:10:44 ID:HZcu4vs3
お返事ありがとうございます。 今やりたいことは、稼動中の掲示板の改造です。 $ENV{'QUERY_STRING'}からGETで取得している値を、 $ENV{'PATH_INFO'}から取得したいと思っています。 ◆サーバー:ロリポップです。 ◆コード 値を確かめるために、下のようなコードだけを記述したファイルを アップし、適当な引数を付けてテストしていました。 print"Content-type: text/html\n\n"; print qq( <HTML><HEAD><meta http-equiv=Content-Type content=text/html; charset=shift-jis> </HEAD> <BODY> $ENV{'PATH_INFO'} </BODY> </HTML> ); exit; よろしくお願いいたします。
>>554 PATH_INFOを勘違いしてるって事は無いよね
テストに使ったURLはどういう形式?実在じゃなくていいから
556 :
nobodyさん :2005/11/21(月) 09:26:41 ID:HZcu4vs3
path_infoって、文字のままでpath情報だけでは? getメソッドの取得はquery_stringのままでいいと思うけど、変更しないといけない理由は?
>>556 それ、PATH_INFO 含まれてないし。とりあえず CGI.pm のドキュメント嫁。
OBTAINING THE SCRIPT'S URL と FETCHING ENVIRONMENT VARIABLES の path_info() のところ。
多分探せば日本語訳もある。
559 :
nobodyさん :2005/11/21(月) 10:31:19 ID:HZcu4vs3
ありがとうございます。 何か私が勘違いをしているのでしょうかね。 ドキュメントを読んで見ます。
560 :
nobodyさん :2005/11/21(月) 11:37:26 ID:5KZiaClr
@abc=split(/\,/,@aaa[0]); if(@abc[1] eq $name){&error} @abc=split(/\,/,@aaa[1]); if(@abc[1] eq $name){&error} @abc=split(/\,/,@aaa[2]);if(@abc[1] eq $name){&error} これを一行にしたくて@abc=split(/\,/,@aaa[0,1,2]); if(@abc[1] eq $name){&error} にしたんですけど機能しません どこを直したらよいのでしょうか?
>>560 splitは配列を受けられない
見たところその処理はチェックのみで代入は不要?
(split(/\,/, $_))[1] eq $name && &error foreach @aaa[0,1,2];
こんな感じでどうだろ
562 :
nobodyさん :2005/11/21(月) 11:52:25 ID:5KZiaClr
>>561 レスありがとうございます
実際にはサブルーチンで代入します
すみません
使用目的は連続投稿を防ぐためで、ログファイルに同一内容があるのかチェックをしたいのです
>>562 @abc=split(/\,/,@aaa[0,1,2]);
のsplit(/\,/,@aaa[0,1,2]);の部分がサブルーチンの戻り値ということかな
期待する内容は(0の名前, 1の名前, 2の名前)という配列ということでOK?
それなら
map { +(split /,/, $_)[1] } @aaa[0,1,2];
とか。
でも、それは構造を考え直したほうが良いかも・・・
>>563 もう一度考え直してみます
ありがとうございました
掲示板のログ検索を導入したのですが、検索対象文字に\を入れるとエラーが出ます。 $ascii = '[\x00-\x7F]'; $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]'; $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; open (DATA, "<$log"); flock (DATA, 1); @line = <DATA>; close (DATA); # $wordはフォームから受け取った検索対象文字列です # 検索対象文字列はスペース区切りで複数設定可能にしてあります $word =~ s/ | /\t/g; &jcode::convert (\$word, "euc", "sjis"); @words = split (/\t/, $word); foreach (@line) { &jcode::convert (\$_, "euc", "sjis"); # ログはタブ区切りです @data = split (/\t/, $_); foreach (0 .. $#words) { # &error ($words[$_]); # ※1 # $data[6]が記事の本文です if ($data[6] =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$words[$_])/) { # &error ($words[$_]); # ※2 検索文字に\を入れて※1の部分でエラーを出そうとすると正常にエラー画面に\が表示されるのですが、 ※2で出そうとしても、その前にCGIエラーで落ちてしまいます。 下から2行目のif文内の$words[$_]に\が入った時点で落ちると思うのですが、 どのようにしたら正常に検索処理を行なえるでしょうか。
quotemeta とか \Q\E とかでエスケープしてないの? 最低限そうしないと、いろいろ死ぬぜ?
568 :
566 :2005/11/21(月) 16:19:18 ID:???
>>567 レスありがとうございます。
以下のように修正することで解決できました。
- @words = split (/\t/, $word);
+ @words = split (/\t/, quotemeta ($word));
Win+Apacheのローカルサーバで,Perlスクリプトを組んでから, オンラインのレンタルスペースにアップロードして稼動させようとしています. ローカルできちんと動くスクリプトを組むまではOKだったのですが, レンタルスペースで動かそうとすると,様々なエラーがでてしまいます. レンタルスペースの仕様書を見て,使えないモジュールのチェックなどはもちろんですが, ファイル名の大文字や小文字の判定など,他に気をつけることはありますでしょうか?
レンタルスペースの仕様書通りの、shebangが書かれていない。
1行目!
さすがに !#/usr/bin/perl はちゃんと記述してあります. 質問が少し漠然すぎたかもしれませんので,具体的な質問に変更します. $year=2005,$month=11; @allfiles=(haman200511,Amuro200511); @persons=(Amuro,Quess,Char); #指定された年月かつ,存在する人物のファイル名を取得 for my $file (@allfiles) { for my $person (@persons) { if($file eq "$person$year$month.dat"){ push(@files,$file); } } }
結果 ローカル @files=(Amuro200511.dat); レンタル @files=(); この箇所の挙動がレンタルとローカルで異なっています. ローカルのPerlのVerは5.8で,レンタルのほうは5.6なのですが, Verによる挙動の違いというようなものがあるのでしょうか? 訂正 @allfiles=(haman200511.dat,Amuro200511.dat);
>>574 @allfilesの要素をクォートで括ってないからじゃないの?
>>574 「use warnings」を有効にしてから「きちんと動く」と言ってくれ。
579 :
nobodyさん :2005/11/22(火) 17:53:28 ID:eRlqTFqT
$year=2005,$month=11; @allfiles=(haman200511,Amuro200511); @persons=(Amuro,Quess,Char); ↓ my($year, $month) = (2005, 11); my(@allfiles) = ("haman200511", "Amuro200511"); my(@persons) = ("Amuro", "Quess", "Char");
TMTOWTDI :-P
タイミング系のデバッグはどうやってやってますか?
タイミング系って何のこと言ってますか?
まったく同じタイミングのアクセスを意図的にやるにはどうやったらいいでしょうか?
>>576 use warningしてみましたが,状況は進展しませんでした.
>>579 実際のスクリプトではクォートしています.
抄写するにあたり,変数の中身を示しておこうと思い,
記述したときの手抜かりで,クオートし忘れました,申し訳ありません.
>>585 で、クォートしたらウチでは動くんだけど、そっちでは動かないの?
> さすがに !#/usr/bin/perl はちゃんと記述してあります. なんで誰も突っ込まないw
>>586 WInXp&Apacheのローカル環境だと大丈夫なのですが,レンタルスペースだとダメなんです.
ローカルとサーバの違いというものがよく判らなくて,デバッグに四苦八苦という状態です.
>>587 #!/usr/bin/perl ですね.すみません.
もう少し自分で頑張ってみてダメなようでしたら,また質問するかもしれませんが,
そのときはよろしくお願いします.
>>588 ローカルがWinってのは先に言おうな。話が全然違ってくるからな。
で、俺が言ってるのは
>>572 にクォート入れても動かないのか、なんだが。
もういいや。
>>569 無駄なやりとりが増えるから落ち着いてから出直してきなさい。
OSが異なれば改行の扱いが変わったりもするし、
スクリプトやデータファイルの文字コードに起因しているかもしれんし、
マルチバイトなファイル名/ディレクトリ名なんて脱力ものな原因かもしれんし、
FTP転送がまずいだけかもしれん。
typo
様々なエラーがでてしまいます。
挙動がレンタルとローカルで異なっています。
・・・神かエスパーじゃなきゃわからんよ。
デバッグに関するテンプレ欲しいな。
>>569 "Hello World"を表示するような単純なスクリプトを動かしてみれ。
まずはそこから。
593 :
974 :2005/11/22(火) 23:14:39 ID:???
借りている鯖がFreeBSDだって事は知っていたんだけど 文字コードなんか気にせずに秀丸で文字コードをshift_jisに設定して書いて マスタ、所が全角英数字を半角英数字にしようとしたら、プログラム自体は jcode::tr(\$arg_[$i], '0-9A-Za-z', '0-9A-Za-z'); たったのこれっぽっちなんだけど、これって文字コードがEUC-JPじゃないと 正確に変換出来ないんだよね、やっぱり皆さんもperlのプログラム書くときの 文字コードはEUC-JPデツカ?
どこの誤爆?
974デツ誤爆スマソ
596 :
nobodyさん :2005/11/23(水) 04:24:57 ID:fNvsPnqm
はじめまして 本のサンプルコードで理解できないところがあるんで教えてください。 $Value =~ /(\w+)\.(\w+)$/; なんて書くときの、最後の、 $/ って何を表すんですか? ファイル名を取り出すようなところで使われてるんだけど…。 これなに? 下の例だと$っていらない気がするんだが…。 こんな感じ 例: if($FileName =~ /(\w+)\.(\w+)$/){ $FileName = "$1\.$2"; }
598 :
596 :2005/11/23(水) 04:38:15 ID:fNvsPnqm
>>597 ネ申!!
ありがとうございます。
ちゅーか、大喜びするほどじゃない…。基礎ネタ?
修行していつか還元します…。
File::Spec や File::Basename を使ってないスクリプトは例外なく糞。
んなこたーない
File::Spec や File::Basename を使わないとスクリプトを書けない奴は例外なく糞。
>>601 あぁ、ここ WebProg 板だったね(わらい
File::SpecやFile::BasenameはFile::SpecやFile::Basenameを使って 書かれているんだろうか?
目的の処理ができるかどうか。。 ただそれだけだ。 コストが折り合えば使えるものはなんでも柔軟に使い、使えないものは使わない。 これを使わなきゃダメなんて・・・ やり方がいくらでもある以上、口が裂けても言えん
そうやって、カスみたいなCGIが量産されていくのですね。
606 :
nobodyさん :2005/11/23(水) 16:57:40 ID:JssfbXnp
ここまで何も作れないカスの妬みレスでした^^
>>607 >>599 と
>>602 は俺じゃないけど。
標準で付いてくるモジュールぐらい、ちゃんと使ったらどうよ。
(不完全な)車輪の再発明を見てると馬鹿かと思う。
>>608 ほほう。
元質問が「本のサンプルコード」に関する質問だっていうのに、
File::Spec や File::Basename を持ち出すのが適切だとでも?
610 :
nobodyさん :2005/11/23(水) 17:30:15 ID:QqvL0TVY
半角カタカナを化けずに表示させたかったので、jcodeg.plというものがあると知り、それを使ってみたのですが、 やはり化けてしまいます。原因として何が考えられるでしょうか?
半角カタカナだと、文字コード判別(getcode)で誤判別をしてしまう。
>>610 Shift-Jisをやめればいいと思います
モジュールは確かに便利なんだけど、infoseekで使うときに困るんだよな。
泥の中に蓮の花を開く
kent見本にしたコードはひどいよな。
それはギャグて言っているのか?(AA略
妬み乙
>>608 俺様専用スクリプトだって、Unix環境専用スクリプトだってアリなんだし、
必ず使えってことも無いでしょ。
必要要件を満たさないものを自作するよりは、
素直に使った方がいいけどさ。
623 :
nobodyさん :2005/11/23(水) 22:28:38 ID:5cxNyXSu
質問させて下さい。 windowsXPSP2 ActivePerl-5.8.7.813-MSWin32-x86-148120.msi を使っています。 plファイル自体の文字コード EUC 内部で扱う文字コード EUC 標準出力 Shift-JIS 標準入力 EUC POSTデータ等で受け取ったデータはshift-jisであれば内部処理用にEUCに変換する。 という構成でプログラムを書きたく、検索した結果、下記の他いろいろ試してみた のですがうまくいきません。 文字化けで出力されたり、 "\x{fffd}" does not map to shiftjis at〜〜 と出力されたりします。 ↓ #STDIN と STDOUT を別々にコード変換する use encoding 'euc-jp', STDOUT=>'shift_jis'; どうかお力添えをして頂けないでしょうか。 よろしくお願い致します。
>>623 いろいろやったんなら試したこと全部書かないと
レスしても 「それはやってみましたがダメでしたとかいわれて」殴ってやりたくなるからな〜
レスつきにくいぞ
とりあえず jcode.pl でも使っとけ
utf8フラグ
標準出力をEUCにすればええがな。 携帯?
>>623 >>8 の [Perl5.8Unicodeメモ] のページを読むべし。
628 :
623 :2005/11/23(水) 23:46:19 ID:???
>>624 >>625 >>626 >>627 みなさんアドバイスありがとうございます。
携帯からの入出力を想定しているためこのような仕様で書きたいと思いました。
Perl5.8Unicodeメモのページを読み、記載されてあった
簡単なところから
まず、
use encoding "euc-jp";
print "こんにちわ\n";
としてDOSで実行してみたのですが
「、ウ、ヒ、チ、・」
と表示されてしまいます。
自分なりに
use encoding "euc-jp";
use Encode qw/ encode decode /;
use Encode qw(from_to);
print from_to("あああ", "shift_jis", "euc-jp");
ともしてみたのですが、
Wide character in subroutine entry at C:/Perl/lib/Encode.pm line 186.
と出てしまいます。
おそらくこれはutf8フラグを切り落としていないからだと
思いますが、euc-jpでソースを書いて出力する際には
一つ一つ文字コードを変換していかないといけないのでしょうか?
>>628 >>623 に書かれている
> use encoding 'euc-jp', STDOUT=>'shift_jis';
これでだめなん?
631 :
nobodyさん :2005/11/24(木) 04:22:56 ID:QV+2W1Ju
$hogeを加工; &sub1; sub sub1{$hogeをさらに加工;&sub2;return} sub sub2{$hogeをさらにさらに加工;return} というようなことをしたいんですが、sub2になるとせっかく加工した$hogeが初期化されてしまってるようなんですが、どう対処すればいいでしょうか?
>>631 my宣言でもしてない限り、その書き方なら$hogeは初期化されないけど。
何か間違ってない? つかuse strictやれと小一時間(ry
633 :
nobodyさん :2005/11/24(木) 04:57:27 ID:QV+2W1Ju
ありがとうございます。 よく見てみたら意味もわからずmy宣言してました。 これをとったらうまくうごきました。 これからも御鞭撻のほど宜しくお願いします。
>>633 グローバルの$hogeをそのまま複数のサブルーチンからいじるのは一般的にいうとあまり行儀のいい
プログラムではないな。変な癖をつけると大きいプログラム書くようになると苦労するよ。
要するに値を渡したり戻したりが全然わかってないと。
今期のテーマ:脱KENT"2005"冬の陣
変数のアドレスを渡すのら
638 :
nobodyさん :2005/11/24(木) 21:50:23 ID:EJIyCJlG
戻り値を受け取るのら!
$hoge = ¥$hoge;
sendmail串万歳
641 :
nobodyさん :2005/11/25(金) 06:48:37 ID:s5kWftCO
use strict; my %data = check('hoge'); if(%data) {print "OK";} else {print "NG";} exit; sub check { my ($text)=@_; if($text ne 'hoge') {my %data={'text'=>$text}; return %data;} return undef; } 2行目の位置で正常なハッシュ返ってくればエラーが出ないのですが、 undefが返ってくると「Odd number of elements in hash assignment」と 出てしまいます。 こういう、正常ならハッシュ値、異常ならundefみたいな事をしたい 場合には、どういう感じでコーディングすれば良いのでしょうか?
>>641 my %data = check('hoge') or ();
>>642 ありがとうございます。
それでやってみたのですが、やはり
「Odd number of elements in hash assignment」と
出てしまいます。
「return undef;」の所を「my %data; return %data」にしたら
エラーが出なくなったのですが、なんか書き方が
すっきりしないような気もします…。
「my %data = check('hoge') || ();」で解決しました。 'or'と'||'で違うんですね。勉強になりました。
>>644 あ、ほんとだ。|| でなければダメだった。
or だと評価が遅すぎたね。
646 :
641 :2005/11/25(金) 07:57:32 ID:s5kWftCO
…と思ったら、「my %data = check('hoge') || ();」だと 正常なハッシュ値が返ってきた時に 「Odd number of elements in hash assignment」と 出てしまいます。 もう、何が何だかわからなくなってきました…onz
先に結論だけ書いておくけど、入門書か何かでリストやハッシュについて 理解を深めた方がいいかもしれない。 my %data={'text'=>$text}; ↓ こう my %data=('text'=>$text); return undef; ↓ こう return ();
>>648 それはスカラ変数に無名ハッシュとしてリファレンスを代入する時だけ
651 :
nobodyさん :2005/11/25(金) 15:44:43 ID:63zT9z2i
よろしくオナガイシマス 半角英数字、英字は大文字、小文字も含めて 10桁の乱数を生成しようと思い以下のプログラムを書いてみたのですが 数字の乱数しか生成出来ません、どこを直したらいいでしょうか、ご指摘お願いします。@array = (0..9,'A'..'Z','a'..'z'); foreach (1..10) { my $bar = (rand scalar(@array)); print qq|"$bar"\n|; }
652 :
nobodyさん :2005/11/25(金) 15:46:10 ID:63zT9z2i
651です改行を間違えてました @array = (0..9,'A'..'Z','a'..'z'); foreach (1..10) { my $bar = (rand scalar(@array)); print qq|"$bar"\n|; } ご勘弁です
my $bar = (rand scalar(@array)); ↑ ↑ scalar(@array)の戻り値は@arrayの要素数 randの引数にそれを渡してるんだから、当然数値しか戻ってこない罠
- my $bar = (rand scalar(@array)); + my $bar = $array[rand scalar(@array)];
↑分かっててintを略してる?
656 :
nobodyさん :2005/11/25(金) 16:35:51 ID:1cmYWuzn
質問、Encode 使ってUTF8→EUCにすると 「〜」が「?」になるんですが何とかならないでしょうか
あなたが無知なだけですね
>>655 略してるも何も、必要ないじゃん。わざわざ int() しろと?
654 652です デキマスタ、ありがとう
>>660 そのまま $array[] 足しただけだろ。
なんでそんなに必死なんだ。
662 :
nobodyさん :2005/11/25(金) 18:10:22 ID:1cmYWuzn
>>660 有難うございますー
これを参考になんとかやってみますです。
use strictのメリットって何ですか? スクリプトが速くなったりするんでしょうか
665 :
nobodyさん :2005/11/25(金) 18:51:59 ID:ykRqgxjm
すいません asciiファイルに\r\nが含まれることはあっても バイナリファイルに\rのない\nが含まれていることはありえない、 と考えてバイナリファイルを選別していくやり方は問題ありますか?
666 :
age :2005/11/25(金) 18:55:49 ID:PaUDYDn8
>>665 バイナリーファイルは何でもありだからだめだよ
>>665 > バイナリファイルに\rのない\nが含まれていることはありえない、
扱うバイナリファイルがその前提なら、
その方法でもいいと思うよ。
バイナリかアスキーかなんて、拡張子で判断すればいいんでないの
なぜファイルテスト演算子を使わないのかと
(´・д・)エー
ファイルテスト演算子って\0が含まれてるかどうかだけじゃなかったっけ?
すまん、違ったようだ。
x0D x0Aで改行ってのはWindows限定だから他のOSじゃ通用しないよ。 自前でチェックするならx00のあり/なしだな。手抜きの場合は。
>>664 使用者感想
use strictで肩こりが解消しました。(茨城県 I.・Y様)
もうuse strict無しではコーヒーは飲めません。(北海道 H・N様)
use strictのお陰で宝くじが当り、彼女もできました。(東京都 A・J様)
>>664 >>675 みたいなおちゃらけじゃなくマジレス
use strictでkentの呪縛から逃れることが出来ますた。(京都府 M・N)
問い)xxxのCGIを改造したいのですが。 答え)use strict;の一文を削除してからどうぞ。
>>664 残尿感もなく、スッキリです!(東京都 W・C)
ヒント:グローバル変数
ヒント:グローバル経済
バイナリかどうかのチェックとはちょっと違うかも知れないけど File::MMagic とか。
>>664 use strictを使う理由は、use strict 'vars';が一番大きいかな。
完全に修飾されてない、宣言の無い変数を使うとエラーになる。
つまり、タイプミスなどで間違った変数名を使うとエラーで教えてくれる。
でも use strict; 使っておいて、一番上に my $変数; をずら〜って書いてるひともいるけど、それは文法上 strict だけど、本質的に strict じゃないんじゃないかなー、って思う。
strictって名前だけど、機能を若干制限するだけで、 スタイルを強制するわけじゃないからね。
でも、解って使っていればOKかなと思う。 例えば、上のほうに設定系の変数をわかりやすくまとめておいて、ここまでが 設定ですよ〜、、、みたいな。。
極力そんな変数は減らすべきだよ
688 :
ゆーき :2005/11/26(土) 09:27:08 ID:yGTXOsFB
print "Location: mailto:〜でメーラーを開いて、本文に改行交じりの文字を入れることが出来ません。なぜでしょうか? print "Location: mailto:aaa\@aaa.com?subject=件名\&body=1行目%0D%0A2行目\n\n"; 「%0D%0A」を入れてみましたがだめでした。文字コードや、URLエンコード関係が原因なんでしょうか??? ちなみにPERLのスクリプト自体はShift-jisで書いています。
もっとスマートなやり方でできないのか? bodyなんてメーラー依存度が高いわけだし。。
690 :
ゆーき :2005/11/26(土) 09:42:03 ID:yGTXOsFB
メルマガを一斉配信する前に、一旦Outlook Expressでプレビューしたいわけなんですが、他にいい方法ご存知ですか?
>>690 一度、自分だけに同じ内容のメールを送ってみる。
692 :
ゆーき :2005/11/26(土) 11:51:53 ID:yGTXOsFB
>>691 それも、最終手段としては考えていますが、
ユーザのひと手間が増えますので、なるべく他の方法を使いたいと思っているのですが...
>>692 Outlook を使ってない人、プレビューしたく無い人もいるわけだけど、
そういう人の手間が増えたり、ウザいと感じるのはいいわけ?
695 :
ゆーき :2005/11/26(土) 12:29:09 ID:yGTXOsFB
>>693 今回は、1人のクライアント専用に作っていまして、こちらの要望なんです。
696 :
ゆーき :2005/11/26(土) 12:49:51 ID:yGTXOsFB
>>694 print "Location: mailto:aaa\@aaa.com?subject=件名\&body=1行目\%0D\%0A2行目\n\n";
としてみましたが、だめでした。
<head>
<meta http-equiv="refresh" content="0; url=mailto:
[email protected] ?subject=件名&body=1行目%0d%0a21行目">
</head>
HTMLタグで飛ばしてやるのはだめなの?
Perlコーディング
699 :
ゆーき :2005/11/26(土) 13:51:51 ID:yGTXOsFB
>>697 完璧です!!!(^^)!
上手くいきました!ありがとうございましたm(_ _)m。
とても丁寧にアドバイス頂きまして、本当にありがとうございました。
おかげさまでクライアントにも顔がたちます。感謝!感謝!感謝!感謝!感謝!
700 :
289 :2005/11/26(土) 14:52:54 ID:EqqUKm3R
perl5.8、FreeBSDの環境です。 連想配列をファイルやDBのカラムに保存したいのですが、 可能でしょうか? 可能であれば方法をご教授お願いいたします。
そういうモジュールを探してるって事じゃない蟹
シリアライズして放り込めば…と思ったけど、 ハッシュをそのままDBのテーブルにマッピングしたいってこと?
ああ、一つのカラムの中に連想配列を丸ごと押し込みたい、とも取れるのか… それならStorableだよな
705 :
700 :2005/11/26(土) 17:02:03 ID:EqqUKm3R
>>703 >>704 そういう事です。説明足りなくてすいません。
普通に連想配列をファイルやカラムにinsertしても
読み取りにに失敗したので(当然)。
Storableとはなんでしょうか?ググってみます。
706 :
nobodyさん :2005/11/26(土) 20:35:13 ID:zmLMleB6
Javaのプロパティファイルと同じことをperlでもやりたいのですが、できますか? 2chのSETTING.TXTみたいなのです。 2chってどうやってるんだろう・・・。
出来ます と言うか物凄く初歩です
現在CGI経由で画像を表示させる簡単なCGIスクリプトをテストしています。 こんな感じで・・・ open IMAGE, "<:raw", "img.gif"; print "Content-type: image/gif\n\n"; print <IMAGE>; close IMAGE; しかしこれを実際にテストしてみると、ブラウザには 画像がシュレッダかけられたみたいなへんてこりんな 画像で、しかも縦の長さが押しつぶされてしまった 感じの画像が表示されます。要は、正しく表示されません。 jpeg画像にしてやってみると、今度はバッテンのアイコンが でてしまいます。 なぜうまく表示できないのでしょうか?
binmode
>709 :rawだから違うんじゃね?
711 :
710 :2005/11/26(土) 20:52:06 ID:???
何アホなこと言ってんだオレ… STDOUTに対してbinmodeか
>>708 まぁ、違うと思うけど
ASCIIモードでFTPうpしたとか
713 :
708 :2005/11/26(土) 21:19:39 ID:???
レスどうもです。 一応raw指定でbinmodeのつもりです。 あと自鯖でやってます。Apache2です。
714 :
708 :2005/11/26(土) 21:29:15 ID:???
あ、たしかにbinmode STDOUTでうまくいきました。 逆にIMAGEに対してはbinmodeにしなくてもいいようですね。 ありがとうございました。
716 :
nobodyさん :2005/11/26(土) 21:37:16 ID:zmLMleB6
>707 そんじゃおしえてください
ex. open(FH, 'SETTING.TXT'); while (<FH>) { chomp; my($key, $val) = split(/=/, $_, 2); $set{$key} = $val; } close(FH); print $set{'BBS_TITLE'};
>>706 この程度のテキスト処理はどんな Perl の本でも最初の方でやるじゃんよ。
勉強不足なんじゃね?
719 :
708 :2005/11/26(土) 21:47:53 ID:???
Windowsの特徴
721 :
708 :2005/11/26(土) 22:10:24 ID:???
いろいろやってみましたが、原因わからずじまいです。
>>720 ということで、結論付けてしまいたい気分です。
やってられんです。
ようはI/O両方バイナリにしとけば確実ってことですね。
"<:raw" ってしてるから binmode になってんじゃなくて?
723 :
720 :2005/11/26(土) 22:12:35 ID:???
724 :
715 :2005/11/26(土) 22:12:44 ID:???
>>719 ・テキストモード入力時の変換:0D 0A → 0A
・テキストモード出力時の変換:0A → 0D 0A
・たまたま画像に0D 0Aが無かった
・サイトが間違ってる # コピペして試してみな
725 :
708 :2005/11/26(土) 22:16:09 ID:???
なるへそ。 画像ファイルに<CR><LF>がなければ、読み込みでは変換されず しかし<LF>があれば、書き出しで変換されるという寸法ですかね。
726 :
nobodyさん :2005/11/27(日) 06:03:43 ID:PNI5NdX4
すいません、質問させてください。 unless($codeflag){ &error("不正投稿の可能\性があります。リロードして再投稿して下さい。");} if ($allow_submit && !$letout_ip) { if (($cc_time - $last_ctime) { &error("アクセスしてから投稿するまでは$noprx_stime秒以上開けて下さい。");} } elsif (($cc_time - $last_ctime) { &error("アクセスしてから投稿するまでは$submit_time秒以上開けて下さい。");} で構文エラーがでます。 Perlのエラー出力は syntax error at tmp.pl line 749, near ";}" syntax error at tmp.pl line 751, near "elsif" tmp.pl had compilation errors. でした。 ちょっと原因がわからないんで、おしえてください。
, ‐、 , ─‐ 、 , ‐ 、 ,r─── 、 r───‐ 、 , ───‐、 | |(_)(_)l .l | | ,' |│ | | │ l └─‐、 `ー─ ' l レ ,'=コ |└─‐┐ ! `ー─┐ ! | ノ / lゝ-'ゝ、 l l | / 〈 l l ̄ ̄ r─‐ ´ / r─‐´ / ┌─‐┘ ! r─‐´ ヽ | ! │ , r' l , r' | |│ ,r、 ,! └‐┘ └─ ' ´ └─ ''´ └───‐' └─ ' ´ `ー' /\___/ヽ (.`ヽ(`> 、 /'''''' '''''':::::\ `'<`ゝr'フ\ + |(●), 、(●)、.:| + ⊂コ二Lフ^´ ノ, /⌒) | ,,,ノ(、_, )ヽ、,, .::::| ⊂l二L7_ / -ゝ-')´ .+ | `-=ニ=- ' .::::::| + . \_ 、__,.イ\ + \ `ニニ´ .:::/ + (T__ノ Tヽ , -r'⌒! ̄ `":::7ヽ.`- 、 ./| . ヽ¬. / ノ`ー-、ヘ<ー1´| ヽ | :::::::::::::ト、 \ ( ./ヽ \l__,./ i l.ヽ! | .| ::::::::::::::l ヽ `7ー.、‐'´ |\-、 _,∩_ _,∩_ _,∩_ (_____)ゝ、 (_____) y (_____) / :: :: :: ヽ 〉 /-‐:: ::‐-ヽ / / :: :: :: ヽ _./ (・ )ll(・ ) ∨ _/ 0) i! 0) ∨ _/ ( ・)i!(・ ) ゙、_ // :: :: ∈ゝ :: ::ヽ // :: ‐-‐ :: ヽ // :: ー一 :: ヽ\
728 :
nobodyさん :2005/11/27(日) 06:26:12 ID:C29mLJPM
どこが 749 行目だ? こちとらエスパーじゃねぇんだ
729 :
nobodyさん :2005/11/27(日) 06:28:08 ID:C29mLJPM
if (($cc_time - $last_ctime) { &e 〜 以下略 elsif (($cc_time - $last_ctime) { &e 〜 以下略 とりあえず文法を学んでみよか?
対応するカッコの数くらい数えられんものだろうか
まぁなんだ、茶でも飲んで一服するこった。
>>726 $cc_timeの左の ( が余分、2箇所
いくらなんでもネタだろ
734 :
nobodyさん :2005/11/27(日) 17:21:56 ID:6lDMwL/x
初歩的な質問で申し訳ないのですが、よろしくお願いします。 print "Content-type: text/html; charset=Shift_JIS\n"; print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n\n"; と書いてクッキーを出力しているのですが、画面に Content-type: text/html; charset=Shift_JIS の1行が表示されてしまいます。どうしてですか?一応クッキーは作成されています。
print "Content-type: text/html; charset=Shift_JIS\n"; print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n\n"; この2行のあとにさらに Content-type〜 をprintしてるからでしょ。
>>734 「画面」とは? 標準出力? ブラウザ?
738 :
nobodyさん :2005/11/28(月) 13:58:44 ID:MRaDdba7
739 :
nobodyさん :2005/11/28(月) 17:59:22 ID:cDaON9yM
松島 秩父 hogehoge 癒し系 松本 ↓上のテキストを処理後、下のようにしたい↓ 松島 秩父→hogehoge 癒し系 松本 処理の1つ先回りをして、対象の1つ前の行の先頭に「hogehoge」がある場合、対象の列とhogehogeが先頭に存在する列に対して指定の処理するようにしたいのですが、 for my $ii (0..$#text) { if("hogehoge" eq substr($text[$tn+1],0,8)){ $text1 .= "$text[$ii]→$textall[$ii+1]\n"; $ii++; }else{$text1 .= "$textall[$ii]\n";} } ↑のように組んで実行したところ 松島 秩父→hogehoge 癒し系 hogehoge 癒し系 松本 のようになってしまいます。 ループのたびにmyで初期化してしまうため$ii++が無駄になってしまうために起こってると思うのですが、$ii++を生かすようにするには、どのように変えたらよいですか?
>>739 こっちのforループ。
for(my $ii = 0; $ii < @text; $ii++) {
どうでもいいかも知れないけど、
substr()よりindex()使ったほうがスマートに思う。
>>739 その場合、行を無視すると単純になる(sオプションを使う)
松島\n秩父\nhogehoge 癒し系\n松本 が
松島\n秩父→hogehoge 癒し系\n松本 に置換できればいい。
あとn行先読みするときはpush,shiftを一時配列に対して使うのが楽かも。
配列じゃなくてテキストだったらこんなのでも。 my $test =<<"EOT"; 松島 秩父 hogehoge 癒し系 松本 EOT $test =~ s/\n(?=hogehoge)/→/g;
745 :
743 :2005/11/28(月) 18:56:49 ID:???
本当だ、質問レスしか見てなかったので気づかなかった。
746 :
741 :2005/11/28(月) 19:32:34 ID:???
「(sオプションを使う)」のところは必要なかった。訂正。
perl使いを目指しています、最近CGI.pmライブラリなるものを 知り使うようになりました、今までPOSTやGETメッソッドによる 変数の受け渡しなんか、フォームのデコード処理とか、その逆とか ゴリゴリ書いていましたが、これを使うようになって なんとなく、あまりにあっけなくて ( ゜д゜)ポカーン状態なのですが こんなヌル湯に漬かって漏れは一人前のperl使いに成れるでしょうか? それと、CGI.pmの弊害とかってありますか?
そんなもんです わざわざ内部までさぐるのは時間の無駄ですので その調子でモジュールを使いまくりましょう
その勢いでphpを知ると更にポカーン、な予感
750 :
747 :2005/11/28(月) 20:52:10 ID:???
perl使いの諸兄ども、どうもです ライブラリ使うと確かに内部で何をやってるのか、全く分からないが 良い点としては、コードが少ない!見やすい!読みやすい!ですね ゴリゴリ時代は自分でプログラム組んでいても3日もすればハァ?ってな 事がたまにありましたが今は逆なのらー、 ライブラリにおまかせする部分はおまかせして 簡単に正規表現による、文字処理とかハッシュによる構造体の変数の受け渡しや 参照の仕方等がスラスラできるように禿げみます。
おれは未だに自作のURLデコードや文字コード変換だな。 使うモジュールは strict, vars, lib ぐらいかな。
弊害というか、標準モジュール付いてない古いPerlの入っているサーバで動かないくらいかな。
既存モジュールの再利用のうまさも実力の内。
CGI.pmは要らないメソッド大杉。 無駄にコンパイルする時間を食ってる。
>>754 ほかに lightweight なおすすめがあればおしえてぷりーず。
CGI::Lite(笑)
(笑)
w
CGI::Liteはデフォでついてくる?
ノンノン
761 :
nobodyさん :2005/11/28(月) 23:33:07 ID:jymxeugY
ちわ。 テキストエリア(<TEXTAREA></TEXTAREA>)から送信されたテキスト内容を受け取って、 ファイルに書き出す処理を書いてます。 各行に、例えば、<BR>なんてタグをつけて出力しなおしたくて書いているんですが、どうも 意図しない改行がきてしまいます。 こいつはどこからやってきているのか。 あるいは、ここコードこうだろなんて教えていただけないでしょうか。 ($buffの取得の時点でおかしい?) コード: #$buff取得したマルチラインのテキスト @s_text = split(/(\r\n|r\|\n)/, $buff, 20); open(FN, ">new.htm"); foreach $mod_line (@s_text){ $mod_line = "$mod_line" . "<BR>\n"; print FN "$mod_line"; } 元データ: 1行目 2行目 3行目 結果: 1行目<BR> 2行目<BR> 3行目<BR> ↑改行が一個多い。
762 :
761 :2005/11/28(月) 23:38:52 ID:jymxeugY
761の書き込みの結果嘘ついた。 出来たファイルの中身をコピペすると、以下のようになります。 コピペするとなんか改行増えてる?とにかく欲しいのは3行のデータなんです。 1行目<BR> <BR> 2行目<BR> <BR> 3行目<BR>
>>761 - @s_text = split(/(\r\n|r\|\n)/, $buff, 20);
+ @s_text = split(/\r\n|r\|\n/, $buff, 20);
ではどう?
765 :
nobodyさん :2005/11/28(月) 23:52:08 ID:LjPWibfY
>>763 >>764 ありがとう!
>>763 一発で動きました。ただし理解できんかったです…。
括弧のあるなしっていったい…?
良かったらどう違うのか教えていただけたら幸いです。
>>764 勉強になります。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_2BR <BR>変換のコードは使えたら使いたいですね。
(自分のコードは
元のテキストの前後に修飾処理する用途で使いますので、
すぐに構文書けません…。)
>ちゅーか、s///の基本の利用方法ですね。
>>こんな書き方あり?
s/\x0A/後方修飾\x0A前方修飾/g;
↓こんなんなっちゃうよな…。
1行目後方修飾
前方修飾2行目後方修飾
前方修飾3行目後方修飾
前方修飾
ちゅーか、いずれにせよ、ありがとう!
>>766 () があれば、マッチしたものが 返されるリストに含まれるのよ。
If the PATTERN contains parentheses, additional list elements
are created from each matching substring in the delimiter.
split(/([,-])/, "1-10,20", 3);
produces the list value
(1, '-', 10, ',', 20)
>>768 761じゃないけれど勉強になりました。splitはcapturingに意味があったのか・・・
>>767 細かいとこまでみてもらってありがとう
>>768 な、なにょー!?
そうだったんですか…。
なんかのときに、splitに関する質問をするところでした…。
ちゅーか、split勉強しなおせって言う感じですか。
あるいは、正規表現の項目に書いてありそうですね。
ありがとうございました。
>>769 突っ込みすぎかもしれませんが、
capturingって、
どんなことに使うつもりになったんですか?
また、しばらくperlから離れちゃいそうなので教えてもらいたいのですが。
>>771 どんなことに使うつもりになったって言うと…
splitの中でグルーピングする必要性が出た場合は、
?:をつけてclusteringにするのを忘れないようにしないとな、という話です。
773 :
771 :2005/11/29(火) 01:16:34 ID:???
>>772 やっべえ、なんとなくしかわからんです。
修行が足りん、出直してきます。
サンクスです。
後方参照を作成しません。
775 :
nobodyさん :2005/11/29(火) 01:33:40 ID:jT6RPKnv
改行コードの統一は s/¥x0D¥x0A|¥x0D|¥x0A/¥n/g がおすすめ
全角に イラッとした ハ_ハ ('(゚∀゚∩ イラッとした! ヽ 〈 ヽヽ_)
778 :
nobodyさん :2005/11/29(火) 10:55:30 ID:jT6RPKnv
改行置換なんて投稿時だけで、読み込み時は置換されてることが前提だから\nでやるし、 そんなにパフォーマンスに影響しなうのでは? って思う。 書き込みよりも読み込みの回数のが多いのがほとんどだと思うし…
たいした弊害もなく速くなる方法があるなら、普通はそっちを選択するものでしょ。
ついでに、
>>766 は改行コード統一それ自体の話をしているわけではないし、
投稿時以外にも膨大なデータで改行コードを統一する必要がある場合もあるだろう。
わざわざ突っかからないで…
ぶっちゃけどっちでもいい。
どうしても気になるなら、Cで書くべき。
そして、先につっかかってるのは
>>777 。
Perlでやる範囲であっても、遅いより速いほうがいいだろうに。
つか
>>777 って、ただの参考情報じゃん。
782 :
nobodyさん :2005/11/29(火) 13:54:21 ID:skNvEddZ
改行コードの統一は s/¥x0D¥x0A/¥n/g; tr/¥x0D¥x0A/¥n¥n/; がおすすめ
ハ_ハ ('(゚∀゚∩ イラッとした! ヽ 〈 ヽヽ_)
全角に イラッとした!
apache2 , active perl5.8.2 でやってるんですが、You don't have permission to access *****. みたいなメッセージが出ます。 Permission解除するのってconfのどこでしょうか。。
>>785 <Directory />
Options Indexes
</Directory>
>>785 PerlじゃなくてApacheの質問だね…まあいいや、OptionsにExecCGIを設定
それにしても5.8.2って随分古いものを使ってるな…最新版は5.8.7だぞ
うーむ、だめです。500errorとか出たり・・・。 win2kやwinxp proの時はすんなり言ったんですが。xp homeだと何か 先にインストール必要なものがあったりしますかね。
エラーをキャッチするか、プロンプトで走らせましょう。
コピーして読み取り専用になったとかユーザー権限でインストールしたとかでしょ
読み取り専用になってて今解除して、ユーザー権限は管理者権限にしたままです。 コマンドプロンプトからはtest.cgi動くんですが・・・うーむ。 apacheの設定であることまでは絞れたけど相変わらず The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error. More information about this error may be available in the server error log. ・・・でadministratorに聞けって俺?
>791 >this error may be available in the server error log. って出てるだろーが。
>>791 スレ違いっていうか根本的にわかっとらんな。
administrator=管理人なんだからお前さんに決まってるだろうがよ。
で、エラー内容がわからんとこっちも答えようが無い。
エラーログ見るなり use CGI::Carp qw(fatalsToBrowser); 使うなりしてくれ。
一番初歩的に #!/usr/bin/perl のパスが違うとか print "Content-type: text/html\n\n"; 書いてないとかかもね。
別の環境では動いてたらしいので Content-Type: は無さそうだけどね。
798 :
nobodyさん :2005/11/29(火) 21:19:22 ID:jT6RPKnv
かわいそうになってきたので助言。 ホームページの管理ディレクトリ → d:\www\my_web\ Perl のインストール先 → d:\usr\ こうすれば #!/usr/bin/per って書ける。 借りてるサーバーが /usr/local/bin/per であれば、ローカルでの Perl の インストール先は /usr/local ってなる。
お前の頭がperだよ
800 :
nobodyさん :2005/11/29(火) 21:24:42 ID:jT6RPKnv
l が抜けてた orz
-─=三=- 、 /イイイ ヽ三\ヽ\ ///イ ___ ヽ トトト i:|:/ミ -_-__--_−_-_ トト|:i |:|:|イ へ、 ̄ /ヽ |:|:| |:|:|| _、 ,.-_、 |:|:| ト:!:| ヽ´´´ノ ヽ´´´ノ |:|リ ヽ_|  ̄ ノ 丶 ̄ |_ノ | \/ (_i i_)\/ | | | /  ̄ \ | | <売り上げ120億、利益20億ある。どんな弁護士使ってでも潰す! \ -=^^=- / ヽ  ̄ ノ
>>802 「叩く」じゃなくて「追求させていただきます」だ、ボケ。
804 :
nobodyさん :2005/11/30(水) 12:15:39 ID:BadrrQNs
ぜったいageてなんかあげないんだからねっ!!
下げたお
(;^ω^)・・・
ネタでもいいけど、せめて何かperlishなネタを書けよ…
$ichi $ni このふたつの変数を足し算した結果を出力したいのですが、どうすればよいのでしょうか
真ボスキタ━━━━━(゚∀゚)━━━━━!!
812 :
nobodyさん :2005/11/30(水) 17:27:28 ID:BWMdiBVJ
print $san;
print $ichini;
やべwwwwクソワロタwwwwwww
815 :
nobodyさん :2005/12/01(木) 00:24:08 ID:0lJ9PdU1
$pring
そろそろ面白くないからもういいよ。
$twelve
!omikuji
空気読めてないのはお前らだろ。
!omikuji
>>822 $kukiyome chin kasu
816=822 ↑$pugya-
!omikuji
複数の戻り値を得たい時に my ( $hoge1, $hoge2, $hoge3 ) = hogehoge(); とする事はできるのですが my ( $hoge1, %hoge2, @hoge3 ) = hogehoge(); な感じで違う種類の戻り値を得たい場合は どのように書けば良いのでしょうか?
830 :
828 :2005/12/01(木) 10:11:00 ID:???
>>829 を見ました。
つまり、1発で取り出すのは無理で、
リファレンスの配列を作り
my @tmp = hogehoge();
my $hoge1 = $tmp[0];
my %hoge2 = %{$tmp[1]};
my @hoge3 = @{$tmp[2]};
上記のような感じで
取り出せって事で良いですか?
グローバル変数を使うといいお( ^ω^)
>>830 それでもいいし、
sub hogehoge {
my($scalar, $array, $hash) = @_;
${$scalar} = 'hoge';
@{$array} = (0..5);
%{$hash} = (foo => 1, bar => 2);
}
hogehoge(\$hoge1, \@hoge2, \%hoge3);
でもいいよ。
833 :
nobodyさん :2005/12/01(木) 11:40:24 ID:6Wvm5Rjx
グラフ表示に、GD使ってかいてんですけど、 モニタで見るには、気にならないのですが、 プリントアウトすると、結構荒くてもひとつなんですが。 他に、綺麗にperlでグラフ表示させるのってなんかあります?
835 :
nobodyさん :2005/12/01(木) 12:27:34 ID:kcqRAlrr
FTPサーバにHTMLファイルをアップロードするCGIというのは実現可能でしょうか?
>>833 GDの使い込みが足りない。
設定次第で驚愕するほど美麗なグラフも出力できるぞ。
>>837 ありがとうございます。
どうしてもCGI経由でやりたいので助かります。
839 :
566 :2005/12/01(木) 16:30:41 ID:???
以前メタ文字関連で質問させて頂いた者です。
$word = quotemeta("a b c");
print $word;
このようにすると、出力文字列が
a\ b\ c
となってしまいます。
quotemetaは/[A-Za-z_0-9]/にマッチしない全ての文字の前にバックスラッシュをつけるようですが、
$wordに\または.がある場合のみ、この2文字の前にバックスラッシュを入れるということは可能でしょうか。
掲示板のログ検索機能なのですが、
検索対象文字に\を入れるとエラーが出て、
.を入れると全記事がヒットしてしまう状況に悩んでいます。
>>566 も併せて参照していただけると有り難いです。
掲示板で検索って言ったらマルチバイト文字も来るだろうから、 入力された文字に対してquotemetaを使ったら\が入りまくって意味不明なことになるからNG
841 :
566 :2005/12/01(木) 17:39:55 ID:???
\Q\Eについて調べました。
>>566 のソースから
- if ($data[6] =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$words[$_])/) {
+ if ($data[6] =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:\Q$words[$_]\E)/) {
こうする事で解決できました。
かなり説明わかりにくいのですが、わかるかたヘルプです。 .pl から .pl に飛ばしたいと思っています。 Location: test.pl とやって read( STDIN, $hoge, $ENV{'CONTENT_LENGTH'} ); で、$hoge に情報がくっ付いてくる(&nama=boku)のようにしたいのですが どのようにすれば出来るのでしょうか?
if ($AAA =~ /$BBB/) {・・・ $AAAが$BBBという文字列を含んでいるなら・・・ としたいのですがこのままだとエラーがでてしまいます。 どのように修正すればいいのでしょうか?
844 :
843 :2005/12/01(木) 21:57:30 ID:???
Perlコーディング・・・もしかしてスレ違い?失礼しました
if ($AAA =~ /\$BBB/) { foo(); }
>>842 Locationで飛ばしてPOST送信にしたいということになるのかな。
それは不可能。POSTで送らないとならない理由があるの?
単に情報を付けたいだけならQUERY_STRINGを使うべし
>>843 if ($AAA =~ /\Q$BBB\E/) {
847 :
843 :2005/12/01(木) 22:03:36 ID:???
848 :
nobodyさん :2005/12/01(木) 23:34:13 ID:6Wvm5Rjx
>>846 さん
ありがとうございます。見た目的に長いURLになっちゃうのが格好悪いな…
って思っちゃったぐらいです。
このたびは大人しく諦めることにします。
>>849 一時ファイル作るとか、Cookie使うとか
851 :
nobodyさん :2005/12/02(金) 02:01:48 ID:lZKmMfsr
入力値にa〜z、A〜Z、0〜9、-、_、しか入力されないように チェックしたいと考えています。 if($abc =~ /[^a-zA-Z0-9]/){ } 大小英字、数字に関しては上記の様にする事で実現できたのですが -と_の記号を含めてチェックするには上記にどのように含めて 記述したら良いのでしょうか?
853 :
849 :2005/12/02(金) 02:43:53 ID:???
>一時ファイル作る なるほど! Cookieは理解不足にしてもこれならいけそうです Thx!!
>>851 あれ、これでダメなの?
\がいるのかな?
/[^a-zA-Z0-9_-]/
856 :
nobodyさん :2005/12/02(金) 12:41:38 ID:zgDZ/Pi8
>>855 /[^a-zA-Z0-9_\-]/
エスケープしてくだちぃ
[]内の最後に書く分には必要ないっしょ<エスケープ
みんな\dとか使わないの?解りやすいから0-9とか使ってンノ?
文字クラス内だと\d使えない(はず)
>>859 使えるよ
% perl -e '"ab123cd" =~ /([\d]+)/ and print "match: $1\n";'
match: 123
教える側の知識がグダグダなスレ。
すごいことになってるな。 # 例えば、aだけにマッチなら /^a+$/ または !/[^a]/
どっかのベンチでは\wを使うほうが速かった
use Benchmark; my $count = 2000000; my %codes = (); my $wt = 'omaemona-itteyosijisakjen_07211919童貞'; $codes{'code1'} = q{ 1 if /[^a-zA-Z0-9_-]/; }; $codes{'code2'} = q{ 1 if /[^a-zA-Z0-9_\-]/; }; $codes{'code3'} = q{ 1 if /[^\da-zA-Z-]/; }; $codes{'code4'} = q{ 1 if /[^\w-]/; }; timethese($count,\%codes); 結果:激しくバラバラ
ごきげんよう。 \w はロカールを考慮する (場合がある) という話があったなぁ。sage
868 :
nobodyさん :2005/12/02(金) 18:46:19 ID:McNady6M
置換の正規表現内で、if文を二つ以上使うにはどうすればいいですか? $hoge =~s/hoge/ 条件1 ? 式 a : 式 b ; 条件2 ? 式 c : 式 c ; /e うまく実行されないみたいなんですが。。
869 :
JAPU ◆lVJAPUTeX. :2005/12/02(金) 18:58:26 ID:b5HKaxNa
はにゃーん こういうことをやりたいのかな? $hoge = "creamy fancy magical"; $hoge =~ s{(\w+)}{ if($1 eq "creamy") { "mami" } elsif($1 eq "magical") { "emi" } else { "unknown" } }ge;
870 :
nobodyさん :2005/12/02(金) 19:20:52 ID:McNady6M
よくみたら一つの三項演算子が機能してないだけでした。 $iの先頭に'う'が含まれてたら $hoge1、ふくまれてなかったら$hoge2を、 $tmpに代入して、$hogeを書換したいんです。 でも、$iがなんであろうと、$hoge1のほうが代入されてしまうんです。 どうすればいいんでしょうか。 $uaaaa = ~s/うあああああああ/ $i = ~m!^う! ? $tmp=$hoge1 : $tmp =$hoge2; $tmp /e;
$hogeを書き替えたい→$uaaaaを書き替えたい、の間違いです。 すみません。
何をやりたいのか解読できないのだけど。 とりあえず気づいた点を指摘。 $foo =~ s/regex/replacement/; $foo = ~s/regex/replacement/; この2つは異なる (空白の位置に注意) けどそれは大丈夫かな? 後者は $foo = (~s/regex/replacement/); と介錯されるので,99.99%くらいの確率で意図しているものとは違うと思う。 参考演算子は $var = ($foo eq "bar")? $baz: $zot; みたいな形に書いたほうがわかりやすいとおもう。 - 実際に実行したコード (それ単体で完結したもの) - やりたいこと - 意図した結果/実際の結果 を書けば暇な人が答えるかも。
おれも久々に見た。_gunzipは見ないけど・・
コードのインデントは乱さないように,変数は命名規則に従うように,きっちりと書くのがここでのたしなみ。もちろん,use strict; しないなどといった,はしたないプログラマなど存在していようはずもない。
【変数の役割】
素直にそのまま解釈すると,
$uaaaa ... 書き換えの対象
$i ... この先頭に "う" が含まれているかどうか (*) で処理を分ける
$hoge1 .., (*) が真 (成り立った) の場合置換する文字列
$hoge2 ... (*) が偽 (成り立たない) の場合に置換する文字列
でいいのかな?
【コード】
$uaaaa = "ふえいとうあああああああもえもえ";
$i = "うる星やつら";
$hoge1 = "せいばー";
$hoge2 = "とおさかりん";
$uaaaa =~ s{うあああああああ}{ ($i =~ /^う/)? $hoge1: $hoge2; }e;
print "$uaaaa\n";
>>873 本物です。:)
http://www.japu.org/ (近況更新しておきました。)
何この痛いコテ
真性だから触るな
879 :
nobodyさん :2005/12/03(土) 01:10:08 ID:IjoTBsN+
「うぐぅ」っておまえはまだ粘着してんのかよ
880 :
nobodyさん :2005/12/03(土) 08:04:29 ID:9ILkhYC5
881 :
nobodyさん :2005/12/03(土) 08:08:54 ID:9ILkhYC5
882 :
880 :2005/12/03(土) 08:14:38 ID:???
おお、すみません。
>>872 をよく見て、
$tmp=($path=~m/^\//) ? $host : $directory
と書き直したらちゃんと動作しました。
ただの見た目の問題かと思っていたら、
こういうふうに書かなければ動かないんですね。
ありがとうございました。
($path =~ m/^\//)? ($tmp = $host): ($tmp = $directory);
または
$tmp = ($path =~ m/^\//)? $host: $directory;
三項演算子として使うなら後者が一般的。前者の書き方をしたければ if/else を使うほうが良いと思う。
>>881 のコードが動かないのは,
$path =~ m/^\//? $tmp = $host: $tmp = $directory;
は演算子の優先順位の関係で
($path =~ m/^\//? $tmp = $host: $tmp) = $directory;
と解釈されてしまうので,条件によらず最終的に $directory が代入されてしまうため。
ちょっと説明不足でしたね。
884 :
nobodyさん :2005/12/03(土) 10:49:25 ID:H4lHBq9R
質問させてください。 $str = q{<span id="hoge">あいうえお</span>あいうえお</span>} 最初のあいうえおだけマッチする正規表現はどう書けばいいのでしょうか? $str =~ /???/;
>>884 が考えて失敗した正規表現の .* を .*? にしてみな
886 :
nobodyさん :2005/12/03(土) 11:17:02 ID:H4lHBq9R
出来ましたありがとうございます
>>884 Perl関係ないけど言っておこう。
<span>...</span>タグはインライン要素なので、ホントは入れ子にできない。
lattice(で合ってたっけ?)にもできない。
× <span>foo<span>bar</span>hoge</span>
入れ子にできるのはブロック要素。
889 :
nobodyさん :2005/12/03(土) 23:37:38 ID:9N6MOM3Z
連想配列のソートについて質問です。 配列には @NEW[0]='a,3,C'; @NEW[1]='c,1,B'; @NEW[2]='b,2,A'; のように納まってます。 @NEW[0]='c,1,B'; @NEW[1]='b,2,A'; @NEW[2]='a,3,C'; 結果はこのように数字部分をソートする方法を考えてます。 foreach my $data ( @NEW ) { ($youso1,$youso2,$youso3) = split (/\,/,$data); $xx[$data] = $youso2; } %yy = sort values (%xx); @NEW = keys %xx; このようなものを考えたのですがうまく動きません・・・ お知恵をください・・・
890 :
889 :2005/12/03(土) 23:38:52 ID:???
× %yy = sort values (%xx); ○ %xx = 〜 です ageてすみません ○| ̄|_
>>889 まず @NEW[0]='a,3,C'; は $NEW[0]='a,3,C'; だ。
次に $xx[$data] = $youso2; は配列の添え字部に $data が入ってる。恐らくやりたいのは $xx{$data} だろう。
で、 %yy = sort values (%xx); は値を基準にソートしたつもりだろうが、
valuesを使った時点でキーを含まないリストになってしまうので
このようにする @NEW = sort { $xx{$a} <=> $xx{$b} } keys %xx;
この(889の)方法はハッシュのキーを使うため重複が纏められてしまう。
ついでにハッシュはキーの順番を保持しないので最後に @NEW = keys %xx; こうすると意味が無い。
まあ多少効率は落ちるかも知れないが @NEW = sort { (split',',$a)[1] <=> (split',',$b)[1] } @NEW; の1行でできるんだけどな。
基本の Schwartzian Transform なら my @new = ('a,3,C', 'c,1,B', 'b,2,A'); @new = map{ $_->[0] } sort{ $a->[2] <=> $b->[2] } map{ [$_, split(/,/)] } @new; ハッシュ使うなら my @new = ('a,3,C', 'c,1,B', 'b,2,A'); my %hash = map{ (split(/,/))[1] => $_ } @new; my @new = @hash{sort{ $a <=> $b } keys %hash};
>>889 まずは,ハッシュ (Perl4まで連想配列と呼ばれていたものは,Perl5でハッシュと呼ばれるようになりました) のキーを指定する方法に誤りがあります。
× $xx[$data] = $youso2;
○ $xx{$data} = $youso2;
前者は (通常の) 配列 @xx の要素にアクセスする際の記法です。
ここで %xx のキーに元データが入っていますので,keys %xx を並べかえればよいということになります。
比較するためのデータはハッシュに値として入っているので,下記の通り記述すれば動くことでしょう。
@ordered = sort { $xx{$a} <=> $xx{$b} } keys %xx;
※ ハッシュ,sort などについては,マニュアルを参照してください。
-
http://perldoc.perl.org/ - プログラミングPerl (オライリー)
- Programming (O'Reilly)
----
手段は違いますが,このような処理をする際の定石を示しておきます。
my @ary = ("a,3,C", "c,1,B", "b,2,A");
# @tmp0 = (["a,3,C", 3], ["c,1,B", 1], ["b,2,A", 2]);
my @tmp0 = map { [$_, (split /,/)[1]] } @ary;
# @tmp1 = (["c,1,B", 1], ["b,2,A", 2], ["a,3,C", 3]);
my @tmp1 = sort { $a->[1] <=> $b->[1] } @tmp0;
# @ordered = ("c,1,B", "b,2,A", "a,3,C");
my @ordered = map { $_->[0] } @tmp1;
print "@ordered\n";
----
これを一文にまとまるとこうなります。Schwartzian Transform と呼ばれています。
my @ordered = (map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_, (split /,/)[1]] } @ary);
# 詳細は Effective Perl を読むと良いです。
894 :
889 :2005/12/04(日) 00:34:13 ID:???
>>891-893 なるほど・・・よくわかりました。ハッシュには順番がないのですね。
Schwartzian Transformで簡単にできたので、これとハッシュについて学んでみます。
ありがとうございました。
Fedora Core 4 + Perl 5.8.6 です。質問お願いします。 Perl ローケルの一時的な変更の方法を教えてください。 strftime( '%d/%b/%Y', localtime() ); で 01/Oct/2005 みたいな結果を期待したのですが、 01/12月/2005 のような日本語に合わせた結果になって困っています。 それとも素直に月名を配列に入れるのが得策でしょうか? 調べたところ i18n ファイルを変更すべしと書いてあるサイトに多数出会ったのですが、 他のアプリケーションには一切影響を与えたくないため何か別の方法があればお願いします。
>>895 strftime を使わなければいいんじゃね?
sprintf '%02d/%s/%04d', (split /\s+/, localtime)[2,1,4];
ImageMagickをインストールしたいんですが perl Makefile.PL でエラーになります Note (probably harmless): No library found for -lMagick Note (probably harmless): No library found for -ldpstk Note (probably harmless): No library found for -ldps Note (probably harmless): No library found for -lXext Note (probably harmless): No library found for -lXt Note (probably harmless): No library found for -lSM Note (probably harmless): No library found for -lICE Note (probably harmless): No library found for -lX11 先に何か入れとく必要があるのでしょうか?
>>897 「たぶん無害です」と言ってくれているのでそういうことなんじゃない?
その先のmakeでエラーが出まくりで コンパイルできないんです
じゃあ持ってきてインストールすべし。
なにをですか?
lMagickとかでググっても何が必要か探せなかったので、、
>>897-902 「ImageMagick」は C/C++ で書かれた画像加工ライブラリで、
君が作ろうとしているのは ImageMagick を perl スクリプトから
使う為の Perl モジュールである「PerlMagick」。-lMagick が
見つからんのなら、ImageMagick がインストールされていないか、
ライブラリの在り処を適切に指定していないんだろう。
何にせよスレ違いなんで、続きは以下へ移動してくれ。
Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/
>>895 localeまわりの環境変数(LANGとかLC_ほげとか)をあらかじめ設定してから起動するとか、
POSIXモジュールのsetlocaleじゃだめなの? Fedora Coreは知らんのではずしてるかも
しれんけど。
905 :
nobodyさん :2005/12/04(日) 18:01:02 ID:i00gwMB7
デコード処理 sub decode {local($buf,$key,$val); undef(%in); if ($ENV{'REQUEST_METHOD'} eq "POST") { $post_flag=1; if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else {$post_flag=0; $buf = $ENV{'QUERY_STRING'};} foreach ( split(/&/, $buf) ) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; 掲示板の最大文字数制限をしたくてソースを見ていました。 上の51200をいじれば最大文字数も変更できるのかと思い 50に変えたのですが、500文字の書き込みも普通に投稿できます。 どうすれば、制限することができるのでしょうか。それともここは関係ないのでしょうか。 他にあやしいところは下あたりです。よろしくお願いします。 記事登録 sub regist {local($flag,$oyaChk,@lines,@data,@new,@tmp); # フォーム入力チェック &formCheck; # 時間取得 &get_time;
もともと51Kもの投稿を許すような掲示板のソースを改変しようとすること自体間違い
908 :
nobodyさん :2005/12/04(日) 18:37:29 ID:gXJuNnnY
hogehoge.pmのファイルの三行目に use 5.008001; と言う記述があるのですが、これはなんでしょうか? hogehoge.pmを利用しているファイルを動かすとエラーログに↓が返されています。 Premature end of script headers: hello.cgi Perl v5.8.1 required--this is only v5.8.0, stopped at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3. BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.
910 :
nobodyさん :2005/12/04(日) 19:08:08 ID:5pWPWSDT
911 :
908 :2005/12/04(日) 19:24:42 ID:gXJuNnnY
>>909 ありがとうございます。
use 5.008001; と言う記述は、Perlのバージョンが5.8.1以上であれば、
↓のようなエラーは出なくなるのでしょうか?
Premature end of script headers: hello.cgi
Perl v5.8.1 required--this is only v5.8.0, stopped at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.
>>895 setlocale(LC_TIME, 'C');
で行けると思う。
もちろんuse POSIX;して。
913 :
905 :2005/12/04(日) 20:09:52 ID:???
>>907 51200って文字制限には関係あるのでしょうか?
50に変えて500文字の投稿ができなかったので。
915 :
905 :2005/12/04(日) 20:23:41 ID:???
解決しました。すみません。
しかもマルチだし
※低脳な質問はプログラム板でお願いします
低脳は質問はWebProg板向きだな
>>918 日本語できないヤシはハングル板向きだな
※低脳な質問はここでお願いします ム板住人一同
Perllコーディングの質問で
>>1 をちゃんと読んでくれていれば、なんでもいいよ。
日曜ってどうも必死な人間がいるよね まぁ放置が一番だけど。
だってここ実際にレベル低いし(笑)
m9(^Д^) プギャー
925 :
nobodyさん :2005/12/05(月) 15:03:00 ID:S1tZNUNq
だって、初心者質問スレって書いてあるじゃん・・・
926 :
nobodyさん :2005/12/05(月) 15:05:05 ID:S1tZNUNq
>>911 Perl v5.8.1 required--this is only v5.8.0, stopped at /usr/lib/perl5/5.8.0/xxx/xxx/xxx/hogehoge.pm line 3.
英文を見る限りこのエラーは、perl5.8.1以前だと出るのだと思う。
いま、登録CGIを作ろうとしているのですが、ユーザー名、パスワードのはじめに数字があるとき警告するようにしたいです。 indexで[0-9]を探して、返してきた値が0、つまり文字のはじめだったらエラーを返そうとしたのですが indexから返される値がどうもおかしいようで、うまくいきませんでした。 どのようにしたらうまくいくのでしょうか?どなたか教えてください。
$pass =~ m/^\d/
929 :
927 :2005/12/06(火) 22:40:27 ID:???
>>928 さん
うまくいきました。
正規表現のリストから見落としていました。
ありがとうございました。
930 :
nobodyさん :2005/12/07(水) 12:18:20 ID:7UCC6Dk6
すっごい、初心者な質問なんですが、 HTMLを出力させる際に print "(ここにHTMLソース)" ってかんじでやっていて、HTMLソースの中で変数を表示する際に 普通に $TOTAL とかで数字の変数はうまく、そこに表示されますが、 文字列($TOTALTEXT='あなたの合計点は低いです。')は $TOTALTEXT と記述しただけでは、うまく表示されません。 どなたか分かる方いませんか?
>>930 >>1 > 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
エスパーさーーん
934 :
えすぱ :2005/12/07(水) 14:16:24 ID:???
>930 Shift_JISではなくEUCでやりなされ。
935 :
930 :2005/12/07(水) 14:25:17 ID:7UCC6Dk6
1:変数$TOTALTEXT(文字列が入っている)をHTMLを出力させたいです。 2:print "(ここにHTMLソース、そしてこの中で$TOTALTEXTの文字列を表示したい)" 3:結果として、HTMLは出力されますが、$TOTALTEXTの内容は表示されません。 どうでしょうか
表示されない訳がない 実際のコード貼ってみろ
937 :
930 :2005/12/07(水) 14:32:23 ID:7UCC6Dk6
すまそ、こんなかんじです $ALLTOTALTEXT='テスト' #HTML出力 print "Content-type: text/html; charset=Shift_JIS\n\n"; print "<html>\n<head>\n"; print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n"; print "</head><body>「$ALLTOTALTEXT」</body><html>";
938 :
930 :2005/12/07(水) 14:33:03 ID:7UCC6Dk6
ちなみに文字列が数字ならうまく表示されるみたい。。。
ふつーに表示されたが
941 :
930 :2005/12/07(水) 14:48:14 ID:7UCC6Dk6
>>939 えっ?まじ?
>>940 print "Content-type: text/html; charset=Shift_JIS\n\n";
のShift_JISのとこを変えればいいのかな
942 :
930 :2005/12/07(水) 14:52:26 ID:7UCC6Dk6
えすぱーさん、くわしく
>>937 $ALLTOTALTEXT='テスト' の末尾に ; が抜けているし
突っ込み処満載だが、; さえ入れればそれで問題ない。
>>941 Shift_JIS や x-sjis を変更した上で、ファイル自体も
EUC-JP で保存。
http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP まぁ盲目的に EUC-JP にすれば OK という事ではなくて、
EUC-JP の方が問題が起きにくいってだけだけどな。
同じ変えるなら UTF-8 にした方がいいし、携帯コンテンツ
だと Shift_JIS しか使えないって事もあるだろうし。
944 :
930 :2005/12/07(水) 14:57:06 ID:7UCC6Dk6
>>943 指摘ありがとう。;はただの記述ミスです。
JCODEいれてるんですが、これでは駄目なのかな?
携帯コンテンツではなく、PCオンリーなんですが
おすすめはShift_JIS?
>944 >943が貼ってくれたリンク先をよく読め
946 :
930 :2005/12/07(水) 15:09:57 ID:7UCC6Dk6
読んでみたんですが、難しいですね。。。 メールも自動生成して出力してるんですが、 メールのほうではちゃんと出力されるのが謎なんですよね
947 :
930 :2005/12/07(水) 15:22:01 ID:7UCC6Dk6
できました。みなさん、ありがとう
print "<$ALLTOTALTEXT>";
print 'もう来るな';
950 :
nobodyさん :2005/12/07(水) 17:21:10 ID:qBdfvq/C
EUC-JP と言ってるのに 「おすすめは Shift_JIS?」 って、まずは小学校に入ってこい。 話はそれからだ。
951 :
分かりません! :2005/12/08(木) 00:23:26 ID:zq2aWK4E
webアプリ初心者です; 調べたけどよくわからなかったんで質問させてください。 やりたいことはperlとDBを使用したアプリ作成です。DBはmysql、mdb どちらかで考えています。 現在の環境 os:windowsXp webサーバ:Apache 1:DBの配置場所が分かりません。どこのディレクトリに配置して どのような呼び出し方をするのでしょうか。(DBIでデータソース を指定するところ) 2:実際インターネットにのっけたとき、サーバはunixになると思うんですが そのときのDBの配置場所を教えてください。また、webサーバによって dbの配置場所、接続方法は変わるんでしょうか?
>DBの配置場所 メモリ上、又はファイル
954 :
nobodyさん :2005/12/08(木) 01:00:14 ID:/QVLECMb
CSV形式のファイルをダウンロードさせるCGIを構築しています。 主な流れは下記の通りです。 push(@dump, "あ,123,,,,,,,,,,,,\n"); push(@dump, "い,456,,,,,,,,,,,,\n"); push(@dump, "う,789,,,,,,,,,,,,\n"); : : print "Content-Disposition: attachment; filename=abc.csv\n"; my($sizeTmp); foreach(@dump){ $sizeTmp .= $_; } my($size) = length($sizeTmp); print "Content-Length: $size\n\n"; print "$downloadCsv"; ダウンロードはできるのですが、 lengthでファイルサイズが正しく取れていない??(おそらく) それにより、ダウンロードしたCSVファイルを開くと 最後の方が欠けています。 よりよい方法や参考サイト等はございますでしょうか? ご教授頂けたら幸いです。
$downloadCsv の内容を詳しく
956 :
954 :2005/12/08(木) 01:10:27 ID:/QVLECMb
>>955 申し訳ありません。一部訂正です。
$downloadCsvは下記の様になります。
my($downloadCsv);
foreach(@dump){
$sizeTmp .= $_;
}
my($downloadCsv) = length($sizeTmp);
print "Content-Length: $size\n\n";
print "$downloadCsv";
それだと $downloadCsv に $sizeTmp の長さが入っちゃって 数値だけの変なファイルがダウンロードされる気がするんだけど
958 :
954 :2005/12/08(木) 01:14:09 ID:/QVLECMb
申し訳ございません。ご指摘の通りでした。 再修正してみましたが、やはりDLしたCSVファイルが欠けてしまいます。 my($downloadCsv); foreach(@dump){ $downloadCsv .= $_; } my($size) = length($downloadCsv); print "Content-Length: $size\n\n"; print "$downloadCsv";
それだけじゃ原因が分からないなぁ 全体のソースとか無理かな
960 :
954 :2005/12/08(木) 01:27:44 ID:/QVLECMb
下記が実際に用いているものです。 内容は繰り返し部分を省いた以外はほぼそのままです。 <IN>:$in{data} = abc;(DLファイル名) my(@dump); push(@dump, "更新,$y/$m/$d,,,,,\n"); push(@dump, "記録,$hashDay{$in{'data'}}日分,,,,,\n"); push(@dump, ",,,,,,\n"); push(@dump, "更新,$y/$m/$d,,,,,\n"); : 以下繰り返し : print "Content-Type: application/octet-stream\n"; print "Content-Disposition: attachment; filename=$in{data}.csv\n"; my($downloadCsv); foreach(@dump){ $downloadCsv .= $_; } my($size) = length($downloadCsv); print "Content-Length: $size\n\n"; print "$downloadCsv"; exit;
961 :
nobodyさん :2005/12/08(木) 01:41:13 ID:VQhX6ruj
改行コードがlength()だと1で printしたときは\x0D\x0Aの2になるとかじゃない? ちゃんと調べてないけど 何バイト分足りないのか比べて見たら?
Content-Length って別に要らないだろ 進行状況のバーが無くなるぐらいだし
963 :
954 :2005/12/08(木) 02:00:29 ID:/QVLECMb
ありがとうございました。 とりあえず、Content-Lengthが無いとローカルでDLできない様なので 付ける方向で行こうと考えています。 DLするCSVのデータ中の改行に\x0D\x0Aを用いる事ができなかったので 下記の様にする事で問題を回避できました。 my($downloadSize); my($downloadCsv); foreach(@dump){ my($downloadSizeTmp) = $_; $downloadSizeTmp=~ s/\n/\x0D\x0A/g; $downloadSize .= $downloadSizeTmp; $downloadCsv .= $_; } my($size) = length($downloadSize); print "Content-Length: $size\n\n"; print "$downloadCsv";
ちなみに \x0D\x0A って \r\n のことだからね
965 :
954 :2005/12/08(木) 02:18:27 ID:/QVLECMb
なるほど。 \r\nはウィンドウズの改行コードだと思うのですが、 改行コード\nをウィンドウズのローカルにDLすると\r\nに変換されるのでしょうか? 現状では\nでDLしてもContent-Lengthが正しければ正常にDLできています。
つーか Content-Length ヘッダ無しでダウンロードできないって どんなブラウザ使ってるんだ?
967 :
954 :2005/12/08(木) 02:23:59 ID:???
ブラウザはSleipnir 2 でIEのエンジンを利用してます。 やはり何度やってもContent-Lengthがないと Internal Server Errorになります。
一部携帯では必須
>Internal Server Errorになります。 それ、 >print "Content-Length: $size\n\n"; この行をそのまま消したからだろ >print "Content-Length: $size\n\n"; を >print "\n"; に置き換えてみろ
970 :
954 :2005/12/08(木) 02:29:20 ID:???
なるほど。 ご指摘の通り、現環境ではprint "\n";で問題ありませんでした。
971 :
954 :2005/12/08(木) 02:38:44 ID:/QVLECMb
改行コードの事で一点気付いたのですが、 \nで処理しているデータは\r\nや\rなどDLする環境向けに 変換する必要があるのでしょうか? 現ローカル環境のWinでDLした際には問題なかったのですが、 その他の環境やMac環境むけにDLさせる場合は \r等に置換しないと問題となったりする物なのでしょうか?
972 :
nobodyさん :2005/12/08(木) 07:21:12 ID:qoVbfW3N
abcdefgabcdef こういった文字列が合った場合、2個目の abc にマッチさせたい場合の正規表現がわかりません。 行末にあれば abc$ でマッチできるんですが …
>>971 EXCELやある程度の機能があるエディタなんかは各種改行コードに対応しているので問題ない
メモ帳だと\nのファイルは1行で表示されるので問題あり。
975 :
nobodyさん :2005/12/08(木) 09:23:44 ID:qoVbfW3N
やっぱループさせないと無理ですか・・・
MacOSの改行コードが \r なのは9以前で OSXからは \n だからね
>976 改行コードはどのプラットフォームでも\n。 \r→CR \n→LF としないと、意味不明。
978 :
954 :2005/12/08(木) 13:51:47 ID:/QVLECMb
ありがとうございます。 現状ではDLするのは主にWin環境です。 CSVエクセルファイルであるため、開くソフトはエクセルのみであると 想定出来るためソフト側に改行コードの対応は任せようと思います。 おそらくMacで用いる事はないと思うのですが、 支障があるようであれば改行コードをDL時に選択できるものに変更しようと思います。
俺はCSVはまずエディタで開くけどなぁ。
同じく
csvをダブルクリックすると秀丸が開く
982 :
nobodyさん :2005/12/08(木) 17:02:49 ID:qoVbfW3N
CSVをダブルクリックするとIEがダウンロードはじめるorz
そろそろ次スレよろ
part31 と part32 で、dat がないって言われてるな。
>>984 以外に変更した方がいい URL があったら誰かよろしく。
# 俺は立てれなかった…。
テンプレ貼ってくれるなら俺が立てるが
988 :
nobodyさん :2005/12/08(木) 22:16:12 ID:7Tka8YnI
たまに覗いてるものです。 スレ立てに失敗しました。orz・・・ で、質問です。 perl5.8.0を使っていたのですけど、perl5.8.5をインストールしました。 ところが、 # perl -v と打ちますと This is perl, v5.8.0 と返ってきます。 英語だからとテキトーに読み飛ばしてインストールしたせいだとは思うのですが、 後から、perl5.8.5をデフォルトで使用するにはどのようにしたらよいですか??
>>988 Perl に関係ない質問なので、ここでは答えない。
ヒント: which
スレを立てる
991 :
988 :2005/12/08(木) 23:04:14 ID:???
>>991 乙
OSがLinuxならLinux板のくだ質スレ辺りで、経緯を説明して古いほうの
Perlをアンインストールしたいと聞けば良いんじゃないかな。保証は出来ないが…
>>991 UNIX板の自分が使ってるディストリスレ
つか今のままだとエスパー以外回答できない
perl5.8.2、Postgrewsqlを使っとりまして、正規表現に日本語を使いたくなったもんで、 ウェブで調べて、とりあえずuse encoding "euc-jp";と、してみたとです。 そしたら、DBテーブルからもってきた文字列だけ、出力時に 〜does not map to euc-jpと怒られるとです。DBもeuc-jpで作ってあるとです。 スクリプト内の日本語や、openで開くファイルは問題なかです。 どこに原因があるとですか。よろしく、おねげーしますだ。
何かむかつくのは俺だけか・・・?
>>994 そのDBから持ってきて出力時にエラーになる文字列とやらの
中身とutf8フラグの状態を調べるのが基本だと思うが。
ちんこー
1000取ったやつは死ね ↓
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。