【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あたりを見よう。
0455nobodyさん
02/09/28 19:23ID:???0456nobodyさん
02/09/28 19:28ID:???use Jcode;
print Jcode->new('abcdefg')->tr('a-zA-Z','a-zA-Z');
0457某スレ68
02/09/28 19:49ID:9nQPxW7pややこしくてすみません。
スペースを入れていくということです。
0458nobodyさん
02/09/28 19:49ID:???for ($i=1; $i<(length); $i+=2){
substr($_, $i, 0)= ' ';
}
print;
0459nobodyさん
02/09/28 20:02ID:???0461某スレ68
02/09/28 20:05ID:9nQPxW7pとにかく、短くできるようですね。
有難うございました。
0462すみません。某スレ68
02/09/28 20:14ID:9nQPxW7pabcdefg
% perl -e 'for ($i=1; $i<(length); $i+=2){substr($_, $i, 0)= \' \' ; } print;' hoge
とワンライナーで書きたいんですけど、
パーサーエラーと叱られます。
{}ってワンライナーでは禁止されているのですか?
0463nobodyさん
02/09/28 20:43ID:???perl -pe'$_=join" ",split//' hoge
0464nobodyさん
02/09/28 23:42ID:yZr0Nm9j本当にありがとうございます。m(_`_)m
0465データベース
02/09/29 01:20ID:???にある『検索専用データベース Ver2』
を使ってcsvファイルに含まれているデータの内容を取り除いてhtml上で繁栄
させる事ってできないでしょうか?
例
\pict\map\0001.gif
の「\pict\map\」の部分を取り除いて「 0001.gif 」だけ表示する
当方CGIの初心者で命令文の仕組みが全然把握できないので
「制作者に直接お願いしろやゴルァ」とか言わないで宜しくお願い致します。
急ぎの用なのでバージョンアップ待ちする訳にも行かず困っております。
0468nobodyさん
02/09/29 03:28ID:???少なくとも、
自分で調べてコード書いてみて、
間違ったままで良いからコピペして
どう直したら良いですか?
くらいしなきゃ、教える方も教えにくい。
「初心者だから」は通用しない。
初心者だからで言い訳するなら、はじめからCGIは触るな。
0469nobodyさん
02/09/29 04:28ID:GXYgNgIm@list = split(//, "abcdefg")
空の正規表現で分割すると,一文字ずつに分かれた配列が返る
join(" ", @list)
空白でつなぐ
ってこと。
0470nobodyさん
02/09/29 09:57ID:Xgxp2+Gpchomp(@array);
でいいけど、逆に 配列の値すべてに \n をつけたい場合はどうすればいいですか?
for で地味にループさせる以外に便利なものがあったら教えてください。
for($i=0;$i<=$#array;++$i){
$array[$i] .= "\n";
}
これよりスマートな記述キボンヌ
0471nobodyさん
02/09/29 10:02ID:NgmswZArmap {$_.="\n"} @array;
0472nobodyさん
02/09/29 10:05ID:NgmswZAr$_.="\n" for @a;
のほうがよかった。
0473nobodyさん
02/09/29 10:30ID:Xgxp2+Gpうぉお、すげぇ、ここまで短くなるんだな。サンクス子
0474nobodyさん
02/09/29 10:43ID:u41sQpPiそれを書き込む関数dbm_wがあって、
両方ともハッシュのリファレンスを渡してやるのですがdatasetはハッシュを返すようになっています。
なので%bufとか適当に経由しないといけないのですが、簡潔に済ませる方法はあるんでしょうか?
%buf = &dataset(\%in);
&dbm_w(\%buf, "chardata");
0475nobodyさん
02/09/29 11:21ID:???dbm_w({ dataset(\%in) }, "chardata");
でどう?
&dataset の仕様がいまいちよく分らないけど。
0476nobodyさん
02/09/29 12:12ID:Xgxp2+Gpmy $val = '';
のように書いて初期化しますが、これが複数になったとき、
my ($val,$aaa,$aho) = '';
とやっても、先頭の $val しか初期化されませんよね?だから
my ($val,$aaa,$aho) = ('','','');
と書けばよいかもしれませんが、これだと変数が100個になったら大変なので、
なにかよい方法がないです?
もっとも、変数100個なんて作らないんですが、
なんか、こういう記述って、いやなので、、
スマートな記述キボンヌ
0477nobodyさん
02/09/29 12:16ID:???0478nobodyさん
02/09/29 12:20ID:Xgxp2+Gpということは、初期化しなくても、勝手に初期化されるということ?
cとかでは、初期化しないと、ゴミが入ってるじゃん?
perl は my で宣言したときに、ゴミは入らないの?
0479nobodyさん
02/09/29 12:41ID:???通常は気にせず my $val; でいいが、
「未定義 (undef)」と「空文字列 or 0」は別物なんで注意。
{ my $val; print 1 if defined $val }
{ my $val = undef; print 2 if defined $val }
{ my $val = 0; print 3 if defined $val }
{ my $val = ''; print 4 if defined $val }
{ my($foo, $bar) = ('',''); print 5 if defined $bar }
{ my($foo, $bar) = (); print 6 if defined $bar }
0480nobodyさん
02/09/29 14:18ID:???my ($val,$aaa,$aho) = ('')x3;
でどう?
0481nobodyさん
02/09/29 15:22ID:???#!/usr/bin/perl
use Socket;
$port = 80;
$ipaddress = inet_aton("www.asahi.com");
$address = pack_sockaddr_in($port,$ipaddress);
socket(SOCKET,2,1,0);
connect(SOCKET,$address);
select(SOCKET);
$ |= 1;
select(STDOUT);
print SOCKET "GET /index.html HTTP/1.0\r\n";
print SOCKET "HOST: www.asahi.com";
print SOCKET "\r\n\n";
while(<SOCKET>){
print $_;
}
exit;
これで標準出力に表示されるはずなんですが表示されませんどうしてでしょうか?
0482nobodyさん
02/09/29 15:30ID:???print SOCKET "HOST: www.asahi.com\n";
print SOCKET "\n";
0484nobodyさん
02/09/29 16:00ID:u41sQpPiprint SOCKET "\r\n\r\n";
0485nobodyさん
02/09/29 16:04ID:u41sQpPi希望道理の動作が出来ました。有難うございます。
0486nobodyさん
02/09/29 16:05ID:???は
print SOCKET "GET http://www.asahi.com/index.html HTTP/1.0\r\n";
print SOCKET "\r\n\r\n";
で。
0487nobodyさん
02/09/29 16:16ID:???>>483を見なよ、Windows環境だよ。binmode(SOCKET)やってないんだから
"\r\n" はいかがなものか・・・
0488484=486
02/09/29 16:45ID:???うちはWindows環境で、binmodeやってないが通ってたりする。。。
っていうかこれは相手サーバに渡す物だから、自分の環境がWinかどうかは関係無いんじゃないんですか?
いやはや無知ですいません。出過ぎましたね。
0489nobodyさん
02/09/29 17:30ID:TaQBEb50{
XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX
}
の{}は何を意味しているの?
0490nobodyさん
02/09/29 17:34ID:???質問の意味がわからないけど、ブロック構造でしょ?
ソースの見栄えをエレガントにしたり、lastとかでブロック抜けしたりも可
if文やforなんかにも使ってるでしょ?
Cだとブロックの先頭でしか変数宣言できないんで、その為にブロックを作ることもあるかと。
0492nobodyさん
02/09/29 19:26ID:???print (("スン スン ス〜ン♪ ( ゜Д゜)ハッ!!\n") x <STDIN>);
0493nobodyさん
02/09/29 19:32ID:???0494nobodyさん
02/09/29 20:01ID:???この辺を読んで頑張る。
ttp://www.din.or.jp/~ohzaki/perl.htm#Character
ttp://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0496nobodyさん
02/09/29 21:23ID:TaQBEb50ありがと。
でも、まだよくわからない。
普通は
if (XX)
{
XXXXXXXXXXXXXXXXXX
}
こんなかんじで条件が入るでしょ。
ところが>>489は条件が無いんだよね。
条件が無いなら、わざわざくくる必要が無いと思うんだけど。
0498nobodyさん
02/09/29 22:10ID:???局所的な処理がしたいんじゃないの?
たとえば
$a = 1;
{my$a = 'hoge';…}
print $a;
#結果は1
そんな不思議ならその部分だけ出してみれば?
実際のコードを見ないと、それに確かな意味があるのかどうかはコメントできないよ。
0501nobodyさん
02/09/30 00:54ID:???0502nobodyさん
02/09/30 08:11ID:???C++等ではすごく一般的なコーディングスタイルで
局所的にしか使わない変数が、他へ漏れない様にするために使う
けど、perlでもそういう使い方なのかは知らない
0503nobodyさん
02/09/30 08:58ID:???0504nobodyさん
02/09/30 11:11ID:2MKvRRFxメイン画面⇒掲示板画面⇒投稿⇒掲示板画面
の順で操作をして最後の『掲示板画面』でブラウザの戻るを押したら
投稿する前の掲示板画面が表示されるのですけれども、メイン画面を表示させたいのです。
どうすればよいでしょうか? ご指導お願いします。
0505nobodyさん
02/09/30 11:16ID:???ダウト
スレ違いなのであまり深くは追求しないけど
宣言できることが重要なんじゃなくて、局所的な変数が他へ漏れない様にするのが重要
あとその局所的なコードを他へコピペするときとか
ブロック化してあるとどこからどこまでコピペすれば良いのか一目瞭然だし
0506nobodyさん
02/09/30 11:19ID:???それが仕様と思って諦める
というか自分で「メイン画面⇒掲示板画面⇒投稿⇒掲示板画面」つーフローを書いておきながら
ブラウザの戻るボタンでメイン画面まで戻そうとする事自体おかしいと気付かないか?
素直に「メイン画面へ戻る」リンクを掲示板画面に付けましょう
0507nobodyさん
02/09/30 11:43ID:gw3vjcK1自動で自分のパソコンに保存できるようにしたいのですが
そういうの可能でしょうか。
可能な場合、送信したあと「Webページの保存」のダイアログが出てしまいますか?
できれば送信したら勝手に保存できるのがいいのですが。
0509504
02/09/30 12:13ID:2MKvRRFxメイン画面⇒[掲示板画面⇒投稿⇒掲示板画面]
と最後の要素をひとくくりにして、ブラウザで戻るでメイン画面に戻る
ことはできないでしょうか?
しつこくてスイマセンが、実際とても困っているので。
0510nobodyさん
02/09/30 12:15ID:gw3vjcK1おお、素晴らしい。出来るのですね。
ですが、ちょっとどんな風に書いたらいいか想像できないのでヒントか、
それに近い動作をするスクリプトを紹介していただきたいのですが。
0513512
02/09/30 12:25ID:???スマソ
0515nobodyさん
02/09/30 12:30ID:???0516504
02/09/30 12:36ID:2MKvRRFxどうすれば、よいのでしょうか?
0517514
02/09/30 12:40ID:???0518nobodyさん
02/09/30 14:02ID:???自動は無理と思われ。
とりあえず、URLを入力したら、そこのhtmlを
ファイルに保存するとこから始めてみたら?
それができたら、次はダウンロードにすりゃいい。
0519nobodyさん
02/09/30 15:34ID:???世の中のPCの中は大変な事になってるな。
0520nobodyさん
02/09/30 15:36ID:???locationで[メイン画面]に飛ばすじゃ駄目なん
どうしても戻るボタンでどうにかしたいなら
全て(または一部)の画面をHTML化すればできるかもしれないけど
0521510
02/09/30 15:39ID:???open (DATA, ">>c:\data.txt") || &error("開けません。");
print DATA "あああああああ";
close(DATA);
こんな事が可能だったら・・・誰でもクラッカーになれますね。
という事はやはりhtmlのあるurlを入力してそのページを開いて
javascriptで「ページを保存しますか」のダイアログ出すまでがせいぜい精一杯てとこでしょうか。
0523504
02/09/30 16:52ID:2MKvRRFx初心者なもので、聞いてばかりですいませんが。
具体的にはどうすれば良いのでしょうか?
0525504
02/09/30 18:25ID:2MKvRRFxでは最初から事情を説明いたしますと、小説投稿サイトを作ったのですが
作品画面で
◆作品にポイントをつける
◆作品に感想をつける
の2つの送信ができるのです。
このとき、ブラウザの戻るで直接メイン画面に戻れない場合で、作品にポイントと感想の両方をつけたい場合
●メイン画面⇒(作品選択)⇒作品画面⇒(ポイントをつける)⇒メイン画面⇒(作品選択)⇒作品画面⇒(感想をつける)⇒メイン画面
とユーザーの操作がどうしても冗長になるのです。
それで
●メイン画面⇒(作品選択)⇒作品画面⇒(ポイントをつける)⇒(感想をつける)⇒(ブラウザで戻る)⇒メイン画面
としたいのです。
と少々入り組んだ事情があるのですけれど。
0526nobodyさん
02/09/30 18:36ID:???>とユーザーの操作がどうしても冗長になるのです。
ポイントと感想を同時に投稿すればいいのでは・・・
さらにどうして「ブラウザで戻る」にこだわるのか小一時間問い詰めたい。
投稿されたら、プログラム内で勝手にメイン画面ルーチンへ飛べばいいだけだと思うんだが。
0527504
02/09/30 18:38ID:2MKvRRFxポイントだけ、感想だけ、つけたいというユーザーもいるので。
0528nobodyさん
02/09/30 18:39ID:???>526さんの最後の一行は読みました?
0529nobodyさん
02/09/30 18:49ID:IOB01lXZ今試みてるんですが、
バイナリファイルを複数個送信すると2個目以降が送られてこないんです。
テキストファイルなら複数個同時にいけるんですが、、
0530nobodyさん
02/09/30 19:08ID:???初心者というからにはCGIも拾い物なんだろう
もっと理想に適ったものがどっかにあるだろうから
自分で作る気がないなら別のものを探してきなされ
0531nobodyさん
02/09/30 19:44ID:ImfR65/j出来る・・・よね?
探し方が悪いのか考え方が悪いのか、いまいちこれという情報に
行きつけないのだが・・・。
0532504
02/09/30 19:46ID:???いえ、スクリプトは自作ですよ。
どうすればいいのか分からない部分があったりして、
ネットでも探しましたが、欲しかったモノはなかったので。
ちょっと、今は解答を得られそうに無いので
もう少し、問題が具体的になってきたら、再び聞きにくるかもしれません。
そのときは、よろしくお願いします。
0533x
02/09/30 20:00ID:q3kf4WJx↓ ↓ ↓
http://www.dream-express-web.com/space-trust.htm
0534nobodyさん
02/09/30 20:02ID:???0536531
02/09/30 21:10ID:???さんくす!検索してみますた。
531書いてる時点では良くわかってなかったけど、
むしろOpen3の方が意図に近かったかもしれない。
ラクダ本は今手元にないのでそっちも今度見てみます。
0540529
02/10/01 00:10ID:x+as6bjiSTDIN見てるよ!
ってwebサーバ上にアプしたら普通に取得できますた。
これはwin+ActivePerl+Apacheの罠でしょうか。無念。
お騒がせしました。
0542nobodyさん
02/10/01 04:41ID:???画像なり音なりを受け取った際のPerl側での
ファイル形式判断はどうすればいいのでしょうか?
画像についてはImage::Sizeモジュールのおかげで
判別できましたがその他の形式の判別方法がわかりません。
皆さんどうやって最終的に書き出す場合、拡張子付けしてるのでしょうか?
0543nobodyさん
02/10/01 06:12ID:???アップされたファイルの拡張子を使いまわせば?
どうしても正確に判別したいなら
「GIFはデータの先頭がGIFで始まる。」
「PNGは0x89PNGで始まる。」
「JPEGは7バイト目にJFIFの文字がある。」
こんな感じの情報を探しなさい。
とんでもない量になると思うけど。
0544nobodyさん
02/10/01 07:04ID:???あれ?元ファイル名の拡張子ってもしかして使いまわせるんですか?
cgi-lib.pl使って受け取りデータをフォーマットしてるのですが、
どうもファイルデータを受け取るキーからは、画像なりの実データのみしか得られず
元ファイル名(の拡張子)が得られなくて、バイナリ判別しかないのだろうか
と思ってしまっていたのですが…。
0545nobodyさん
02/10/01 07:54ID:/I8m+twd0547546
02/10/01 08:03ID:???板違いだよ。
××リンク依頼の拒絶文××
http://pc3.2ch.net/test/read.cgi/hp/997085797/
0549529
02/10/01 10:18ID:x+as6bji見事にbinmode(STDIN);してませんですた。
フォームからのテキストやらまざってても問題ないですか?
とりあえず試してみます。
0551nobodyさん
02/10/01 12:40ID:???cgi-lib.plは使ったこと無いからわかんないけど
STDINにはfilename="…"ってデータが他のデータと一緒に送られて来てる。
>>549
問題無し。
0552nobodyさん
02/10/01 14:36ID:???やり方はなんでもいいんですけど自分の想像で書いたら見事に失敗しました。
何がいけないですか。
$url = "http://www.yahoo.co.jp/"
open (DATA, ">>data.html") || &error("開けません。");
print DATA "Location: $url\n\n";
close(DATA);
0553nobodyさん
02/10/01 14:37ID:???中身がそのまま「Location: $url\n\n」だったという事です。
0554nobodyさん
02/10/01 14:38ID:???■ このスレッドは過去ログ倉庫に格納されています