【Perl】初心者コーナー Part16
■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo
02/09/15 15:11ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【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あたりを見よう。
0032nobodyさん
02/09/15 22:50ID:???0033nobodyさん
02/09/15 22:50ID:???>open(FOUT,$str);
↑ open(FOUT,$str)|| die $!; の方が良いのでは?
2chのdat生取りはそれなりに作法が有ったんじゃ無いか
それと、生Socket使うよりIO::Socketとか29の言う様にLWPなんて
便利な物があるので、そっちを勧める
wgetに放り込むとか (w
// 固定に異常に粘着する猿はコイツなので気にしないように
http://pc.2ch.net/test/read.cgi/php/1029945604/l50
0034nobodyさん
02/09/15 22:52ID:???0035nobodyさん
02/09/15 22:55ID:???0036nobodyさん
02/09/15 22:55ID:???彡川川川キチガイミ〜
川川川/ \|〜 プゥ〜ン / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
‖|‖ ◎---◎|〜 クサイ / この板では俺様以外は固定を名乗るな!
川川‖ 3 ヽ〜 < XSとParrotが使えて、PERL5.8をコンパイル
川川 ∴)д(∴)〜 \ 出来る俺様を差し置いて固定とはなんだ!!
川川 〜 /〜 カタカタカタ \ 俺は一日中Perlを触ってるプロだ
川川‖ 〜 /‖ _____ \ PerlCCもhernessも使える
川川川川___/‖ | | ̄ ̄\ \ \ 上級者の俺のイソターネットを見てくれ!!
/ ヒキコモリ \__| 低収入 | ̄ ̄| \ http://hiero_pl.tripod.co.jp/
/ \__>>34 | | |__| \____________
| \ 中卒 |つ |__|__/ /
/ アホ ̄ ̄ | ̄ ̄ ̄ ̄| 〔 ̄ ̄〕
0037nobodyさん
02/09/15 23:02ID:???0038nobodyさん
02/09/15 23:11ID:???>>25
前ベンチマークで計った記憶があるのですが、
全て変換してもsprintfの方が重たいんですよね。
sprintf使った方がシンプルで見やすいからでしょうか?
0039nobodyさん
02/09/15 23:20ID:???0$time if (...);
こんなのがダサイとも気持ち悪いとも思わないのならどっちでもヨロシ
一兆回ループするなら速い方が良いかもね
004027
02/09/15 23:27ID:d22Bbzx7>>29 >>33
レスありがとうございます。
2chのスレッド取得はどんな作法があるのか調べてるのですが
よくわからないです。
Irvineではうまく落とせますね。
0041nobodyさん
02/09/15 23:28ID:???xx/yyみたいに表示されますが、さっぱり意味がわかりません。
誰か小学生にも分かるように教えて下さい
0042nobodyさん
02/09/15 23:33ID:vqb5QhHrheader(-charset=>'euc-jp'), start_html("INPUT"),
"性別: ", radio_group(-name=>'sex', -values=>['男', '女'],
-default=>'-', -labels=>\%labels), br,
……
例えばラジオボタンを上記のような記述で記述すると
param('sex') に"男"あるいは"女"が渡されてきます。
2バイト文字を使って条件判断をするのはちょっと気持ち悪いのですが、
表示文字をアルファベットにするわけにも行きません。
直接2バイト文字の条件判断を使わず、帰ってくる値を簡単な変数(0,1やm,f等)に置き換えることは出来ませんでしょうか。
0043nobodyさん
02/09/16 01:22ID:???ハッシュで定義しとけばいいじゃん
@sex{('男', '女')}= (0, 1);
$sex= %sex{param('sex')};
0044nobodyさん
02/09/16 01:58ID:???まず、aaa.html に <!--#exec cgi="bbb.pl" --> と記述しておきます。
で、ccc.html から aaa.html に飛ぶと、
もちろん $ENV{'QUERY_STRING'} は ccc.html になりますよね。
そうじゃなくて、aaa.html を参照したい時にはどうすればよいでしょうか?
環境変数にそんなのないですよね…?
0045nobodyさん
02/09/16 02:12ID:???004644
02/09/16 03:34ID:UarIxOyF> $ENV{'QUERY_STRING'} がaaa.htmlになるのか?
失礼しました…。
$ENV{'HTTP_REFERER'}の間違いです。すんません。
004744
02/09/16 03:38ID:???$ENV{'DOCUMENT_URI'}ですね。ありがとうございました。
0048nobodyさん
02/09/16 03:47ID:???ぜーんぜん違うじゃんかよ
$ENV{'HTTP_REFERER'}は、bbb.plが呼ばれたページだから
aaa.htmlとなるはず
0049b
02/09/16 03:49ID:oqHfjXJ7005342
02/09/16 12:22ID:m4c9VqI1ご回答ありがとうございます。
つまり、そういう方法で置き換えることしか方法が無いということですね。
イチイチ置き換えないといけないとなるとCGI.pm使うのも微妙なところだなぁ。
ちなみにそちらの方法を試したら動きませんでした(^^;
今直してます。
0056nobodyさん
02/09/16 15:05ID:???0057nobodyさん
02/09/16 15:10ID:???>29と同じ事を言わせるな。
スレ立て自体は感謝してる。
だが煽りにのって煽り返すなよ。
そんなだから延々煽られるんだろうが・・・。
コテハン煽りを放置できないならコテハン使うな。
名無しに戻れ。
じゃなければこのスレから去ってくれ。
真面目に返答してるコテハンまで悪い目で見られるだろ。
頼むから。
初心者スレを潰したいわけじゃないだろう?
あんた自身の手でこのスレをクソスレにでもしたいのか?
0058nobodyさん
02/09/16 15:10ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【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あたりを見よう。
0061nobodyさん
02/09/16 15:24ID:???0062nobodyさん
02/09/16 15:53ID:???print "あなたのお名前を入力してください:"; chomp($name = <STDIN>);
do
{
print "あなたのお名前は",$name,"さんですね?\n";
print "YES:0NO:1\n"; $logic = <STDIN>; print "\n"; chomp($logic);
if ($logic == 0)
{
print "やはりそうでしたか";
}
elsif ($logic == 1)
{
print "嘘はつかないでください\n";
}
else
{
print"YESかNOかで答えてください";
}
}
until($logic == 0);
と作りました。しかし0か1かを入力するところを0,1以外で入力するとelse構文のないようが表示されず
終了してしまいます。
なぜでしょうか?
0064nobodyさん
02/09/16 16:20ID:???ありがとう
0065This is perl, version 5.003_07
02/09/16 17:56ID:???という場合、$hoge の値として ? とか ( ) とかの
記号が入ってる場合、その記号を文字そのものとして
パターンマッチさせるにはどうすればいいんでしょか?
0067This is perl, version 5.003_07
02/09/16 18:11ID:???006942
02/09/16 23:48ID:m4c9VqI1結局色々やっても>>43さんの方法は出来ませんでした。(TT
あとこの方法は非常に長いパラメータがついてしまうと大変な気がするのですが、、、、
例えば男、女ではなく
"問1: ", radio_group(-name=>'sex', -values=>[
'2ちゃんねるは諸言語のプログラミングを学ぶ上で非常に有用なコミュニティであり、云々〜(以下永延と)と思う',
'2ちゃんねるはどちらかというと学ぶと言うよりは遊び感覚で参加すべきであり云々〜(以下小一時間)だと思う'
],・・・・・・・・・・・・・
な感じだと文章をパラメータにして置き換えなければいけないんですよね。
こりゃ困ったな。。。
0070nobodyさん
02/09/17 05:04ID:yqtkGr1mopendir(DIR,"./");
while($_ = readdir(DIR)){
print "$_," . (stat)[9] . "\n";
}
closedir(DIR);
とやっても、ファイルの更新時間が見れません。
statがWindowsでサポートされていないのであれば、
ほかに代わる方法ないでしょうか?
007171
02/09/17 08:09ID:???gifcat.pl を使って
open(PUT, ">counter.gif");
flock(PUT, 2);
binmode(PUT);# MS-DOS や Windows の場合に必要です。
foreach $gif (@num)
{
$int = $imgpath . $gif;
$imagefile = "$int . .gif";
push(@getimg, $imagefile);
}
print PUT &gifcat'gifcat("@getimg");
print <PUT>;
flock(PUT, 8);
close(PUT);
というコーディングをしたんですが、うまく表示できませんでした。
gifcat.plの使い方がおかしいのでしょうか?
0072nobodyさん
02/09/17 08:19ID:???ちゃんと出とるはず
perldoc -f stat
9 mtime last modify time in seconds since the epoch
(The epoch was at 00:00 January 1, 1970 GMT.)
# modifyはmodifiedの間違いじゃない?
0074かるぴすうぉ〜た
02/09/17 08:55ID:yqtkGr1mそれが、私の環境では、出ないんです。
Perlのバージョンは
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
OSは、Windows2000。
0075nobodyさん
02/09/17 09:00ID:yqtkGr1m仕方がないので、ファイルの書きこみ時、最後の行にでもtimeの値を書きこんで
随時それを読み込んで参照することで、しばらくは解決させることにします。
もし、ファイルに対して直接更新時間にアクセスできるような処理方法があったら
おながいしうます。
そんなはず無いんだけどね。そのPerlが壊れてるなら別だけど。
実際私の環境(ActivePerl631, WinME)だとそのコードだと正常に動くし。
それとももしかしてopendirの引数にカレントディレクトリ以外の値を与えてる?
それだと失敗するよ。
007771
02/09/17 09:10ID:???&gifcat に"$int.gif"("1.gif""2.gif"...)を渡したいんです。
それとも、GIF画像自体を渡すんでしょうか・・・
スレ違いかも失礼
0078nobodyさん
02/09/17 09:16ID:???おらwin98SEのActivePerlのv5.6.0 built for MSWin32-x86-multi-threadだけ
ど問題なく動いてるYo
0079nobodyさん
02/09/17 09:20ID:???だから、
$imagefile = "$int . .gif";
じゃ1\ .\ .gifとか2\ .\ .gigっていうファイル名になっちゃうんじゃないって
言ってるんだけど('\ 'ってのは半角空白ね)
0081nobodyさん
02/09/17 11:52ID:???自分なりにも考えました
if(length $line > 16){
$line = (join "", (split "", $line)[0..13]) . "..";
}
これよりもっと効率のいい方法がありそうだと思うのですがあったら教えてください
0082nobodyさん
02/09/17 11:56ID:???008471
02/09/17 12:54ID:???納得
>80
ごめん
008571
02/09/17 13:12ID:???>79が原因でパスが間違っていたのと、変数名がサブルーチン部分と
重複しているものがありました。
>73=77さん、>80さん、ありがとうございますた!
008686
02/09/17 15:28ID:???パスワードを入力すると管理画面に入る、というのを行いたいです。
暗号処理はいらないです。うまいやり方を教えてください。
お願いします。
0087nobodyさん
02/09/17 15:58ID:???if(パスワードが送信されてきた){
&管理画面;
}else{
&パスワード入力画面;
}
0088nobodyさん
02/09/17 16:12ID:???>>76 さんの答えがビンゴだと思うけど一応。
opendir DIR, ($dir = './');
print(scalar gmtime((stat $dir . $file)[9]), ' ', $file, "\n")
while $file = readdir DIR;
closedir DIR;
用途によっては stat よりファイルテスト演算子の方がいいかも。
0089必殺bodyさん
02/09/17 16:22ID:???do {
&パスワード入力画面;
}
until($password == <INPUT>)
とか
0090nobodyさん
02/09/17 16:23ID:???すみません〜
0091nobodyさん
02/09/17 16:43ID:bZ09p6Xo---S--x-w-[000]という削除できないファイルができてしまったのですが
管理者に削除してもらわないと無理でしょうか?
009391
02/09/17 17:31ID:???管理者にすがってみます。
ありがとうございました。
00953PIO ◆3pIoOHKo
02/09/17 21:11ID:0b85vBv+昨日は本当にスマンかった
今度から気を付ける。
許してくれm(__)m
0096nobodyさん
02/09/17 21:30ID:???0097nobodyさん
02/09/17 23:47ID:???0098nobodyさん
02/09/17 23:47ID:nVaQI6CNそこでテストすると500InternetServerErrorが出てしまいます。
まったく内容の同じサンプルCGIを自サーバーで開くと問題なく作動します。
スクリプトは何回も確認しましたが間違ってはいないようです。
保存時の文字コードが関係あるようなのですが、調べてもなかなかわかりません。
cgiはメモ帳で作成しています。OSはXPで自サーバーはApacheです。
どうすれば正常に作動するのでしょう?
0099nobodyさん
02/09/17 23:50ID:???そこで って、どこ?
010098
02/09/17 23:53ID:nVaQI6CN文章拙くてすみません。
そこで = 自サーバー(Apache)です。
0101nobodyさん
02/09/17 23:58ID:???確かね、500 Internal Server Error になると、
そのエラーページの最後の方に「エラーログ
見ればもっと詳しい事が分るかも」って書いてあ
るんだよ。違う?
もしかして IE だと読めないんだっけ?
010398
02/09/18 00:04ID:P3Sos/ey教本に付属しているCDのサンプルCGIはきちんと動作しています。
が、まったく同じ内容の私の作ったCGIはエラーになってしまうのです。
保存時の文字コードによっては文字化けして表示されたりもするので文字
コードではないかと思うのですが、いろいろな文字コードで保存していま
すがどれもうまく作動しません。
原因は他にあるのでしょうか?
010598
02/09/18 00:17ID:P3Sos/eyうーん、何回も見直してみたのですが……。
全角、半角も見直してみましたが間違ってはいないようです。
文字コードは関係ないのでしょうか?
010798
02/09/18 00:22ID:P3Sos/eyはい、比べて見ました。
どっちも1342バイトでした。
もしかしてもっと根本的な何かなんでしょうか?
Apacheを再インストールしてみます。
……普通は有り得ない現象なのでしょうか?
010998
02/09/18 00:30ID:P3Sos/ey>>108
同じ名前で試してみました。
やっぱり動作しません。
キャッシュっていうのは、インターネット一時ファイルを削除すると言うことでしょうか?
011098
02/09/18 00:37ID:P3Sos/eyもう眠るので落ちます。
ご意見ありがとうございました。
0111nobodyさん
02/09/18 01:20ID:8kqybO5Fの排他制御を使わせてもらおうと思っているのですが
return \%lfh if (time - $1 > $lfh{timeout} and
rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time));
last;
ここの部分がいまいち何をしているのかわかりません。
特に\%lfhというエスケープ演算子の後のハッシュはどういう意味なんでしょうか?
0113111
02/09/18 02:27ID:8kqybO5Fありがとう!少しスッキリしました。
0114nobodyさん
02/09/18 04:11ID:???サンプルのディレクトリにはjcode.plがあるが、
キミのディレクトリには無い。
とか、
キミのファイル名が日本語だから(XP上で日本語じゃダメなのかは不明)
とか。
0115nobodyさん
02/09/18 08:56ID:4xK36YHqコマンドプロンプトで
perl -cw filename.cgi
しろ
0116nobodyさん
02/09/18 09:45ID:04tSnTX3やりたいのですが、特定の環境・ホストの組み合わせによっては
出来ない場合があります。
ログインまでは出来るのですが、なぜかリスト取得(nlst)や
ファイルのput・getができません(pwdやcwdはできます…)。
エラーが出るわけではなく、タイムアウトしてしまいます。
どうすればいいでしょうか。以下、ソースです。
#ここから
use Net::FTP;
$ftp = Net::FTP->new($ftphost, Debug => $ftpdbg, Passive => $passive)||die "Net::FTP FAILED";
$ftp->login($ftpuser,$ftppass);
$ftp->ascii();
$ftp->cwd("web/cgi-bin");
@files = $ftp->dir();
print join("\n",@files)."\n\n";
#ここまで
このソースを別環境で試してみたところ、問題無く
動きました…。ちなみに、当方LANからのADSL接続です。
0117nobodyさん
02/09/18 10:21ID:???0118116
02/09/18 10:54ID:04tSnTX3接続先のftpサーバはPassive->0にしないとつながらないのです。
pasv()はPassiveに移行するコマンドですよね?
もしかしてデータポートの問題でしょうか。コマンドは
通るけどデータの受け渡しが出来ないので…。
011942=69
02/09/18 13:38ID:g3HNafQf0120nobodyさん
02/09/18 14:00ID:CaL1DwkZ-values=>['M', 'F'],
で
%labels = (M => '男', F => '女', ) ;
じゃだめなの。
0121nobodyさん
02/09/18 16:34ID:???まず、PASV モードにする事で何が変わるか理解してる?
ttp://www.atmarkit.co.jp/fnetwork/rensai/netpro11/netpro01.html
実験結果を理解する為には、条件について理解してる必要があるよ。
0122nobodyさん
02/09/18 19:54ID:???他のFTPクライアント(何でもいい)はその動かない環境で
PASVモードを使わないで接続できているのでしょうか?
データポートの問題には違いないけど。
0123nobodyさん
02/09/18 23:45ID:z0adaCjsif文で試してもどちらも同じような挙動をします。
&&、||は数値比較ということのようで、解説サイトで
if(($a==2) && ($b==2))
というような例を見ましたが、($a==2)は数値を返すのでしょうか。
print (1==1); ###1を出力
print (1==2); ###なにも表示されず
よくわかりません。よろしくお願いします。
0124116
02/09/18 23:54ID:hRbwuJFLnetpro01.html読んできました。ということは
Firewallの内側からftpする場合はpasv()する
ということですね。なるほど。
>122
他のFTPソフトでも、その動かないFTPサイトにはpasvか否かを問わず
同じ状況(ログインできるけどnlstやput・getができない)です。
それもそれで困っているのですが。仕方なくtelnetでつないで1ファイル
ずつftpしてます。
状況としては「クライアント→サーバはOK、サーバ→クライアントだと
データポートが食い違っている」ということ? なのかな。
0125nobodyさん
02/09/19 00:25ID:qg0OuaDdといったフォーマットのcsvファイルを読み出して、もし上下(下の行)の
文字列2と数値1が同じならば、別のcsvファイルに”上下”の
文字列1と当然ながら、同じ値の文字列2、数値1を出力するのはどうやればよいのでしょうか。
(csvファイルの入力、出力は大体分かっているつもりです。内部的な処理が分かりません)
また、仮に上下の文字列2、数値1が合わない場合(行自体が奇数だったりした場合)
文字列3、数値2を上下で比べて同様の事をしたいのですがこの方法も分かりませぬ。
よろしくお願いします。
0126125
02/09/19 00:29ID:qg0OuaDdAAA1,ABC,123,DEF,456(改行)
AAA2,ABC,123,DDD,444(改行)
というcsvファイルがあったなら、別のcsvファイルに
AAA1,AAA2,ABC,123
というのを出力したい、という意味です。
また、
AAA1,ABC,123,DDD,444(改行)
AAA2,ADD,777,DDD,444(改行)
ならば、同様に、別のcsvファイルに
AAA1,AAA2,DDD,444
というのを出力したいということです。
よろしくお願いします。
0128nobodyさん
02/09/19 03:24ID:???&&と&、|と||が同じ挙動なんてことはない。
&&は左と右の条件が両方成り立ったとき真、
||は左と右の条件が少なくとも一つ成り立ったとき真。
真てのは1を返し、偽は0を返すから条件が成り立たなければ
上の論理演算子を評価したとき、1が出てきたり0が出てきた
りするのは当然。こいうのは戻り値という。
0130nobodyさん
02/09/19 03:52ID:???こいうことかな?
while(<>){
chomp;
split /,/;
if ($o1 eq ($f1 = $_[1]) && $o2 == ($f2 = $_[2])) {
print "$o0,$_[0],$_[1],$_[2]\n";
} else {
print "$o0,$_[0],$_[3],$_[4]\n" unless $. == 1;
}
$o0 = $_[0];
$o1 = $f1;
$o2 = $f2;
}
0131nobodyさん
02/09/19 05:08ID:Ab8J7aLwあのよ、プログラムの質問なんだから無理に文章にしないで
・プログラム概略
プログラムの説明、使用目的など
・環境
OS、使用アプリ、関連アプリなど
・入力
データ入力の方法、データ形式など
・処理
プログラム内で行うデータ加工、計算、アルゴリズムなど
・出力
出力データ形式、出力先など
・問題点
不具合の説明
・自分なりの解決法(試したもの)
自分で試した方法
・ソース
問題となっているプログラムソース
このくらいの箇条書きに整理して質問しろよ。書いてるうちに問題が解決する
場合もあるだろ。
どうも、解り辛い書き込みが多いよ。
0132nobodyさん
02/09/19 06:51ID:???if($a eq '1' && $b eq '1'){
print "$aと$bが1なので表示しました。";
}
if($a eq '1' || $b eq '1'){
print "$aか$bが1なので表示しました。";
}
こんな感じ。
■ このスレッドは過去ログ倉庫に格納されています