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

【Perl】初心者コーナー Part13

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/05/30 13:06ID:R2kt1mTx
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0232nobodyさん02/06/11 09:30ID:???
あー、くそ。
>>151じゃなくて>>226だった
0233nobodyさん02/06/12 07:36ID:???
$ENV{'REMOTE_ADDR'} = $env{'remote_addr'} としても使えますか?
0234nobodyさん02/06/12 07:55ID:???
>>233
使えません。
0235nobodyさん02/06/12 09:13ID:???
>>234
試してみれば一発だろうに…
0236 02/06/12 11:39ID:R7g7sR2X
jperl5+IIS5.0+SSLな環境でファイルを
アップロードさせたいのですが、
6KBぐらいの小さいファイルだとアップ
できるのですがそれ以上大きいのだと
アップロードできず、IEだと「ファイルが
見つかりません」のエラーになります。

# ちなみにSSLでなくても120KBまでしか
# だめなようです。

同じような問題にあたった方いらっしゃいますか?
0237nobodyさん02/06/12 16:38ID:NJerhR65
perlについて質問です。

月の最後の日が簡単に分かる関数がありますでしょうか?
ありましたら教えて頂きないでしょうか?
また、ない場合は、一番サーバーに負荷を掛けずに(軽い)同じ動作を
させるにはどうすればよいか教えて頂けないでしょうか?

自分なりにも考えてみました。
for ( $i = $mday ; ; $i++ ) {
( $k_sec , $k_min , $k_hour , $k_mday , $k_mon , $k_year , $k_day ) = localtime( time + $i * 24 * 3600 );
if ( $k_mon != $mon ){
last;
}
}
023823702/06/12 16:40ID:NJerhR65
追加です。

うるう年は、考えることとします。
そうでなければ、31日の月と30日の月、28日の月と3つに分けてしまえば
簡単にできてしまいます。

よろしくお願いします。
0239nobodyさん02/06/12 16:41ID:???
>237
まず、うるう年をどうするか。
はっきり言って、配列にでも月ごとの日数を入れるのが一番軽い。
@monthday = (0,31,28,31,30,31,30,31,31,30,31,30,31);
これにうるう年の処理を加えるだけ。
わざわざスクリプトに計算させる必要性はあるのか?
宿題とか?
0240nobodyさん02/06/12 16:42ID:???
>238
じゃあ、うるう年をどう考えるのか。
今年の2月の日数で求めるのか。
去年の2月の日数を求めるのか。
指定した年の2月の日数を見るのか。
024123702/06/12 16:43ID:NJerhR65
>>239
どうもです。
その月の最後の日(日数)を知ることができる関数が知りたかったです。
それがあれば、一番簡単ですから・・・。
でも、ないようですので、 >>239の方法が一番よいようですね。
024223702/06/12 16:45ID:NJerhR65
>>240
「今」の月の日数を知りたいです。

あと、用途は、プログラムを組んでいて、月の最後の日の23時〜24時だけは
違う画面を表示させるというものです。
0243nobodyさん02/06/12 16:49ID:???
@monthday = (0,31,28,31,30,31,30,31,31,30,31,30,31);
$day = $monthday[$mon];
if($mon == 2 && $year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0)){
  $day = 29;
}
print qq($year $mon/$day<br>\n);

関数はないからこれが一番簡単かな?

しかし、>242のいうのならもっと簡単。
( $k_sec , $k_min , $k_hour , $k_mday , $k_mon , $k_year , $k_day ) = localtime(time);
@localtime = localtime(time+3600);
if($localtime[4] != $k_mon){
  print qq(違う画面);
}

