トップページ⇒php
1001コメント349KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/10/17(月) 00:47:17ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0153nobodyさん2005/10/22(土) 16:10:34ID:???
>>152
問題が再現する最短のコードを載せるべし。
0154nobodyさん2005/10/22(土) 16:14:10ID: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>



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

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

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

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

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

固定長なら \ でエスケープする必要ないんじゃ?
0158nobodyさん2005/10/22(土) 16:28:45ID:???
>>154
$in{"name"}
$FORM{"name"}
これはどこで取得してるんだ?
0159nobodyさん2005/10/22(土) 16:34:17ID: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>

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

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

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

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

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

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

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


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

$YourName = $input{'name'};

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

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

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

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

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

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

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

たびたび、すいません。

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

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

>>170 と同じです。 (×_×)
01811782005/10/22(土) 18:39:17ID:???
http://lavender.system.nitech.ac.jp/comp/pea/pea-004.htm見ていくらやってもうまくいかなかったんですが、
うまくいきました
ありがとうございました
0182nobodyさん2005/10/22(土) 18:41:13ID:???
member_1.cgi と hoge_1.cgi は別もの?おなじもの?
hoge.tmpl も見当たらないし。

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

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

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

↓

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

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

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

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

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

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

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

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

解決いたしました。

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

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

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

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

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

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

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

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

と同じようなことが出来るコマンドありませんか。
わかりにくい説明で申し訳ないんですが、要は実行結果部分のみ読み込みたいです。
ちなみにsystemコマンドでwgetという方法はなしで。
0199nobodyさん2005/10/23(日) 15:29:28ID:???
>>198
LWPでググって見れ
0200nobodyさん2005/10/23(日) 15:29:44ID:???
>>198
おれの勘ではモジュールを使うとできる。
0201nobodyさん2005/10/23(日) 16:49:13ID:???
>>198
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq9.html#How_do_I_fetch_an_HTML_file_
0202nobodyさん2005/10/23(日) 17:54:02ID:GDjLAzvg
>>198
wgetを使って、そのまま内容を得ることもできる。
02032022005/10/23(日) 17:57:42ID:???
↑みすった。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);
0204nobodyさん2005/10/24(月) 09:55:17ID:???
LWP使えよ...
0205nobodyさん2005/10/24(月) 10:32:04ID:???
>>202-203
こういう奴らが糞みたいな CGI を量産するんですね。
0206nobodyさん2005/10/24(月) 13:18:15ID:???
>>205
おまいもマシなコードを量産しろ。
0207nobodyさん2005/10/24(月) 13:46:58ID:???
(HTMLを取得するときにUAをLWPやらなんちゃらUSERAGENTモジュールを使って指定したくても何故かエラーがでて方法が分からない俺。)
0208nobodyさん2005/10/24(月) 15:28:55ID:???
たまに、>>203みたいにエラーチェックを全くしない人がいるんだけど、
どういう理由でエラーチェックしないの?
0209nobodyさん2005/10/24(月) 16:19:03ID:???
サンプルコードで、エラーチェックを入れるとポイントがわかりづらくなるときとか。
0210mona2005/10/24(月) 16:40:28ID:???
かなり悩んでいます。どうかご教授ください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つありまして、

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

あいうえお
かきくけこ

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

あいうえお
かきくけこ

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

  かきくけこ
>

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

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

あいうえお<br

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

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

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

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

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

以下、ソースです。

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

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

ありがとうございます。

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

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

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

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

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

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

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

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

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

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

use CGI::Enurl;

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

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

use CGI::Enurl;

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


print $string;
02242202005/10/24(月) 22:28:03ID:???
すいません、スクリプト改造スレを見つけました
板違な事を書き込みまして申し訳ありませんでしたスルーして下さい(平伏)
0225992005/10/24(月) 23:45:35ID:???
たびたびで申し訳ないですが、以前教えていただいた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";
}
では無理でこんがらがってしまいました。
アドバイスをお願いします。
0226nobodyさん2005/10/25(火) 00:03:26ID:???
> たびたびで申し訳ないですが、
そう思うんだったらちょっとは自分で考えろよ。
基本的なアルゴリズムも分からないんだったら出直してこい。
0227nobodyさん2005/10/25(火) 00:36:09ID:???
Perlコーティングは無関係ですが無償でexe化する方法(コンパイラ)は存在しますか?
0228nobodyさん2005/10/25(火) 00:38:46ID:???
>>227
perlcc
0229nobodyさん2005/10/25(火) 02:36:58ID:???
>>225
前から思ってたんだけど、それ宿題か何か?
0230mona2005/10/25(火) 09:26:27ID:???
>>217

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

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

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

>>233
携帯は Cookie 使えん機種が多いので NG。セッション管理を Web アプリ側で
行なって、セッション ID を Cookie ではなく type="hidden" で引っ張るのが吉。
0236nobodyさん2005/10/25(火) 15:43:33ID:???
すみません。引数で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を表示しようとしたのですが、うまく表示されません。
できましたら修正のヒントを教えてもらえますでしょうか?
0237nobodyさん2005/10/25(火) 15:53:37ID:???
>>236
>>1
0238nobodyさん2005/10/25(火) 15:56:07ID:???
>>236
せっかく fatalsToBrowser 使ってるんだから、せめて
openのエラーはチェックしろよ。

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

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

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

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

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

ありがとうございました。
0240nobodyさん2005/10/25(火) 18:33:41ID:???
>>239
http://www.ipa.go.jp/security/awareness/vendor/programming/a04_01.html
0241nobodyさん2005/10/25(火) 20:18:09ID: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 コマンドを使って作成しました。
0242nobodyさん2005/10/25(火) 20:43:30ID:???
>>241
perldoc perlop を見るとわかると思うけど、
while ($line = <>) { } は while (defined($line = <>)) { } と等価なので。
0243nobodyさん2005/10/26(水) 03:47:32ID: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を使っているとうまく作動せず、
その変数の部分を、何か具体的なファイル名を入れてみると、
きちんと動作するのです。

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

以上、よろしくお願いいたします。
0244殿ツーNGNG
導入法がわからんとです
どなたかお力添えくださればうれしいとです
まずなにをインストールすればいいとですか??
0245nobodyさん2005/10/26(水) 04:58:25ID:???
>>243
$file_name にファイル名以外の文字が入ってたりとか足り無かったりとかくらいしか思いつかないな。
0246nobodyさん2005/10/26(水) 07:33:22ID:???
どうせ改行コードとか入ってるんだろ?
0247nobodyさん2005/10/26(水) 10:42:10ID:???
>>244
>>7
http://www.site-cooler.com/kwl/perl/environment.htm
0248nobodyさん2005/10/26(水) 11:59:37ID:???
>>243
おかしいと思う部分の変数をprintしてみる。
基本でしょ。
0249nobodyさん2005/10/26(水) 14:39:04ID:???
元データは
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<>ううう<>

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

そもそも

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

は

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

にしたいんじゃないかと
02522492005/10/26(水) 15:11:27ID:???
>>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);
}
■ このスレッドは過去ログ倉庫に格納されています