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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2005/05/25(水) 06:36:28ID:PVpWgcdf
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0896nobodyさん2005/08/04(木) 15:32:53ID:???
>>892
DBIがインストールされてないというエラーと思われ
windows環境という前提でいうと、
1.activeperlインスト
2.windowsのコマンドライン(cmd)からinstall DBI
3.windowsのコマンドライン(cmd)からinstall DBD-mysql
でDBIが入る。
0897nobodyさん2005/08/04(木) 15:37:38ID:???
>>870
xammpもオススメ
0898nobodyさん2005/08/04(木) 15:42:39ID:???
>>895
俺はよく使うけど、使うときに調べればそれで十分だと思う。
けど、正規表現は面白くて好き。オライリーの詳細正規表現お薦め。
0899nobodyさん2005/08/04(木) 15:54:47ID:Ako7Yv7q
>>898
なるほど!
ちょっと安心しました。

オライリーってあの表紙が動物園みたいなやつですよね。
自分もネズミが表紙のperl本持ってます。
4000(これ、書式は%4dですかw)円は高かった・・
正規表現で一冊できちゃうとは・・・
今度探してゲットします。
ありがとうございます。
09008922005/08/04(木) 20:46:43ID:???
>>896
レスサンクス。
DBI入ってるみたいです。SSHで確認しました。
phpMyAdminから見るとセッションのデータをちゃんとMySQLに入れてて
取得も出来ています。
-wオプションをつけなければなにも問題なくうごいてるので
どうしてこんなエラーになるのかまったくわからなくって・・・
↓こんな感じのモジュール組んでます
09018922005/08/04(木) 20:48:26ID:???
package Lib::Auth;

use strict;
use CGI::Session qw/-ip-match/;
use DBI;
use CGI qw/:standard/;
use vars qw($dbh $session);

sub new {
my $pkg = shift;
bless{
userid => undef
},$pkg;
}

sub GetID {
my $self = shift;
my $sid = shift;
$dbh = DBI->connect('DBI:mysql:+++:localhost', '+++', '********') or die "DBI connect不可\n";
$session = new CGI::Session("driver:MySQL", $sid, {Handle=>$dbh});
if($session->param("userid")) {
$self->{userid} = $session->param("userid");
} else {
$session->delete();
$self->{userid} = "guest";
}
return $self->{userid};
}
0902nobodyさん2005/08/05(金) 10:16:46ID:???
cgiでクエリを$form{$key}=$valueの形式でハッシュに格納する部分って
%form = $query =~ /([^=&]+)=([^=&]+)/g;
この1行でも問題ありませんか?
0903nobodyさん2005/08/05(金) 10:38:43ID:???
>>902
デコードとかはあとでやればいいとしても、一般には
keyが重複することがあるからだめだろうな。
0904nobodyさん2005/08/05(金) 11:12:57ID:???
>>902
hoge=aaa&hage=bbb=ccc のときとか bbb=ccc が取れない
0905nobodyさん2005/08/06(土) 08:08:56ID:???
世の中で配布されているCGIのソースを読んでみても
use strictしているソースを見たことがないのですが
use strictするメリットって何なんでしょうか
0906nobodyさん2005/08/06(土) 10:35:31ID:???
作っているときはuse strictするけど、配布時には外すよ。
0907nobodyさん2005/08/06(土) 10:38:17ID:???
ないよ
全部perl信者の妄想だから
0908nobodyさん2005/08/06(土) 11:50:04ID:???
>>905
意図しない変数の使用をチェックしてくれる
意図しない裸のワードの使用をチェックしてくれる
意図しないシンボリックリファレンスの使用をチェックしてくれる

特に変数チェックは超重要。今やuse strictしないとコードがかけません。
0909nobodyさん2005/08/06(土) 17:13:48ID:???
> 世の中で配布されているCGIのソースを読んでみても