月の最後の1時間を判定するだけなら、これで十分じゃない?
024423702/06/12 17:09ID:NJerhR65
>>243
どうもありがとうございました。
0245 02/06/13 00:15ID:N23nK9SF
あるメールマガジン発行CGIをダウンロードして設置してみました。
ところが、デフォルトの登録ユーザーファイルが、usr.datという名前になっていて、そのファイルを決め打ちでアクセスすると、登録している人のemailアドレスが見れてしまうのです。
外部から見れないようにしたいのですが、そのCGIの説明書では、パーミッションは666にしろ、と書いてあります。
660ではだめなのでしょうか。
それか、ファイル名をaoeriuyba8.datとか、暗号のような名前にすればいいかもしれませんが、探検君とかで見つかりそうな気がします。
0246nobodyさん02/06/13 00:25ID:???
>245
拡張子を.cgiにしとけ。
0247nobodyさん02/06/13 00:29ID:???
いや、そもそも Perl の話題じゃないんだYO!

とりあえず設置鯖の仕様(.htaccess可?)を確認しろや
続きは適切なスレでやれ
024815102/06/13 04:13ID:???
151です。
ヒントを下さった>>227
『exit』と同じようなものと教えてくれた>>229
例を示してくださった>>231

returnの機能のついでに、評価式の作りかた、それによる分岐のさせかたまで勉
強できました。

後は閏年の数字の関係です…。
400が絡むということは必ず100で割り切れるということだから…
うーん。
この辺は自分で解決します。

