【Perl】初心者コーナー Part12
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/04/27 23:17ID:1NNXdNspいらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
CGIの質問は【CGIだけどなんか質問ある Pert 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を見よう。
0758741
02/05/20 05:06ID:VDOXGDf5実際、\r・\r\n(あと\t)がどのような状態で入っているのか
cgiのコンソールで書かせて、HPに表示させるためです。
ただ長いスペースが空いているのではわからないので、
表示できる形に直しているのです。
>>746
そのとおり。XMLソースを加工しています。
問題をはっきりするため、読みこんだ$ファイルを
$a=~s/\r\n/\\r/ig;
$a=~s/\t/\\t/ig;
##デバック
$a=~s/\\r/\r\n/ig;
$a=~s/\\t/\t/ig;
して書きこんでいるだけなのですが、
書きこみ前と後のXMLファイルをVCでバイナリで開いてみると、
どうやら0D0Aが0Aに変わってしまっているようなのです。
何が問題なのでしょうか?
0759関係ないけど
02/05/20 05:30ID:???s///になんでiを付けてるのでちゅか?
デバッ ク ってなんでちゅか?
<pre>じゃだめでちゅか?
表示させるために置換したものを、なんで再びファイルに書くのれちゅか?
0760あとね
02/05/20 05:36ID:???0762とんちんかん
02/05/20 14:27ID:827vrQS8してるんですが、ちょっとした理由でこのログ ファイルが Unicode 形式になってしまいまいた。
でこのスクリプトで読み込んでみたら案の定白紙のテキスト ファイルを作ってくれました。
Perl で UCS2 のファイルの読み書きってできるんでしょうか?
Jcode.pmとかって使うんですか?
教えて君ですみません。
0763nobodyさん
02/05/20 16:08ID:???yes.
0764nobodyさん
02/05/20 20:31ID:???例えば
a==bで尚且つcの場合"あいうえお"を返す。a==bで尚且つcで無い場合"アイウエオ"を返す。
a==bでなかったら"123"を返す。それ以外は"---"を返す。
それで
if(a==b){if(c){z="あいうえお"}else if{(c){z="アイウエオ"}
}
else if{(a!=b){z="123"}
}
}
else{z="---"}
だと、当たり前のようにエラーになります。教えて君ですみませんが皆さんの力を貸して下さい。
0766nobodyさん
02/05/20 21:08ID:???もし $A eq $B かつ $A eq $C のとき $Z="あいうえお";
そうじゃなくて $A eq $B かつ $A ne $C のとき $Z="アイウエオ";
そうじゃなくて $A ne $B のとき $Z="123";
それ以外のとき $Z="---";
if && elsif else
0769nobodyさん
02/05/20 21:38ID:yMovYRK1$img = Image::Magick->new;
$img->Read( $file );
$img->Crop( $w, $h, $x, $y );
$img->Write( $file2 );
とやることで一ヶ所の切りだしはできるのですが、
格納している画像をカットしてしまうので、部分コピーするか、
元画像をコピーしようと思います。
ループの中に
$img2= $img->Clone;
を入れて、 $img2 に対して処理を行うことにしましたが、
Cropが有効にならなかったり、前回と同じ位置が吐き出されたりと
うまくいきません。
指定範囲を別の変数にコピーして、そこから書き出すということを
やりたいのですが、どのようにしたらいいでしょうか?
0771長瀬 愛
02/05/20 22:16ID:95UXUtUeカッコの数があわないのではないか。
それはともかく、この判定条件ではz="---"の文には
至らない気がするがまあいいや。
if(a==b){
if(c){
z="あいうえお";
}else if(c){
z="アイウエオ";
}
}else if(a!=b){
z="123";
}else{
z="---";
}
>>768
グレシャムの法則というのがあってね以下略
0772nobodyさん
02/05/20 22:17ID:???0773771 長瀬 愛
02/05/20 22:30ID:95UXUtUeくどいけど旅の恥はかきすて。
if($a==$b){
if($c){
$z="あいうえお";
}elsif($c){
$z="アイウエオ";
}
}else{
$z="123";
}
初心者は何がわからないかもわからなくて、検索もできません。
答える気がねーなら、煽ってんじゃねーヴォケが
ここは”一応”初心者スレなんだから。
オレモナー。
0775nobodyさん
02/05/21 02:20ID:iePDZE0bSSI/.htaccessが使用できないサーバ上にPerlで作成した単純なテキストを返すCGIをアップロードしました。
IEのアドレスエディットボックスに直接CGIのアドレスを入力すると正常動作しています。
これをindex.htmlがロードされると同時に読み込みたいのですが
CGIの参考書に載っている<!--exec cmd="hoge.cgi"-->や<img src="hoge.cgi">の呼び出し方が出来ません。
この他にindex.htmlと同時にhoge.cgiを読み込む方法がありますでしょうか?
0777nobodyさん
02/05/21 02:58ID:OppOtViG「SSI/.htaccessが使用できないサーバ」ですから
<!--exec cmd="hoge.cgi"-->
は使えません。
「単純なテキストを返すCGI」ですから
<img src="hoge.cgi">
はイメージデータが返さなければ意味がないです。
<script src="hoge.cgi"></script> で呼び出して、
ソースを下記のように javascript に書き換えましょう。
$text = "出力する文字列";
print "Content-type: text/plain\n\n";
print "document.write('$text')\;\n";
exit;
0778775
02/05/21 03:11ID:iePDZE0bご丁寧なレスありがとうございました。
早速試してみます。m(__)m
0780nobodyさん
02/05/21 03:53ID:1dGqnG5G学内BBS作ってるんですが、全員同じプロクシなので、
ほかに手っとり早く個人識別する方法はありますでしょうか。
0781nobodyさん
02/05/21 04:01ID:???(1)全員に固有のIDとパスワードを配布する。
(2)書き込みは係りの人に紙に書いて手渡しにする。
(3)自分だけ書き込み出来るようにすれば、おそらく書き込んだのは君だ。
(4)名前を書かせ、それを信じる。
0782775
02/05/21 04:04ID:iePDZE0b試して見ましたが、どうやらそのようですね。
ASAHIネットがCGIのβサービスを開始したからCGIの勉強を始めようとしたのですが・・・
うーん、他の人達は一体どのように対応しているのかなぁ???
もう少し調べて見ます。
ご指摘ありがとうございました。
0784nobodyさん
02/05/21 04:11ID:1dGqnG5Gうーん、2chのIDみたいなのとかつけたら
面白がると思うんだよね。
5) 300カ国の人間が300人自分の言語で書く。
0786nobodyさん
02/05/21 06:14ID:???今度IISでPerl使うんですけど、選択に迷ってまして、
どんなもんでしょ?
0790nobodyさん
02/05/21 10:59ID:???ActivePerl → 処理系名
ですよ。
0794nobodyさん
02/05/21 13:04ID:???どうしてもうまくいかない箇所があるのでどなたか教えてください。
書き込まれる本文を「$message」としたとき、
$message =~ s/(http:\/\/[ほげほげ]+)/<a href=\"$1\">$1<\/a>/ig;
こんな感じになると思うんです。
そこで、
$message =~ s/(http:\/\/[\w\.\,\/\~\-\+\=\#\%\&\?\(\)]+)/<a href="$1" target="_blank">$1<\/a>/ig;
こういう記述でやってみました。
ところが、どうしても以下のような「,」が続くURLや、
ttp://k-tai.impress.co.jp//cda/article/news_toppage/0,,9441,00.html
以下のような「&」が入るときに、URLのリンクがそこで途切れてしまうのです。
ttp://news.lycos.co.jp/company/story.html?q=20bloombergki1580637&cat=10
試行錯誤してみたのですが、詰まってしまいました。
どなたか教えて頂けませんか?
0795nobodyさん
02/05/21 13:50ID:???http://www.din.or.jp/~ohzaki/perl.htm#httpURL
0797とんちんかん
02/05/21 14:30ID:+ltjKcZFJcode,pMの実装例がみたいのですが、サンプルどこかにないでしょうか。
けっこうしつこく検索してるんですが。。。
UCS2をよみこむスクリプトつくりたいのdせうが。
0798nobodyさん
02/05/21 14:34ID:???DzSoft Perl Editorは良さそうだね。
(ただし、フリー版は行数制限あり)
http://www.dzsoft.com/dzperl.htm
0799nobodyさん
02/05/21 16:11ID:???最初はSocketを使って、レスポンスが帰ってきたらUpというようにしていましたが、
性質上どうも動作が重いので、代わりにpingで見ようとしましたが、全然資料が無くてよくわかりません。
どなたかご教授願います。
0800800?
02/05/21 16:21ID:???普通のテキストファイルはちゃんとできるのですが。
有用なリンクなどがあれば教えていただきたいです。
0801nobodyさん
02/05/21 16:44ID:???0802nobodyさん
02/05/21 16:50ID:???binmodeは多分やってるはずですが・・・。
以下ソースです。
$addr = (gethostbyname("www.2ch.net"))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET /back.jpg HTTP/1.0\n\n";
open(A,">>back.jpg");
while (<S>) {print A;}
close(A);
close(S);
0803nobodyさん
02/05/21 17:13ID:???ダメすぎです。
0804nobodyさん
02/05/21 17:37ID:Eo1hAg2d"ー"は日本語のハイホン
これが走らないのですが、ーはできないのですか?
0805nobodyさん
02/05/21 17:41ID:???【Perl】FAQを敢えて質問するネタ心者コーナー
に変更されますた。
0806nobodyさん
02/05/21 18:08ID:???http://www.google.co.jp/search?num=100&hl=ja&safe=off&q=%83%6E%83%43%83%7A%83%93&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
ハイフン
http://www.google.co.jp/search?num=100&hl=ja&safe=off&q=%83%6E%83%43%83%74%83%93&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
ハイプン
http://www.google.co.jp/search?num=100&hl=ja&safe=off&q=%83%6E%83%43%83%76%83%93&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
0807nobodyさん
02/05/21 18:18ID:???ttp://www.warbirds.nu/heiki/42000.htm
0809nobodyさん
02/05/21 22:04ID:???参考サイト(http://x68000.startshop.co.jp/~68user/)
書き出すファイルのファイルハンドルもbinmodeにしてね。
それとHTTPの応答は邪魔だから捨てると。
IO::SocketやLWPもチェック。
================================
use Socket;
$port = getservbyname('http', 'tcp');
$iaddr = inet_aton("www.2ch.net") or die "www.2ch.netは存在しないホストです。\n";
$sock_addr = pack_sockaddr_in($port, $iaddr);
socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成できません。\n";
connect(SOCKET, $sock_addr) or die "www.2ch.netのポート$portに接続できません。\n";
select(SOCKET); $|=1; select(STDOUT);
binmode(SOCKET);
print SOCKET "GET /back.jpg HTTP/1.0\r\n";
print SOCKET "\r\n";
while (<SOCKET>){
m/^\r\n$/ and last;
}
open(FH, "> tmp.jpg");
binmode(FH);
while (<SOCKET>){
print FH $_;
}
close(FH);
0813nobodyさん
02/05/22 09:31ID:???0814nobodyさん
02/05/22 11:42ID:o5bpVYAL配列のサイズを求めたいのですが、length(@arry)や(-s @arry)で取れません。
サイズを求める記述を教えてください。
0815nobodyさん
02/05/22 12:29ID:TrskWj5Vforeach (@arry){$length = length;}
0816nobodyさん
02/05/22 12:30ID:???配列をスカラーコンテキストで評価すると要素数になります。
my @array = 0..99;
my $c = @array;
print $c;
それともこういうこと?
my @array = 0..99;
my $length = 0;
map { $length += length } @array;
print $length;
どちらにしろまともな参考書を読むのをお勧めします。
0817nobodyさん
02/05/22 14:29ID:FKXAo2H10818nobodyさん
02/05/22 14:31ID:FKXAo2H1$length=keys %hash_name;
0819nobodyさん
02/05/22 14:34ID:dip8mLbFuse MLDBM 'GDBM_File';
tie (%db, 'MLDBM', 'data.pag', O_CREAT|O_TDWR, 0644) || die;
としましたが、
MLDBM:error Second level tie failed 'ファイルもディレクトリもありません'
と出て止まってしまいます。
スカラーを格納する時は、use GDBM_File ですぐできたのですが、
このエラーの原因が解りません ;;
Diedは上記エラーの次に出ます。MLDBMは最新です。
どなかた勘所の解る方、ヒントでも教えていただけませんか。 よろしくお願いいたします。
0820nobodyさん
02/05/22 14:35ID:LbPQIjeDContent-type: text/html\n\n
書いて、HTMLを表示したものを、処理の終わりがけに消して
Location: jump_url\n\n
したいのだが、どうすればいいのれすか
0822nobodyさん
02/05/22 15:16ID:7BsbRs8K言っていることがいまいちわかりません。
参考URLがあったら、教えてくれ。
0823nobodyさん
02/05/22 15:19ID:???2重カウント防止のやつね。
0826nobodyさん
02/05/22 16:37ID:JlVHE84P0827nobodyさん
02/05/22 16:50ID:???結果表示用のフレーム(F1)とCGIの進行状況を監視するフレーム(F2)をつくる。
F1にはCGIの出力を垂れ流す。(長時間無出力でタイムアウトしないように注意)
F2ではCGIの状況を監視する監視用CGIを実行する。
監視用CGIは処理が完了するまでrefreshでループする、完了したらWindow全体をどっかに飛ばす。
0828nobodyさん
02/05/22 17:24ID:B5h8aDroPCなら飛ぶんですが。。。
0829nobodyさん
02/05/22 17:29ID:T+IRZr/d仕様です。
Locationヘッダを絶対パスじゃなく相対パスで指定してるとか?
0831nobodyさん
02/05/22 17:43ID:B5h8aDro絶対パスで指定しています。
cgiにジャンプしてるんですが、できないんでしょうか?
0833nobodyさん
02/05/22 18:23ID:a/hkqU170834nobodyさん
02/05/22 18:26ID:???> いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
>
>1:自分はこう言う事がしたい。
>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。
>
>1と3が無いと誰も答えられないよ、良い回答は良い質問から。
>一緒に勉強しましょう。
0835nobodyさん
02/05/22 18:51ID:???0836nobodyさん
02/05/22 18:59ID:dip8mLbF2ch掲示板のID付与機能は、何を見てなされているのでしょうか。
環境変数でしょうか。
cookieでしょうか。
よろしくお願いします。
0838836
02/05/22 19:08ID:dip8mLbF0839nobodyさん
02/05/23 00:03ID:wU66PY4jif (length($data{'coment'}) > 500){print 'コメントが長すぎます。'
}else{
構文チェックではOKが出るんですが、どこが間違ってるんでしょうか?
0841nobodyさん
02/05/23 00:54ID:???>これだとエラーが出ます。
エラーの内容を書けない理由でもあるんでしょうか?
>フォームの
↓ ヘッダ(Content-type)出力してますか?
>print 'コメントが長すぎます。'
0843nobodyさん
02/05/23 04:41ID:???・ ・ ・ ヽ(´ー`)ノ ・ ・ ・
0844nobodyさん
02/05/23 16:07ID:???$strtmp = htmlテキスト
の条件で
$strtmp =~ /<a*href=(\w+)>/i;
print "URL = $&\n";
のように指定しておりますが、$&が返ってきません
($1にしても同様でした)
なるべくシンプルな形で改善方法およびもっと良い方法があれば
ご教授いただけますでしょうか。
0845nobodyさん
02/05/23 16:11ID:???×a*href
○a.+?href
0846844
02/05/23 17:00ID:???ありがとうございます。
どうしようもないとこまちがってました。
ただ、直してもやはり結果が
URL =
と何も出てきません。なぜなのでしょう??
0847nobodyさん
02/05/23 17:10ID:yzRVE+W0えっとperlの関数でエクセルのMAXやMINと同じ働きをするのはないの
でしょうか?
やりたいことは、
ある配列リストの中で、一番大きな数字と一番小さな数字を抜き出したい
んです。
例えば
@AA = (1, 0, 5, 13, 8, 0, 4,);
となっていたときに、最小の0と最大の13を抜き出して、それぞれを別々の
スカラー変数に入れるようにするにはどうしたらいいのでしょうか?
(@AAの中に入る数字は、整数だけです。また@AAの中身は別の計算で出た答え
を順番にならべたものなので、可変します)
よろしくおねがいします。
0848nobodyさん
02/05/23 17:26ID:???perlfaq9
#!/usr/bin/perl -n00
# qxurl - [email protected]
print "$2\n" while m{
< \s*
A \s+ HREF \s* = \s* (["']) (.*?) \1
\s* >
}gsix;
>>847
# もっと効率いいのがあるかも
@AA = (1, 0, 5, 13, 8, 0, 4,);
@BB = sort { $a <=> $b } @AA;
$MIN = shift @BB;
$MAX = pop @BB;
0849nobodyさん
02/05/23 17:28ID:???\wは正規表現でなにを意味するかをよく考える。
そしてURLに使われる文字列に必ず入るはずのものを考える。
://
0851847です
02/05/23 18:24ID:ETJF2qc1すごい!素早い回答ありがとうございます。
そうか、sort使えば出来ますね。関数ばかりを探していたので、気がつか
なかったです。
ありがとうございました。
0852nobodyさん
02/05/23 19:27ID:9GY0TqYi0853nobodyさん
02/05/24 01:20ID:T4wzQrMy教えて下さい。
@array の中は $array[a][b][c][d]...
と言う感じになっていて、
aの部分や、bの部分など条件を変えてソートが出来るようにしたいのですが
どうゆう方法でやるのが一般的なのでしょうか?
sort関数は使えなそうなので、自分で作るしかないんでしょうか。
0854nobodyさん
02/05/24 02:25ID:???ソースは下のurlにupしておきました。ご指導お願いします。
http://www68.dns.ne.jp/~bbs2/upload3/helen/OB0008502.lzh
0855nobodyさん
02/05/24 02:28ID:???Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:
Bareword found where operator expected at C:\inetpub\WWWROOT\testbbs.cgi line 33
, near "$myaction ep"
(Missing operator before ep?)
String found where operator expected at C:\inetpub\WWWROOT\testbbs.cgi line 33,
near "ep 'write'"
(Do you need to predeclare ep?)
Bareword found where operator expected at C:\inetpub\WWWROOT\testbbs.cgi line 35
, near "$mytitle ep"
(Missing operator before ep?)
String found where operator expected at C:\inetpub\WWWROOT\testbbs.cgi line 35,
near "ep ''"
(Do you need to predeclare ep?)
syntax error at C:\inetpub\WWWROOT\testbbs.cgi line 33, near "$myaction ep "
Execution of C:\inetpub\WWWROOT\testbbs.cgi aborted due to compilation errors.
ローカルでテストできる環境作れ。
http://tohoho.wakusei.ne.jp/wwwcgi6.htm
0856nobodyさん
02/05/24 02:52ID:???質問の意味が分からない。具体的に何がしたいのか書いてくれ。
aやbの条件を変えて、とかワケワカラン。
個人的にはあまり多次元にならないようにした方がいいと思う。
二次元配列で値のソートをする場合こんな感じ?
my @array;
for my $one (0..9) {
for my $two (0..9) {
$array[$one][$two] = $one * $two;
}
}
@sorted_by_value = sort { $b <=> $a } map { @{$array[$_]} } 0..$#array;
print join "\t",@sorted_by_value;
■ このスレッドは過去ログ倉庫に格納されています