頭の悪い人たちが書いたコードでつか?
0910nobodyさん2005/08/06(土) 19:40:45ID:???
公開する時には大概削除してるでしょ。
0911nobodyさん2005/08/06(土) 19:43:21ID:???
ttp://www.kent-web.com/
たとえばここなんか有名ですが
ここのスクリプトはuse strictが無いので
勝手に記述して実行すると完全に就職されていないグローバル変数エラーが
山ほど出てきます

他にもアップローダで一番よく使われているなずるぼんアップローダや
あっぷっぷも勝手にusestrict記述して実行すると
山ほどエラーが出てきます
0912nobodyさん2005/08/06(土) 19:55:08ID:???
そこが諸悪の根源
0913nobodyさん2005/08/06(土) 20:22:06ID:???
>>911
漏れもKヨNTでperlを習った口だ。
だが、そのせいで社会復帰がままならない。

KヨNTのスクリプトは今すぐ捨てろ!
全部捨てろ!
そして、奴の事はもう思い出すな。
0914nobodyさん2005/08/06(土) 20:25:07ID:???
普通にセキュリティホールがあるぞ、KENTのしじあい。パス系とか。。
0915nobodyさん2005/08/06(土) 21:16:56ID:???
>>911
一般人にはuse strictなんて関係ないし、
少しぐらいバグがあっても、文句言いつつ使い続けたりするだろうし。
世の中ってそんなもん。
0916nobodyさん2005/08/06(土) 21:55:53ID:???
>>915
己の成長を望まないのならそれでも良いかも知れん。
0917nobodyさん2005/08/06(土) 23:18:50ID:???
use strict; を使うことが付加価値を持つということになる時代でつか?
0918nobodyさん2005/08/07(日) 00:26:07ID:???
そこでRubyですよ
0919nobodyさん2005/08/07(日) 01:09:48ID:???
とりあえずスコープに注意して全部myしたら動きましたがこれで良いですか?
localはダメですよね?
0920nobodyさん2005/08/07(日) 02:34:49ID:???
>>906
それはチェックコストを抑えるため?
CPANで配布されている多くのコードはuse strictしたままだよね。
私も仕事ではつけたままにしてます。
先頭に#が付加されてしまう事が多いですが。
09219062005/08/07(日) 14:54:03ID:???
エラー&警告を報告してくれる酔狂なユーザーはいないから外す。
仕事なら付けたままのほうが良いかと。
0922nobodyさん2005/08/07(日) 15:07:05ID:???
で、use strict; って、何の意味があるの?
0923nobodyさん2005/08/07(日) 15:37:39ID:???
使うよ、厳密に
0924nobodyさん2005/08/07(日) 17:18:25ID:???
一種の「保証」だと考えればいい。
0925nobodyさん2005/08/07(日) 18:37:02ID:IqAoEAkr

ブログからRSSを取得してPerlで解析して、jsを出力し、
エントリー概要をhtmlに表示するスクリプトなのですが

open OUTPUT, ">./data/rss.js";

foreach my $item ( @{$rss->{'items'}} ) {
print OUTPUT<<TEXT;
document.write('<a href="$item->{'link'}" target="blank">$item->{'title'}</a>');
TEXT
}

そのブログのエントリー名にシングルクォートが使われると
document.write('  ');でかこんでる部分が、シングルクォートの中に
シングルクォートが入ってhtmlに出力されなくなります。

その問題を解決するにはどういったスクリプトを書けばよいでしょうか?

どうぞヨロシクお願いいたしますm(_ _)m
0926nobodyさん2005/08/07(日) 19:12:33ID:???
\
0927nobodyさん2005/08/07(日) 20:41:08ID:???
>>925
s/\\/\\\\/g;
s/'/\\'/g;
0928nobodyさん2005/08/07(日) 20:47:44ID:???
print q||; とかで囲むとだめ?

つーか、そういうウンコなの同居させるなら TT とか使えよ。
0929nobodyさん2005/08/07(日) 21:48:36ID:???
XSSバリバリになりそうだね。
0930nobodyさん2005/08/07(日) 21:54:39ID:???
どこらへんが XSS?
0931nobodyさん2005/08/07(日) 22:40:40ID:lD997J78
strict下でも$item->{title}とかって書けるよ〜。