ありがとうございました。
0249nobodyさん02/06/13 10:39ID:???
質問です。
一時ファイル(./tmp/*.tmp)を全削除するのに、
opendir(DIR, "./tmp/");
while ($filename = readdir(DIR)) {
 if ($filename =~ /\.tmp$/) {
  unlink("./tmp/$filename");
 }
}
としてみたが、同じ事を Taintモード下で実現する方法ってありますか?
0250nobodyさん02/06/13 10:58ID:???
詳しくしらないのだが$filenameを正規表現でキャプチャすれば
いいんじゃないの?

if( $filename =~ /^([^.]+\.tmp)$/ ) {
unlink( "./tmp/$1" );
}
025124902/06/13 11:36ID:???
>>250
ありがとうございます!勉強になりました。
0252nobodyさん02/06/13 23:27ID:gf2d6vJq
$s =~ s/[^\.-z]/\./go;

と

$s =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/;

って、どういうことをしているんですか?
教えてください。
0253 ◆hRKFl5jU 02/06/13 23:32ID:gf2d6vJq
あ
0254レス02/06/14 00:21ID:nWmgmUzW
すみません。cgiMLの方で質問していたのですが。
よく分からないのでここでも質問させてください。
掲示板のレス機能のアルゴリズムについて考えていました。
レスをスレに追加して、そのスレをトップに持っていく処理です。
最適な方法やスマートな方法がありましたら教えてください。

・以下、現在考えているアルゴリズムです。
#ターゲット親記事番号
$targetnum = 1;
#テスト用書き込みレス記事 [記事通し番号,レス件数]
$value = "9,0\n";

my @lines = <DATA>;
#レスを書き込み後スレッドをトップに持っていく
$linecnt = 0;
foreach(@lines)
{
($num,$resnum) = split( /\,/, $_ );
if ( $targetnum == $num ){
@sure = splice( @lines, $cnt+1, $resnum ); $resnum++;
unshift( @sure, "$num,$resnum\n" ); push( @sure, $value );
unshift( @newlog, @sure );
$linecnt = $linecnt+@sure;
}else{
push(@newlog,$_); $linecnt++;
}
}
print @newlog;
__DATA__
3,2
6,0
8,0
1,2
4,0
7,0
2,1
5,0
0255レス02/06/14 00:22ID:nWmgmUzW
ごめんなさい、長すぎました。
0256nobodyさん02/06/14 06:21ID:???
>>254
すべてのレスを1次元配列@linesに入れてガリガリ処理すると
面倒だし、スクリプトも読みにくいと思う。
レスの配列=スレッド、スレッドの配列=掲示板全体
というデータ構造に直すといいんじゃないか。ちょっと書いてみた。

use strict;
my $targetnum = 1;
my $value = "9,0\n";

# ログを読む
my @threadarray;
my %index_of;
while (my $line = <DATA>) {
  my ($num, $resnum) = split(/,/, $line);
  $index_of{$num} = scalar(@threadarray);
  my $thread = [$line];
  push(@$thread, scalar(<DATA>)) while (--$resnum >= 0);
  push(@threadarray, $thread);
}

#目的のスレッドを切り出し、レスを追加し、配列の先頭に移動
my $thread = splice(@threadarray, $index_of{$targetnum}, 1);
push(@$thread, $value);
my $resnum = (split(/,/, $thread->[0]))[1] + 1;
$thread->[0] = "$targetnum,$resnum\n";
unshift(@threadarray, $thread);

# 出力
foreach my $thread (@threadarray) {
  print "-----\n";
  foreach my $res (@$thread) {
    print $res;
  }
}
025725402/06/14 07:35ID:nWmgmUzW
>>256
さっそくありがとうございます。
ソースまで示してくれて感謝。
早速、トレースして理解してみます。

ところで、ログを変更してもいいとしてもこの方法がいいと思いますか?
掲示板には全然手をつけていないので、今ならログ変更はいくらでもOKです。
0258nobodyさん02/06/14 08:44ID:???
>>257
そのログ形式(>>255)だと、「レスのない親記事」と「レス」は
どっちも$resnumが0になるような気がするが
どうやって区別すんの?
0259レス02/06/14 09:31ID:AMkrWmqx
>>258
おっ指摘してくれてありがとう。
確かに、区別できないですね。

じゃあ resnamは、親記事自体の番号も含めてってことでおねがいします。
0260nobodyさん02/06/15 00:42ID:???
>>257
とりあえずその方法で突き進んで、問題あったら変更すればいいんでないの。
そのためにはログフォーマットに依存するコードは極力書かないようにしる。
行をsplitする生のコードをそこら中にちりばめたりすると、後で泣くこと必至。
0261nobodyさん02/06/15 01:14ID:4GLBjH4I
↓にある「レス付き画像掲示板 imgboard」
ttp://www.big.or.jp/~talk/t-club/soft/mini_r6/index.cgi
をTripodに設置したいんですが、Tripodのcgi規定に
「なお、画像は、セキュリティー上の理由から、cgi-bin以下におくと表示されませんので、
必ずTripod内のcgi-bin以外におくようにしてください。」
とあって、画像保存用ディレクトリimg-boxをcgiと同じ場所に置くことができません。
↓参考のページ
ttp://www.ba.wakwak.com/~chikura/050mypaso14gazoukeijiban.html
も見たんですがうまくいきません。
どうか解決法を教えてください。
0262nobodyさん02/06/15 01:28ID:???
>261
設置場所のディレクトリ構造は?
026326102/06/15 01:39ID:4GLBjH4I
>>262
ttp://www.ba.wakwak.com/~chikura/050mypaso14gazoukeijiban.html
を参考にして、

(url)http://cgi.tripod.co.jp/ユーザー名/cgi-bin/imgboard.cgi
cgi-binフォルダの中は
imgboard.cgi,file.dat,fileback.dat,icon.dat,jcode_sj.pl,imgsize.pl,index.html
の7つのファイルが入ってて、
cgi-binフォルダと同階層にpublic_htmlフォルダを置いて、
その中に画像保存用ディレクトリimg-boxを置いてます。
0264nobodyさん02/06/15 01:52ID:???
>263
なるほど、、、。
まず、cgi-bin 以下には CGI および データファイルを置くようにしてみてください。
それ以外は、public_html にすべていれるという形態になるのが普通です。
026526102/06/15 01:58ID:4GLBjH4I
>>264
cgi-binフォルダの中にはimgboard.cgi,file.dat,fileback.dat,icon.dat、
public_htmlフォルダの中にはjcode_sj.pl,imgsize.pl,index.htmlおよび画像保存用ディレクトリimg-boxフォルダを
置くというかたちになるんですか?

026626402/06/15 02:02ID:???
たった今、落として確認してみたら、この index.html ってのは
ディレクトリインデックスの隠し用だったようなので すべて cgi-bin
の中で問題ないようです。
026726102/06/15 02:11ID:4GLBjH4I
どうやらTripodがくせもので、
>>264
「なお、画像は、セキュリティー上の理由から、cgi-bin以下におくと表示されませんので、
必ずTripod内のcgi-bin以外におくようにしてください。」
ということで、画像保存用ディレクトリimg-boxをcgiと同じ場所に置かず、
投稿画像の格納ディレクトリ($img_dir = './img-box'; # デフォルト位置)を変更しなきゃならないようなんで、
($img_dir = '/public_html/img-box'; # デフォルト位置)に変更したんですがうまくいきません。
cgiは機能してるんですが、画像がアップロードできません。
img-boxフォルダの中をのぞいても何も入ってませんでした。
026826402/06/15 02:20ID:???
ざっとスクリプトに目を通してみましたが、たったこれだけの掲示板で
6300 ステップもあったのでゲンナリしました。

まず、画像の表示は単純に imgタグに直接画像パスを書く方法を採っている
ので HTML と CGI の置き場所が別になっているタイプのサーバではこのまま
では動きません。
026926102/06/15 02:25ID:4GLBjH4I
>>264
Tripodはcgiを使う場合のURLが
http://cgi.tripod.co.jp/ユーザー名/cgi-bin/imgboard.cgi
普通のhtmlは
http://members.tripod.co.jp/ユーザー名/
だからHTMLとCGIの置き場所が別になっている訳ですね。
別のサーバー探すしかないか…。
027026402/06/15 02:26ID:???
おそらく 167行目を以下に書き替えればいけると思います。

$img_dir = '/ユーザ名/public_html/img-box';
027126102/06/15 02:43ID:4GLBjH4I
>>264
だめでした(爆)。サーバー側の問題?
配布されたcgiに「場所の指定方法は通常は相対パスで指定して下さい」とあったので、
ユーザー名は必要ないのかな?
027226102/06/15 02:45ID:4GLBjH4I
>>264
絶対パスで正解でした。スマソ。

<以下配布されたcgiより>
あなたのプロバイダが、cgiとデータファイルを同じ場所に置くことが出来ない
特殊なプロバイダ(hi-ho等)で、cgiと同じディレクトリやcgi直下に保存
用ディレクトリを作れない場合、絶対パスによる指定が必要となる場合があります。
この場合、5行ほど前にある$img_dirを絶対パス*指定に書換えて下さい。
0273nobodyさん02/06/15 02:48ID:mydlqxE+
GD.pmなどのモジュールをインストールするっていうのは、そのサーバの管理者じゃなきゃできないんでしょうか?
それともディレクトリにアップロードするだけでいいの?
027426402/06/15 02:55ID:???
そしたらダメもとで以下を試してみては?

おそらく imgタグで .. がNGになる可能性あり。
$img_dir = '../public_html/img-box';

または

ソース内で img-box の存在チェックをしているのでWWWサーバのマウントポイント
からの相対パスを使えないのでダメもとでサーバのディレクトリ構造を推測して以下
のように書けばOKかも。
$img_dir = '/home/ユーザ名/public_html/img-box';
027526402/06/15 03:02ID:???
>273
モジュールって使ったことないけど以下を書いてもダメ?

BEGIN{ unshift(@INC, '.'); };
027626102/06/15 03:07ID:4GLBjH4I
>>264
ダメでした…。
HTMLとCGIの置き場所が同じサーバー探します。
夜遅くまでご親切に、こんな初心者にお付き合いいただきありがとうございました。
すごく勉強になりました。
0277nobodyさん02/06/15 03:34ID:???
>>273
*.pmだけで完結してるモジュールは、275の方法でいけるんすけどね。
GD.pmの場合はバイナリコードを作らなきゃあかんかったり、
サーバにないかもしれないライブラリ(libjpeg.soとかlibpng.soとか)を
いろいろ必要とするから、モジュールだけアップロードしても99%駄目。
0278レス02/06/15 07:31ID:/CDsyhKP
>>260
うんありがとう。
そうですね、splitを多発すると変更がめんどくさいので出来るだけ少なく作ります。
ログの変更を簡単に出来るように考えてつくろう。
また、質問することがあるかもしれません、その時はよろしくおねがいします。
0279nobodyさん02/06/16 08:10ID:z5KHLw2y
掲示板ぽいものを作ってるんですが、
にちゃんねるみたいに「Shift_jis使ってちょ」ってやりたいんです
で、何も考えずにjcode.plのgetcodeを使ったら、
「(´・ω・`)ショボーン」をeucと認識してしまいました・・・(´・ω・`)ショボーン

半角カナが混じってても、きちんとShift_jisと認識してやるにはどうすればいいでしょうか?
Shift_jisかどうかが分かればいいです。
EUCで書かれた「汐涙維」をShift_jisと誤認識してもいいです。
# '汐涙維'(EUC) eq 'ショボーン'(SJIS)
よろしくおながいします
0280nobodyさん02/06/16 08:59ID:???
>>279
おれはjcode.plのgetcode関数をちょっと書き換えて
Shift_JISの文字数カウントに半角カナも含めてるよ。

$sjis += length($1) while /(($re_sjis_c)+)/go; #オリジナルのjcode.pl
↓
$sjis += length($1) while /(($re_sjis_c|$re_sjis_kana)+)/go; #修正版

EUC-JPをはねずに通す確率がめたくそ増えるけど気にしない。
あえてShift_JISを使う代償だと思ってあきらめてる。
0281nobodyさん02/06/16 10:16ID:z5KHLw2y
>>280
なるほど、これはいいですね。
助かりました。
どうもアリガトウ
0282nobodyさん02/06/16 22:36ID:Us0jeEkd
#!/usr/local/bin/perl
print "Content-type:text/html\n\n";

$xx = "abc";
$yy = "def";

if ( あ eq あ ) {
print $xx
} else {
print &yy
}

このようにしても$xxは表示されないのですが、
あ と あ を比べる方法ってありますか?
0283nobodyさん02/06/16 22:42ID:???
>>282
ネタですか?
0284nobodyさん02/06/16 22:43ID:Us0jeEkd
いや、マジやねん
0285nobodyさん02/06/16 22:51ID:???
>>284
#!/usr/local/bin/perl
print "Content-type:text/html\n\n";

$xx = "abc";
$yy = "def";

if ( 'あ' eq 'あ' ) {
print $xx;
} else {
print $yy;
}

abc って出ましたが。
0286nobodyさん02/06/16 23:01ID:Us0jeEkd
>>285
あぁ〜文字列はシングルクォーテーションで囲ったらイイんですね??
ありがとうございます!
でも あ を a に変えると囲まなくてもいけるみたいですがなぜでしょう??
aも文字列のはず、、、、
0287nobodyさん02/06/16 23:31ID:z5KHLw2y
>>284
''か""で囲まないと文字列じゃないぞ・・・
0288nobodyさん02/06/17 00:35ID:9jM4ZJCT
http://www.mbay.net/~mpeppler/Sybperl/sybperl.html#sybase::dblib

この
NO_MORE_RESULTS
って、どうしてクォーテーションがいらないのでしょう?

0289nobodyさん02/06/17 01:01ID:rACyARGq
>>288
開けない
0290hoge02/06/17 04:03ID:aKd0pgn8
sub MOE { "sakura" }
print MOE, "\n";
0291nobodyさん02/06/17 05:46ID:???
>>286
ぐーぐるさんに聞いて見れば?キーワードはbarewordとperl。
ていうかおれもPerlのbarewordの扱いについてはよくわからn。
0292nobodyさん02/06/17 08:51ID:???
Perlは「自分の知らない識別子」をクォートされていると解釈するんだよ。

$foo = bar;
$baz = bar::bax;
print $foo, $bar;

だが"sub bar;"やsubsなどで前方宣言されているとこれらはサブルーチンと見なされる。
use strict 'subs'を使うとこのような裸のワードに対して致命的エラーを発生させられるよ。
0293nobodyさん02/06/17 09:06ID:???
>>292 にもう少し足すとuse strictしててもハッシュキーと=>は特別:

use strict;
my %hash = ( foo => 'bar', baz => 'gad' );
print $hash{ foo }, "\n";
$hash{ baz } = 'boo';

ハッシュキーは基本的に[a-z0-9_]を使ってる限りクオートする
必要はない。また => を使うと、左側のbarewordは自動的に
文字列に変換される。
0294nobodyさん02/06/17 10:21ID:???
Perl6では>>292的なベアワードの自動クォートは撤廃されるもよう。
(ただし>>293はPerl6でもオーケーっぽい)
ラリーヲールの黙示録2を見よ。
http://dev.perl.org/perl6/apocalypse/2#bareword%20policy

#どこかに黙示録の和訳ってねーですか?あったら教えてください。おながいします。
0295nobodyさん02/06/17 13:21ID:???
Perl6で撤廃か。まぁ妥当だね。
0296nobodyさん02/06/17 21:33ID:8ZfnaOKh
簡単なスクリプトでテストしてみても読み書き両用でファイルが開けません。なぜでしょう?
Windows上では使えないのでしょうか?

        ↓
open(FILE, "+>$file");

環境はWin2000+Apache1.3.24です。
0297nobodyさん02/06/17 21:38ID:???
>296
なにが上手くいかないの?
同じ環境できちんと動くけど。
まさか保存されてるファイルが読み出せないとかじゃないよね?
だって最初に初期化してから書き読みモードで開いているんだから。
読み書きモードじゃなくて。
開けないって言ってるから、openが失敗してるんだよね?
ファイルの作成もできないんだよね?
そうだよね?
0298nobodyさん02/06/17 21:46ID:???
>>297
いぢめすぎ(w
029929602/06/17 21:49ID:8ZfnaOKh
たとえばこんな感じにしてもファイルは作成されるのに空のファイルなんです・・。
A
A  予想ではAが縦にならぶはずだと思うんですけど・・
A

open(IN, "+>$file");
@data = <IN>;
$data = "A\n";
unshift(@data, "$data");
print IN @data;
close(IN);
0300a02/06/17 22:28ID:???
ある某ゲーム(バトルロワイアル)を自分のホムペに乗せたいのですが...
初心者なので何をしてよいのかまったくわかりません。
教えてください。お願いします
0301nobodyさん02/06/17 22:37ID:???
ゲーム厨房消えろお願いするな乗せるな氏ね。
0302nobodyさん02/06/17 22:46ID:???
>299
書き読みモードと読み書きモードの違いってわかる?

書き読みモードの手順
空ファイル作成>ファイル読み書き

読み書きモードの手順
ファイル読み書き

それと、ファイルポインタの変更しないと色々問題出るぞ。
わからないなら無理に読み書きモードは使わない方がいいかも。
030329602/06/17 23:12ID:???
>>302
>書き読みモードと読み書きモードの違いってわかる?
ありがとうございます。分かってなかったですね。。
それでいろいろやってみて

open(IN, "+<$file");
@data = <IN>;
$data = "A\n";
unshift(@data, "$data");
seek(IN, 0, 0);
print IN @data;
close(IN);

これで動くようになりました。「+<」←これ手持ちの本に載ってなかった・・(´Д`;)
0304nobodyさん02/06/17 23:41ID:/p2D1YQW
Perlとちょっと関係ないですが、
全ての環境変数を表示した際、他人に見られるとマズイ情報ってありますか?
0305お頼み申す02/06/18 02:03ID:giO2VPVu
掲示板に関して一つアドバイスを願いたいんです。

普段は掲示板のタイトルが見られる。
でも書き込み(新規スレ立て、レス共に)はログイン/認証しないと
できないというような物はありますか?
探し続けて見あたらず無理なのかなと諦め気味。
いかがでしょうか?
0306nobodyさん02/06/18 02:23ID:zmbvlCMy
探すより作った方が遥かに早い罠
というか100%すれ違いです。
0307nobodyさん02/06/18 03:40ID:7mI4OrKx
aska(http://www.kent-web.com/bbs/aska.html)の
i-mode版(http://red.tomato.nu/desperado/software/)に、
i-PADv2(http://www.kent-web.com/bbs/ipad/ipad2.cgi)みたいに
返信がいくつ返ってきてるかわかる表示を加えたいんですが・・・
0308nobodyさん02/06/18 04:28ID:???
>>307
で?どこまで自分でやったんだい?
0309nobodyさん02/06/18 04:45ID:???
>>307
一日中掲示板に張り付いて誰かが返信する度にキミが書き換える。
0310nobodyさん02/06/18 08:36ID:???
>>307
マルチ氏ね
0311nobodyさん02/06/18 10:45ID:???
お前ら、【Perl】と関係ない質問は放置してください。
0312nobodyさん02/06/18 13:03ID:???
あほな質問で済みませんが
Jcode.pmってActiveperlにはインストールできないんでしょうか?
0313nobodyさん02/06/18 15:36ID:???
>>312
出来ます。オフィシャル嫁。
0314nobodyさん02/06/18 16:38ID:OAKwZ56o
Win+Apache環境で ScriptInterpreterSource registry でスクリプトを実行する場合、
#!/usr/bin/perl -w のオプションは機能しませんよね?(実際機能してないようなので。)
031531402/06/18 16:44ID:???
#!/usr/bin/perl ←これ自体なくても動くようなのでコメントアウトされてるみたいですね。
0316nobodyさん02/06/18 18:21ID:???
質問です。

use strict;

my ($a, $b);
local $c;

$a = 2;
$b = 3;
$c = $a + $b;

print "Content-type: text/html; charset=EUC-JP\n\n";
print $c;

こうすると
Global symbol "$c" requires explicit package name at (eval 1) line 6.
Global symbol "$c" requires explicit package name at (eval 1) line 10.
Global symbol "$c" requires explicit package name at (eval 1) line 13.
こういうエラーが出るのですが、すべてレキシカル変数にすると動きます。
なぜローカル変数だとuse strictでエラーが出るのでしょうか?
実際のスクリプトは複雑でどうしても$cをローカル変数で使いたいのです。
どうすればグローバル変数を使わずに正常に動かすことができるでしょうか?
0317nobodyさん02/06/18 21:52ID:???
>>316
なぜエラーになるかは、perldoc strict を読むべし。
「variable suicide問題を避けるため」らしい。よくわからんけど。

どうしてもlocal変数を使わなくてはいけない場合は、
use vars ('$c', '@array', '%hash'); # perl5.0
または
our ($c, @array, %hash); # perl5.6
みたいに、最初に変数名を宣言(というかシンボルテーブルに登録)しておく。

以上、経験則のみで答えますた。詳しくは識者の登場を待て。
0318nobodyさん02/06/18 22:39ID:???
>>317
ありがとうございます。

>use vars ('$c', '@array', '%hash'); # perl5.0
>または
>our ($c, @array, %hash); # perl5.6
これでいけました。恥ずかしながら今まで知らなかったので(汗)、これを機に勉強してみます。
0319nobodyさん02/06/19 01:44ID:nhdfxt0t
モジュールのインストールをしようとして、
make testをすると、『Test/More.pmが見つかりません』というようなことを言
われます。More.pmは何かのファイルに同梱されてるのでしょうか?
一応以下のURLを探してみたのですが、見つかりません…。
http://www.cpan.org/modules/by-module/

どなたかMore.pmがある場所を教えて下さい。
0320nobodyさん02/06/19 02:03ID:???
http://search.cpan.org/search?dist=Test-More
0321nobodyさん02/06/19 02:32ID:???
>>320
解決しました。
Test-Moreはもう古く、入れるならTest-Simpleでやってくれと
言われて、Test-Simple-0.44.tar.gzを入れました。
うまくいきました。

ありがとうございました。
0322nobodyさん02/06/19 19:05ID:oqQh34R0
<img src ="test.cgi">でCGIを呼び出して
画像を表示させたいのですが上手くいきません

print "Content-type: image/gif\n\n";
open(IMG,"test.gif");
binmode(IMG);
binmode(STDOUT);
print <IMG>;
close(IMG);

KENTカウンタからそれらしい部分を
抜き出してみましたが動きません
画像はとほほカウンタのを使ってテストしてるので
変なヘッダーが入ってるということはないと思います。

http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.htmlの
600も試してみましたが動きません…。
誰か助けてください…。(;´д`)

#画像表示すらできない自分が情けない(´Д⊂
0323s02/06/19 19:28ID:???
直接その test.cgi をURLリクエストして確認してみては?

みたところおかしな部分はないようです。他の部分ってことない?
0324nobodyさん02/06/19 19:29ID:???
>>322

> print <IMG>

↑この部分を↓こう変えてみそ

while ( $cb = read( IMG, $data, 2048 ) ) {
 print $data;
}
0325LWPを使ってみたいのですが02/06/19 21:29ID:FGMnMj5W
>>273-277を読みました。

LWPをダウンロードしてきたけど、なんかひとつのpmファイルになってないようで
そのまま使えそうにありません。

使用してるのはwakwakのCGIなので使用条件が載っているページを見てみたのですが
perl5.6で標準ライブラリ?は利用できるようです。
で、標準ライブラリにあるか
試しにuse LWP::Simple;でCGIを動かしてみたのですが、内部エラーになりました。

LWPは、この環境では使うことはできないのでしょうか?

・インストールする方法(できないと思うが)
・インストールせずにデレクトリに配置して動かす方法
・他のCGI可無料HPですでにLWPがインストールされてるのでそこを使うといい
等々、なにか良い方法はないのでしょうか?

使うのは多分LWP::SimpleでHTMLドキュメントを引っ張ってくるだけです。
032632202/06/19 21:51ID:???
>>323-324
ありがとうございます。
原因はわかりませんが、両方の方法を試してみて
ダメだったので元に戻したら表示されました (´∀`;)意味わかんねス

0327nobodyさん02/06/19 22:33ID:???
>>325
LWPはperlコードだけで構成されてるから、自分で入れることも可能だと思う。
ただしLWPが入ってないサーバつーのは、そもそもソケットの使用を禁止してる場合も多い。
そんときはLWPを入れても無意味。
0328LWPを使ってみたいのですが02/06/20 00:34ID:XCYMLnG6
>>327

use Socket; 自体は動作しますが、Socketで通信を許しているのは localhostへのsmtp/tcpのみとなります。
だそうです。

これって望み薄ですか?
ちなみにやり方間違ってるっていうチョンボはしてませんよね?(僕)
ただuse LWP::Simple;としているだけなのですが・・・
0329LWPを使ってみたいのですが02/06/20 01:43ID:+cy8aoAH
イチかバチか入れてみました。
自作CGIのでバック設定というのができるみたいで
それを使ってやってみました。

最初は、HTTP/Statusのパスがうまく行っていなかったようなので
@INC追加したら、そこはクリアできました。

ただ
unless(defined($content = get $url)){
のところで
Can't call method "get" on an undefined value
が出てしまいました。これは無理と言うことでしょうか?
0330nobodyさん02/06/20 07:49ID:???
>>328-329
>Socketで通信を許しているのは localhostへのsmtp/tcp
駄目ジャン。
smtp/tcpってメール送信用のポートだし。localhostのみだし。
0331LWPを使ってみたいのですが02/06/20 15:27ID:zhAJDQeR
そうですか(トホホ

どっか、CGI可無料HPでできそうなところないですかね。
■ このスレッドは過去ログ倉庫に格納されています