と、本題と全く関係ないレスを誇らしげにしてみる。
0932nobodyさん2005/08/08(月) 01:19:14ID:t9fLm/wi
教えて下さい。
初めてサブルーチンを使ったプログラムを作ったのですが、以下のエラーがでます。
syntax error at C:/Apache2/htdocs/login.cgi line 225, at EOF
225行目には_END_しかないのですが、何がいけないのでしょうか?
0933nobodyさん2005/08/08(月) 01:24:36ID:???
>932
おそらく225行目より前で何か間違えてる。それより前の部分よくチェックしてみるといいかも知れない
0934nobodyさん2005/08/08(月) 02:05:42ID:???
まさか
_END_
__END__
0935nobodyさん2005/08/08(月) 02:22:26ID:???
>>932 の書いてる 「 _END_ 」 の 「 _ 」 が全角記号のアンダーバーな件について。
0936nobodyさん2005/08/08(月) 02:43:01ID:???
ifとかforの括弧の閉じ忘れだとおもふ
0937nobodyさん2005/08/08(月) 02:50:55ID:???
こういうときこそ use strict;
0938nobodyさん2005/08/08(月) 02:54:30ID:???
こういうのにuse stirict;は有効じゃないんだよパパ
0939nobodyさん2005/08/08(月) 02:56:27ID:???
その辺は趣味ってことで
0940nobodyさん2005/08/08(月) 03:23:25ID:???
パパ、意味が分からないよ
0941nobodyさん2005/08/08(月) 04:08:49ID:???
Template-Toolkitをコンパイルする時にAppConfigが必要になりますが
AppConfigは@INCの中にないディレクトリ[/home/hoge/module]にインストールされているとします。
perl Makefile.PL --libs="/home/hoge/module"
のような感じで指定出来れば問題なくコンパイル出来るのですが
そのようなオプションはありますでしょうか?
0942nobodyさん2005/08/08(月) 12:55:58ID:???
perl 5.8.6 なんですが

require './cgi-lib.pl';
require './jcode.pl';

って動かないんですか?
モジュール使わないとダメ?
0943nobodyさん2005/08/08(月) 12:58:28ID:???
(゚Д゚ )ハァ?
0944nobodyさん2005/08/08(月) 15:11:51ID:???
ダウンロード数を計測するスクリプトを書いているのですが、計測後、ファイルをダウンロードのダイアログを出したいのですが、
IEやFirefoxのポップアップ抑制機能にじゃまされないで出すようにするにはどのようにすればよいのでしょうか?
vectorなどのサイトではちゃんとダウンロードできるので、何かやり方がありそうなのですが・・・。
0945nobodyさん2005/08/08(月) 16:00:00ID:???
>>941
だまって @INC 増やせ。

>>942
動くよ。 スクリプトと同じフォルダに設置しれば?

>>944
zip とかならポップアップしなくても普通にページ移動 (location) すればページ切り替わらずにダウンロード画面になることを知らないのか?
そゆことで、Content-Type がしっかり (ダウンロードされるように) してれば、そのように動く。
0946nobodyさん2005/08/08(月) 16:13:29ID:???
> 〜になることを知らないのか?

まともな会話の仕方を知らないのか?
0947nobodyさん2005/08/08(月) 17:02:15ID:???
>>944
ダウンロードダイアログとポップアップ抑制は関係ないから。
ヘッダとしてContent-Dispositionを出力してみるよろし。
Content-TypeとContent-Lengthも合わせて出力することをおすすめする。
0948nobodyさん2005/08/08(月) 22:07:27ID:???
>>944
CGI でしこしこデータを吐いてもいいんだけど、サイズが大きいと色々問題が
出てくるので Location で飛ばす方がいいと思うぞ。

警告なしに飛ばすには色々条件がある。
・Location は必ず HTTP ヘッダで吐く。HTML の <meta> は駄目。
・Location よりも前に Status: 303 See Other を吐く。
 メソッドが POST でなければ 302 Found も可。302 の方が対応ブラウザが多い。
 これは現在のメソッドに関係なく Location を GET で回収しろという意味。
・Location には絶対 URI を指定する。
 さらにこの URI のホスト部分と $ENV{'HTTP_HOST'} は一致させる。
 IP アドレスでのリクエストとかもあり得るので必ずチェックすること。
・メソッドが HEAD ならボディは吐かない。
 それ以外なら Location へのリンク (<a>) を含む HTML を吐く。

これらが満たせない場合は <form> でのリクエストはあきらめるしかない。
<a> で CGI にリンクすれば回避できるけど、検索エンジンに侵されるのでそのつもりで。
09499422005/08/08(月) 23:45:57ID:???
>>945
回答thx


落としたつもりになってただけで、
ライブラリの中身が空だった・・・orz
0950nobodyさん2005/08/09(火) 00:23:13ID:pZHbukIk
CGIの本に載ってたやつだけど

#! c:/perl/bin/perl

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

これって普通ならブラウザー画面に文字が表示されるはずなのに
何故か実行するとファイルダウンロードになるのですが
何故でしょうか
0951nobodyさん2005/08/09(火) 00:28:33ID:???
http://localhost/〜
でアクセスしてる?
0952nobodyさん2005/08/09(火) 00:30:11ID:pZHbukIk
>>951
まあローカルホストに違いないが
http://127.0.0.1/です
0953nobodyさん2005/08/09(火) 00:31:06ID:???
apache
conf
0954nobodyさん2005/08/09(火) 00:33:03ID:pZHbukIk
あと借りたサーバーにもあげてみたのですが
やはりファイルダウンロードになりました

レンタルサーバーのほうは何故か不安定で、ローカルだと表示できるものが、
表示できたり出来なかったりします
パーミッションやパス、その他設定はちゃんとしてるはずなのに
0955nobodyさん2005/08/09(火) 00:39:46ID:pZHbukIk
>>953
コンフファイルもソースも付属CDのを使ってるから
間違ってるとは考えにくい
0956nobodyさん2005/08/09(火) 01:15:37ID:???
>>950
IE は text/plain をダウンロードしたりしなかったりするよな。
text/html のが確実よ。
0957nobodyさん2005/08/09(火) 01:32:37ID:???
パスが通ってないだけなんじゃね?
0958nobodyさん2005/08/09(火) 02:02:31ID:???
他のブラウザで試せ。
0959nobodyさん2005/08/09(火) 18:08:04ID:???
Perlで入力にa[1],a[2],. . . という風な入力を受け取ることってできますか?
$i=1;
while($in{'a[$i]'}){
 print OUT "$in{'a[$i]'}\n";
 $i++;
}
print $in{'a[1]'};
という風にやってみたんですけど中に何もはいってませんでした
0960nobodyさん2005/08/09(火) 18:30:00ID:???
>>959
シングルクォートで囲ってるからじゃね?
$in{"a$i"}
09619602005/08/09(火) 18:31:23ID:???
いや、違うわ。
$in{'a[1]'}ってハッシュの中の配列?リファレンス使う方がいいかもよ。
0962nobodyさん2005/08/09(火) 19:40:12ID:???
>>959
PHPとかで <input name="a[1]"> とされてる a[1]?
なんで流用してるのか知らないけど、クエリを%inに格納してないんじゃないの?
0963nobodyさん2005/08/09(火) 19:49:58ID:???
いつもplainテキストでも
print "Content-type: text/html\n\n<pre>\n";
てやってるよ
サーバ云々よりもブラウザの問題
0964nobodyさん2005/08/09(火) 20:49:47ID:???
<pre> より <xmp> がよろしくなくって?
0965nobodyさん2005/08/09(火) 21:06:24ID:???
そんなIE独自仕様なタグは。
0966nobodyさん2005/08/09(火) 21:36:56ID:???
xmpはHTML4.0以降の仕様にはないがIEの独自仕様ではないぞ。
現在もほとんどのブラウザが対応してる。
0967nobodyさん2005/08/10(水) 00:24:25ID:???
<plaintext> <textplain>とかもあるよ
0968nobodyさん2005/08/10(水) 01:06:06ID:???
なんだまだやってたのか。
>>950
それをダウンロードしてエディタで開いて中身を貼れ
0969nobodyさん2005/08/10(水) 20:44:59ID:yT5SVbbL
>>968
Hello Perl !

こんな感じ
0970nobodyさん2005/08/10(水) 21:45:46ID:oTWuci57
質問させて下さい。

ログイン画面(ID、パスワード入力フォーム)があって、一度ログインしたら
その後どのページに行ってもログイン済みという認識をさせたいのですが、各ペ
ージでフォームデータ(標準入力)を取得し、ID、パスワードがあるかという
判断をするやり方で良いのでしょうか?
また、フォームデータ(標準入力)はいつまで保存されているのでしょうか?ど
んどん次のページに行っても残っているものなのでしょうか?
0971nobodyさん2005/08/10(水) 22:17:10ID:???
>>970
保存するようにしてれば保存される。
それにコーディングに関係ないぞなもし。
cookieとかセッション管理とか調べてください。
0972nobodyさん2005/08/10(水) 22:18:56ID:???
BASIC認証がお望みのモノに近いけど、なんか勘違いしてるっぽいな。

CGIだとセッションIDを仕込んで、毎回チェックするだけなんだけどね。
仕込み先はCookie、URL、フォーム。なんだっていい。
セッション管理でぐぐるに一票。
0973nobodyさん2005/08/10(水) 23:06:05ID:???
ある複数のperlモジュールを必要とするCGIを動かそうとするとき、
必要とするモジュールの一部が使用中のレンタルサーバーに用意されていない場合、

CGI内に、
use lib = "/home/hogehoge/lib"
と記述してやると、 /home/hogehoge/lib 内に、サーバーにすでにある
モジュールもないモジュールもすべて用意しなければならなくなるのでしょうか?
0974nobodyさん2005/08/10(水) 23:16:31ID:???
実験してみればわかるのでは?
0975nobodyさん2005/08/11(木) 00:28:25ID:???
>>969
ちゃんと実行されてんじゃん。
たまたま君の使ってるブラウザ(環境)がtext/plainなデータをダウンロードするようにしているだけ。
text/plainを表示するようなブラウザだったら表示される。
0976nobodyさん2005/08/11(木) 07:59:40ID:emP9NQBR
>>973
サーチパスに追加するだけ
0977nobodyさん2005/08/11(木) 09:50:51ID:???
質問があります。

配布スクリクトでPerl::Authを使うのでインストールしたら
Fatal error: Cannot redeclare class auth in /web/....../lib/pear/Auth/Auth.php on line ○○
というエラーが出ました。
過去ログとか読むと、authが二重宣言しているためにエラーが出ているところまで分かったのですが、
これの回避方法とかあるのでしょうか?

該当部分(auth)を別な名前に書き換えるのも、色々な場所で使われていて大変そうですし、
他の何と重複しているのか分からないのですが…。
0978nobodyさん2005/08/11(木) 10:01:10ID:???
何をおっしゃりたいのか、情報が少なすぎて、さっぱりわからない点について。
0979nobodyさん2005/08/11(木) 10:11:12ID:???
>>977
えー
redeclare再宣言する必要がどこにあるか
わからんと、答えようがないんですが
0980nobodyさん2005/08/11(木) 11:52:28ID:???
> pear/Auth/Auth.php
ここはperlスレなんだが。
0981nobodyさん2005/08/11(木) 11:58:15ID:???
いや突っ込むところはそこじゃなくて
977の質問はPHPのPEAR::Authについて
のものだというところかと...

質問者の脳内でPEARがPerlに置き換わっ
てるようだが激しくスレ違い。

09829772005/08/11(木) 13:21:03ID:???
>981
勝手に脳内変換してました…。PEAR→Perl
スレ違いorz...
0983nobodyさん2005/08/11(木) 19:28:28ID:OSKViUMD
フォームのhiddenで渡した情報はいつクリアされるのですか?
(ブラウザのウィンドを閉じるまでは残っているのでしょうか?)
各ページでhiddenの受け渡しによるログインのセッション管理を行おう
としていますが、途中にHTMLページがある場合、

a.cgi → b.html → c.cgi

a.cgiで渡したhiddenの情報を、c.cgiで受け取ることはできるのでしょう
か?それとももう消えてしまっているのでしょうか?
もしくは、HTMLでもhidden情報を渡すことはできるのでしょうか?

素人なのでアホな質問をしていたらすいません。
0984nobodyさん2005/08/11(木) 19:39:00ID:???
アホな質問だから多分よくわかってないんだろうけど、Cookie でも使えば?
0985nobodyさん2005/08/11(木) 20:29:04ID:???

----------------------------
#!/usr/local/bin/perl

$view = "画像フルパス.jpg";
print "Content-type: image/jpeg\n\n";
open IMG,"$view";
binmode (IMG);
print <IMG>;
close (IMG);
exit;


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

アクセスカウンタみたいに<img src="xx.cgi">
って感じで画像を呼びたいんだけど、
この後処理を付け足して条件分岐で表示される画像が変わるという感じのを作りたいんですが
最初のとりあえず決まった画像を表示させる段階でつまづいています
なにか分かれば教えて頂けますか?
0986nobodyさん2005/08/11(木) 20:29:11ID:???
>>983
a.cgiでb.htmlを出力する際にhidden情報も書き込ねば、c.cgiが受け取れる。
でも、セッションならcookieでやる方がいいよ。
GETメソッドで変遷すると、hidden情報がアドレス部分に含まれちゃうから。
0987nobodyさん2005/08/11(木) 21:10:44ID:???
>>985
Windowsなら
binmode(STDOUT);
が要るけど。

# print <IMG>は勘弁してほしい。
0988nobodyさん2005/08/11(木) 21:12:57ID:???
勘弁して欲しいとはどういう意味なんですか?
構文的にマズイのであれば
よくわかってないので是非教えてください
09899732005/08/11(木) 21:29:11ID:???
>976

そこのところを具体的にご教示ねがえないでしょうか?
ちなみに、telnetもshhも使えないサーバーをつかってます。
なにとぞよろしくお願いします。
0990nobodyさん2005/08/11(木) 21:34:23ID:???
>>988
山形括弧は行ごとに処理を行うので、
バイナリモードで使うのは気持ちが悪いということ。
# 巨大ファイルを使わない限り気分的な問題だけど、どこかに落とし穴があるかも知れず。

>>985のコード動いたよ。(FreeBSD+Perl5.8.7)
0991nobodyさん2005/08/11(木) 21:38:14ID:X0+Sv8OM
初心者のソースって動けばいいってオーラがぷんぷんだよな
処理が重くなるとかメモリの節約とか全然考えてない
09929952005/08/11(木) 22:11:22ID:???
>>990
動きますか・・・・
うーん他のCGIは動くのに
何か簡単なミスな気がしてきたけどわからない

0993nobodyさん2005/08/11(木) 23:29:59ID:???
$view = "画像フルパス.jpg";
ってのが http:// からのアドレスで書いてることに 3000点。

ってか >>995 も大変だな。
↓↓
09949952005/08/12(金) 00:55:40ID:???
>993
まさにその通りでした^^;
しかも995…orz
993には3000点が加算されます。

なんでこんなミスすんだろ
思いこむとこんなミスにも気づかないものねぇ
0995nobodyさん2005/08/12(金) 00:57:19ID:???
と995を私が取ればつじつまは合うかな。
>>987
>>993
ありがとう
レス数が950を超えています。1000を超えると書き込みができなくなります。