■過去ログ倉庫めにゅーに戻る■
【Perl】初心者コーナー Part2
- 1 名前:名無しさん 投稿日:2000/10/18(水) 06:11
- 【Perl】初心者コーナー Part2
初めて来た方、初心者はまずこのスレッドから始めよう。
尋ねる前に同じ質問がないかこのスレや旧スレを一通り見てみよう。
案外答えはもう書かれているかもしれない。
レスは3日以内に誰かがしてくれると思う。
質問はなるべく具体的にしてもらった方が答える側も助かるよ。
telnet で実行したエラーメッセージを書いておくとかね。
print "Content-Type: text/html\n\n"; の書き忘れなんてのはよくあることっす。
旧スレ>
http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980&ls=100
やろうとしていることはここにあるかも「Perlメモ」
http://www.din.or.jp/~ohzaki/perl.htm
モジュール(*.pm)の日本語訳など「Perlの小技」>
http://member.nifty.ne.jp/hippo2000/perltips/
オフラインでPerlのテスト環境を整える>
http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980&st=88&to=101
- 2 名前:名無しさん 投稿日:2000/10/18(水) 07:04
- $email = 'age';
- 3 名前:パールはじめました 投稿日:2000/10/19(木) 04:15
- ライブラリとモジュールってどう違うんでしょうか?
- 4 名前:名無しさん 投稿日:2000/10/19(木) 12:24
- C言語で言うところの「#include」をやりたいのですが、
Perlではどうやるのでしょうか?
ちなみに、別のツールで作ったデータ配列ファイル、例えば
"abc",
"123",
"あいうえお",
のような物を
@datas = (
#include "a.dat"
);
のようなニュアンスで取りこみたいのですが・・
- 5 名前:名無しさん 投稿日:2000/10/19(木) 13:30
- >>4
a.dat に
--------
@datas=('abc','123','あいうえお');
------
と書いてあれば
require 'a.dat';
でOK。
- 6 名前:ブチ 投稿日:2000/10/19(木) 13:46
- >>3
モジュールは、C++などで言うクラスみたいです。
参照渡しが使えるので結構便利みたいですが詳しいことは使ってないのでわかりません。
詳しい人、補足お願いします。
>>4
#include と同じような機能だとしたら require 'a.dat'; かな?
require を使うのなら a.dat 内の最後に 1; を書いておかないと構文エラーと解釈されるので注意。
それに @datas = (.....); をまるごと データの方に書かないと駄目だろうね。
Perlとは関係ないけどそのような #include の使い方はお勧めできないなあ。
- 7 名前:4です 投稿日:2000/10/19(木) 13:59
- >>5-6
どうもありがとうございました。うまく行きました。
とりあえずはこの方法でやって、後でもっといいやり方も考えてみます。
- 8 名前:名無しさん 投稿日:2000/10/19(木) 15:15
- >>3 >>6
man perltie
man perlmod
- 9 名前:PPP 投稿日:2000/10/19(木) 16:10
- 職場を異動になりperlを使うようになりました。
プログラムは一度も作成したことないので、どのようなもので
勉強すればいいかわかりません。何かいい参考書籍がありましたら
教えていただけますか?独習perlとか簡単そうかなぁ?と思ってる
ですが、どうでしょう?
- 10 名前:名無しさん 投稿日:2000/10/19(木) 17:06
- >9
http://210.224.163.192/test/read.cgi?bbs=perl&key=970166109&ls=50
- 11 名前:PPP 投稿日:2000/10/19(木) 17:14
- >10さん
ありがとうございました。
参考にさせていただいます。
- 12 名前:名無しさん 投稿日:2000/10/19(木) 22:37
- 基本的なことかと思いますが質問させてください。
yesかnoを入力して分岐させたいのですが、yでもnでも
結果がelseの場合になります。どこが間違ってるでしょうか?
----
print "はい か いいえを選んでください(Y/N):\n";
$yes_no="";
$yes_no=<STDIN>;
$yes_no =~ tr/A-Z/a-z/;
if ($yes_no eq "y"){
print "Yを選択しました。\n";
}elsif($yes_no eq "n"){
print "Nを選択しました。\n";
}else{
print "YかNを選んでください。\n";
}
- 13 名前:>>12 投稿日:2000/10/19(木) 22:44
- そういうときはまず、変数の値が実際にどうなっているのかを確認すべし。
print "yes_no=[$yes_no]\n"; なんて行を1行おきに埋めこんでみよ。
- 14 名前:名無しさん 投稿日:2000/10/19(木) 22:54
- >>12
$yes_no =~ tr/A-Z/a-z/;
の後に、
$yes_no =~ s/[\r\n]//g;
を書く。
- 15 名前:名無しさん 投稿日:2000/10/20(金) 04:05
- フォームから入力された文字で半角英数字以外を拒否したいのですが
以下のようにすると半角英数字が一文字でも入っていればチェックに引っかかりません。
どのように書き直せば良いのでしょうか?
if( $check !~ /[a-zA-Z0-9]/){
print "Content-type: text/html\n\n";
print "<html><title>ERROR</title><BODY>ERROR</BODY></HTML>";
exit;
}
- 16 名前:名無しさん 投稿日:2000/10/20(金) 04:15
- if ($check =~ /\W/) とか
if ($check =~ /[^a-zA-Z0-9]/) とか
- 17 名前:名無しさん 投稿日:2000/10/20(金) 04:32
- >16
ありがとうございます。
でも、それでは出来ませんでした。
- 18 名前:ブチ 投稿日:2000/10/20(金) 04:50
- >>17
できないというのは半角英数字以外が $check に入っていても
if の内容が選ばれてしまうってことだよね?if が選ばれないという逆の意味ではなくて。
その時の $check の内容を教えて。
- 19 名前:ブチ 投稿日:2000/10/20(金) 05:13
- ごめん、逆は自分だった。
英数字以外が $check に入ってたら if のエラー表記だね。
それがされてないってことだよね。
- 20 名前:minima 投稿日:2000/10/20(金) 06:54
- >>15
こんなもんでいかがでしょうか。
半角英数字を全部消してみて,まだ何か残っていればエラーとします。
$temp = $check;
$temp =~ s/\w//g;
if ($temp ne ''){
print "Content-type: text/plain\n\nError";
exit;
}
- 21 名前:minima 投稿日:2000/10/20(金) 07:02
- あ,すんまそん。
16 がダメだったということは,20 のもダメのような気がしてきました・・。
- 22 名前:15 投稿日:2000/10/20(金) 07:08
- >>20
頭が固くてそんな発想は思いつきませんでした。。。
この方法だと
$temp =~ s/\.//g;
のようにすれば許容範囲も簡単に広げられますね。
本当にありがとうございました。
- 23 名前:15 投稿日:2000/10/20(金) 07:11
- >>20-21
21の書き込み見ないで書き込みしてしまいました・・・。
でも、実験してみてちゃんとできました。
- 24 名前:Perl仮面 投稿日:2000/10/20(金) 11:07
- ド素人が(--#、とあきれられそうですが、教えて下さい。
Perlスクリプトをコマンドラインから実行する時、
引数の数と内容を求めるにはどうすればいいのでしょうか。
(Cでいうmain()におけるargcとargvです)
「$何とか」という定義済み変数があるのでしょうか...
- 25 名前:RTFM 投稿日:2000/10/20(金) 11:50
- @ARGV
- 26 名前:ブチ 投稿日:2000/10/20(金) 12:09
- Perl だと $ARGV[0] からもう引数なので注意。
- 27 名前:ブチ 投稿日:2000/10/20(金) 12:12
- 補足。
argc に相当するのは $#ARGV 。
- 28 名前:ひろゆさ 投稿日:2000/10/20(金) 12:30
- http://members.tripod.co.jp/hiroyusa/a.txt
2chのlogを落とすツールを作ったんですけど、
更新されてないlogを落としたり、
更新済みlogを落とさなかったりするんです。
どこにバグがあるんでしょう?
他スレで質問したけどあまり反応がないのでよろしく。
- 29 名前:名無しさん 投稿日:2000/10/20(金) 12:42
- >どこにバグがあるんでしょう?
お前のノーミソ
- 30 名前:Perl仮面 投稿日:2000/10/20(金) 13:12
- おぉ、ありがとうございます>RTFMさん、ブチさん
おかげで無事にスクリプトが動きました。
それにしても速く、しかも親切なレスポンス、
本当にここは2chなのでしょうか。
と思ったら(29を見たら)やっぱ2chですね。
- 31 名前:名無しさん 投稿日:2000/10/20(金) 14:01
- RTFM ってのは Read The Fuxx'in Manual のことなのだろうか
- 32 名前:名無しさん 投稿日:2000/10/20(金) 15:10
- VBScriptのFormatNumber()のように、
数値の3桁毎にカンマを入れる関数って
ありますか?
printf()で指定できるのかなとも思ったのですが
やり方がわかりません。涙。
- 33 名前:名無しさん 投稿日:2000/10/20(金) 17:00
- またFuxxin系の質問だ。(藁
- 34 名前:HナインボールH 投稿日:2000/10/20(金) 17:36
- 自分のWinにperlいれたやつでは動くんだけど、サーバーにアップすると動かなくなるのはなぜっすか?
- 35 名前:Tea 投稿日:2000/10/20(金) 17:41
- すみません、本当にしょぼい質問というか的ハズレかもしれないん
ですけど、、
*.pl = *.c
*.cgi = *.exe
こんな感じなんでしょうか、、感覚的に…。
- 36 名前:名無しさん 投稿日:2000/10/20(金) 17:45
- >32
カンマ区切りのための組み込み関数はないので自作する。
このスレの>>1で紹介されてる「Perlメモ」に解答あり。お勧め。
perldoc -q "numbers with comma" にも解答あり。ただし英語だ。
- 37 名前:名無しさん 投稿日:2000/10/20(金) 17:50
- >34
(1) #!/usr/bin/perl 等のパスが違う。
(2) バイナリモードでアップロードしたため改行コードが異なり
結果として(1)の状態になっている。
(3) 使用しているモジュールがサーバにない。
・・・などはありがちですな。
- 38 名前:名無しさん 投稿日:2000/10/20(金) 19:46
- >34
パーミッションってことはないよね・・
あとNIFTYとかみたいにディレクトリ構造が特殊とか・・
- 39 名前:名無しさん 投稿日:2000/10/20(金) 20:38
- >>34
明日のタメに その1 (Perl使いへの道)
http://tako.2ch.net/test/read.cgi?bbs=perl&key=958633101
- 40 名前:12 投稿日:2000/10/20(金) 23:44
- >13さん
変数は、=~ tr/A-Z/a-z/; の順序に依存していました。
/A-Z/a-z/なら小文字に、/a-z/A-Z/は大文字に。TR演算子は
小文字・大文字どちらも受け付けokにするという物だと思ってたのですが
小文字を大文字にしたい場合、大文字を小文字にしたい場合と使い分けるようにします。
>14さん
思った通りの処理が出来ました。ありがとうございます。
正規表現を使うのですね。ちょっとややこしそうなのでじっくり本を
読んでみようと思います。疑問なのですが、文字を扱う場合は
全て正規表現を使った方が良いのでしょうか?Y/Nのたった1文字
を入力するだけなので、入力ミスをしてない場合にも処理がおかしくなる
のが不思議なのですが。でもうまく動かないのだからやっぱり使った方がいいのでしょうね…。
- 41 名前:ブチ 投稿日:2000/10/21(土) 00:13
- >>34
telnet が使えるのなら端末からCGIを実行させて
エラーを見ればある程度原因も想像つくかと。
Perl がそもそも実行されてない場合は改行コードか、perl のパス間違い。
>>35
*.pl と *.cgi はソースと実行ファイルを兼用しているという点では同じです。
ですからあえて書くなら
*.pl = *.cgi = (*.c + *.exe)
かな?無理矢理過ぎるってしばかれそうですけど。
でも本当はそれぞれ微妙に違うのでイコールにはできません。
>>40
この >>12 については改行文字を削るのに chomp($yes_no=<STDIN>); にしてもいいと思います。
<STDIN> からのキー入力は「改行文字が来ると終わり」と判断してその改行も
データに含んでしまってるので削る必要があるんですね。
正規表現はむつかしいことをしているので処理に時間かかります。
上の chomp (=改行削り) のように使わないで済むところまであえて使う必要はないです。
- 42 名前:12 投稿日:2000/10/21(土) 00:20
- >ブチさん
疑問が解けました!!
なるほどー。改行のことをすっかり忘れていました。
丁寧に解説してくださって本当にありがとうございます。
- 43 名前:12 投稿日:2000/10/21(土) 00:27
- 今になって13さんのアドバイスの意味も分かりました。
実際に改行された結果も見てたのに全然気付かなかった。
もっと修行します…。
- 44 名前:名無しさん 投稿日:2000/10/21(土) 02:40
- ずーーとわからなかったのですが、勇気を出して質問します。
シェルで動作確認する時に perl ./hoge.cgi とかしますよね?
で、hoge.cgiにクエリーを渡したときの動作確認はどうやるの
でしょうか?? 一応、 perl ./hoge.cgi?mode=init
とかやってみましたけどダメですね。
- 45 名前:ブチ 投稿日:2000/10/21(土) 03:35
- >>44
cgi-lib.pl などのライブラリを使って入力を受け取っているなら、
perl ./hoge.cgi mode=init opt2=2 opt3=3
の形式がWeb 上で実行する
http://www.hatena.com/cgi-bin/hoge.cgi?mode=init&opt2=2&opt3=3
に相当します。それ以外だとよくわかりません。
まあ perl ./hoge.cgi mode=init でやってみてください。
- 46 名前:名無しさん 投稿日:2000/10/21(土) 05:04
- >44
GETメソッドのCGIなら、環境変数QUERY_STRINGに
引数をそのまま代入しちゃえばオーケー。
csh系: setenv QUERY_STRING 'mode=init&name=hoge'
sh系: export QUERY_STRING='mode=init&name=hoge'
とか設定しといて、perl ./hoge.cgi です。
でもPOSTメソッドの場合はどうするんでしょ。
- 47 名前:名無しさん 投稿日:2000/10/21(土) 05:29
- うーん、簡単なテストの場合なら
スクリプトの中にそのまま書いちゃうのが一番早いかも。
#read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
$buffer='test1=hoge1&test2=hoge2';
他にいい方法あったらきぼーん。
- 48 名前:名無しさん 投稿日:2000/10/21(土) 05:30
- スクリプト内部のクエリ処理部分でバッファに直接クエリ文字列を打ちこんでおく。
嫌な人は嫌でしょう
- 49 名前:名無しさん 投稿日:2000/10/21(土) 05:33
- KENTさんのYYBBSをこの様な上部にタイトル一覧が
出る様にしたいんですけど・何処をどうやってスクリプト
変更したらいいか、教えてください
http://www1.wisnet.ne.jp/~tech/cgi-bin/yybbs/yybbs.cgi
こういう風にしたいです。
- 50 名前:44です 投稿日:2000/10/21(土) 06:42
- 44-48さん深夜にもかかわらず早速ご回答いただき
ありがとうございます。どの方の方法でもOKみたいです。
ずっと悩んでましたので、助かりました。
本当にありがとうございました。
- 51 名前:名無しさん 投稿日:2000/10/21(土) 07:42
- できるだけ、実機と同じWebさばを立てて、そとから
アクセスするのが吉かと。
文字コードとか、エスケープシーケンスのからみもあるし。
>49
これは、HTMLの直埋め込みでいいんでわないかと。
- 52 名前:49 投稿日:2000/10/21(土) 07:57
- 具体的に書くスクリプトを教えて頂けると有り難いです
- 53 名前:ブチ@1 投稿日:2000/10/21(土) 08:09
- 他にすることもあるというのに逃避…。
>>49 の掲示板に近いかと思います。
機能>
yybbs.cgi に索引を付ける。手持ちの 3.51 では問題なく動作。
行番号は KENT-WEB の YY-BOARD v3.51 を解凍した直後のソースのもの。
ソースいじってる人はずれてる可能性あるので各自調整してください。
下のソースの行頭にある番号は見やすくする為なので
コピペする場合は削っておいてください。
もう改造工房の範疇ですね…長いし。逝きます。
============================================================
索引表示部
391 行目に下のソースを挿入。(索引表示部)
------------------------------------------------------------
388:# ページ区切り処理
389:$start = $page + 1;
390:$end = $page + $p_log;
391:
392:# 記事を展開
393:open(IN,"$logfile") || &error("Open Error : $logfile");
394:$top = <IN>;
------------------------------------------------------------
388:# ページ区切り処理
389:$start = $page + 1;
390:$end = $page + $p_log;
print "\n&lt;!--Thred Index--&gt;\n";
print "<TABLE BORDER=1 WIDTH='90%' BGCOLOR=\"$tbl_color\" CELLSPACING=0 CELLPADDING=2><TR><TD>\n";
$i = 0;
open(IN,"$logfile") || &error("Open Error : $logfile");
<IN>;
foreach (<IN>){
($no,$reno,$date,$name,$mail,$sub,
$comment,$url,$host,$pw,$color,$icon) = split(/<>/, $_);
if ($reno eq "") { $i++; }
if ($i < $start) { next; }
if ($i > $end) { next; }
if ($reno ne "") { next; }
print "[<STRONG>$no</STRONG>] <A HREF=\"#$no\">$sub</A> \n";
}
close(IN);
print "</TD></TR></TABLE>\n<BR>\n\n";
392:# 記事を展開
393:open(IN,"$logfile") || &error("Open Error : $logfile");
394:$top = <IN>;
- 54 名前:ブチ@2 投稿日:2000/10/21(土) 08:09
- ============================================================
索引の飛び先
424 行目を消して下のに置き換える(飛び先を番号で指定)
------------------------------------------------------------
420: if ($reno) { print "<hr noshade size=1 width='85%'>\n"; }
421: print "<table border=0 cellpadding=2><tr>\n";
422: if ($reno) { print "<td rowspan=2 width=40><br></td>"; }
423:
424: print "<td valign=top nowrap><font color=\"$sub_color\"><b>$sub</b></font> ";
425:
426: if (!$reno) { print "投稿者:<b>$name</b> <small>投稿日:$date</small> "; }
427: else { print "<b>$name</b> - <small>$date</small> "; }
------------------------------------------------------------
420: if ($reno) { print "<hr noshade size=1 width='85%'>\n"; }
421: print "<table border=0 cellpadding=2><tr>\n";
422: if ($reno) { print "<td rowspan=2 width=40><br></td>"; }
423:
print "<td valign=top nowrap>";
if ($reno eq "") { print "[<STRONG><A NAME=\"$no\">$no</A></STRONG>] "; }
print "<font color=\"$sub_color\"><b>$sub</b></font> ";
425:
426: if (!$reno) { print "投稿者:<b>$name</b> <small>投稿日:$date</small> "; }
427: else { print "<b>$name</b> - <small>$date</small> "; }
------------------------------------------------------------
- 55 名前:49 投稿日:2000/10/21(土) 22:08
- >ブチさんへ
有難う御座います
早速、YY-BOARD v3.51 を解凍した直後のソースを
指定どおりに書き換えましたが、INTERNAL SERVER ERROR 500
となってしまいのす、391 行目下からの変更でエラーに
なるみたいです、解決法をお願いします。
- 56 名前:ブチ 投稿日:2000/10/21(土) 23:12
- >>55
・先頭の番号が削ってない
・ソースではタブの代わりに全角空白「 」にしてあるのでタブに直す。
・ブラウザでは長い文
print "<TABLE BORDER=1 WIDTH='90%' BGCOLOR=\"$tbl_color\" CELLSPACING=0 CELLPADDING=2><TR><TD>\n";
などが勝手に改行されてる可能性があるので直す。
思い当たる原因はこれくらいかな。
もしtelnetで実行できる環境なら perl.yybbs.cgi を実行した時の
エラーメッセージを書いてもらえれば原因特定できるんじゃないかと。
変更でエラーになったというのは1の方ですよね?
- 57 名前:名無しさん 投稿日:2000/10/21(土) 23:53
- >>55
http://www.kent-web.com/support/faq/faq1.html#9
↑これを使ってチェックしてみるとか……。
- 58 名前:49 投稿日:2000/10/22(日) 00:32
- >ぶちさんへ
本当に有難う御座います。
タブに直したら動きました。
お忙しい中、私の要望に答えていただき感謝しています。
ブチさんは何か自作のperl公開やホームページを
お持ちなんですか?
>57さんへ
わざわざ済みませんです。有難う御座います。
- 59 名前:ブチ 投稿日:2000/10/22(日) 00:45
- サイトは持ってますがCGIは公開はしてません。
配布できるようなわかりやすい造りのものじゃないので…。
- 60 名前:ブチ 投稿日:2000/10/22(日) 00:50
- なんか変な表現…えらそうだし。
自分と身内専用で配布用には作ってないということで…。
問題なく動いたようでなによりです。
- 61 名前:名無しさん 投稿日:2000/10/22(日) 01:19
- winでいいエディタ無いですかねぇ?
ど素人なもんで、perlのifとかforとか$〜ってのの
色なんて変わるとわかりやすいんだが。。。
- 62 名前:名無しさん 投稿日:2000/10/22(日) 01:24
- perlediter http://www.k-collect.net/
peggy(シェア) http://www.vector.co.jp/soft/win95/writing/se110764.html?l
terapad http://www.vector.co.jp/soft/win95/writing/se104390.html?l
個人的にはterapadがお勧め。軽いし見やすい。
- 63 名前:61 投稿日:2000/10/22(日) 01:27
- >62さん
おおー、有難うございます。
早速試してみます!!
- 64 名前:Tea 投稿日:2000/10/22(日) 22:03
- ブチさん、ありがとうございました!
頑張って勉強します、、。
- 65 名前:初心者です 投稿日:2000/10/22(日) 22:36
- 初心者です。
ぷちボードをHTML表示にしたいのですが
どうすればいいでしょう。
よろしくおねがいします。
- 66 名前:名無しさん 投稿日:2000/10/22(日) 23:04
- >>65
マルチポストなので無視しよう。
- 67 名前:名無しさん 投稿日:2000/10/22(日) 23:16
- 裏ニュース(http://www.uranews.com)の転送サービスをうちでも
やってみたいと思ってます。
CGIはずぶの素人なので自作するのはちょっと無理がありますが、
なんとか無料で教えて頂けないでしょうか。
- 68 名前:>67 投稿日:2000/10/22(日) 23:32
- 金が無いなら知恵を出せ、知恵が無いなら汗をかけ。
金も知恵もない君は、裏ニュースに平身低頭聞くべし。
- 69 名前:名無しさん 投稿日:2000/10/23(月) 00:17
- ハッシュからランダムな要素を取り出す、効率の良い方法はありますか?
@key = keys %hash;
$random = $hash{$key[int rand @key]};
こんなのしか思い浮かばなくて…。
- 70 名前:あっくん 投稿日:2000/10/23(月) 01:00
- >>67 bind 使え(いいかげん) http://www.isc.org/products/BIND/
- 71 名前:japu 投稿日:2000/10/23(月) 06:51
- >>69
%majokko = (creamy => "mami", magical => "emi", pastel => "yumi");
$moe = (values %majokko)[int rand values %majokko];
だと、萌えますか?
一度だけ行うのであれば、一時変数を使わないこの方法が速いと思う。
複数回の場合 @values = values %majokko; として配列に代入しておいて、$moe = $values[int rand @values]; とするのが速いはず。
- 72 名前:名無しさん 投稿日:2000/10/23(月) 07:00
- どうしてperlスクリプトには「¥」がいっぱい書いてあるんですか?
- 73 名前:名無しさん 投稿日:2000/10/23(月) 07:07
- クッキーについてなんですが
hoge = foo;
というものを以前に記憶させているとして
1.このkeyとvalueの両方を削除する方法
2.keyはそのままでvalueのみを書き替える方法
を教えてください。
- 74 名前: 投稿日:2000/10/23(月) 10:30
- >>72
『「¥」がいっぱい』なのは初心者な証拠。
qq(value="hoge") 使えば読みやすく、効率が上がる
- 75 名前:名無しさん 投稿日:2000/10/23(月) 12:28
- CGIを設置したカレントディレクトリにある
ファイルとフォルダを判別するにはどうしたよいですか?
- 76 名前:japu 投稿日:2000/10/23(月) 13:24
- 73:
1. hoge=; として expires に過去の日付を指定
2. hoge=bar; として送出
では?
----
75:
if(-f $file) {
&nbsp;&nbsp;&nbsp;&nbsp;print "$file is a regular file.\n";
} elsif(-d $file) {
&nbsp;&nbsp;&nbsp;&nbsp;print "$file is a directory.\n";
} else {
&nbsp;&nbsp;&nbsp;&nbsp;print "others\n";
}
では? -X 演算子の項目を参照。
- 77 名前:69>71 投稿日:2000/10/23(月) 23:19
- ありがとうです。やっぱり配列を使うしかないんですね。
まあ、あんまり大きくないからいいか…。
- 78 名前:名無しさん 投稿日:2000/10/24(火) 05:55
- >>74
それってなんですか?
- 79 名前:名無ιさん 投稿日:2000/10/24(火) 06:39
- >>78
例えば、CGIで
<BODY TEXT="black" BGCOLOR="#CCCCCC" link="#0000FF" vlink="#660099" background="../ba.gif">
みたいなHTMLを吐き出させようとする場合。
この時、
print "<BODY TEXT=\"black\" BGCOLOR=\"#CCCCCC\" link=\"#0000FF\" vlink=\"#660099\" background=\"../ba.gif\">";
みたいな書き方だと『「¥」がいっぱい』なスクリプトになる。
そこで、
print qq(<BODY TEXT="black" BGCOLOR="#CCCCCC" link="#0000FF" vlink="#660099" background="../ba.gif">);
みたいにすれば読みやすくなる、と。
- 80 名前:名無しさん 投稿日:2000/10/24(火) 07:55
- >>79
どんな時に\を書くのですか?
”の前後以外には、どういうところに書きますか?
なんかいっぱい見かけるんですけど・・・
- 81 名前:名無しさん 投稿日:2000/10/24(火) 08:38
- なんか変な癖に見えるぞ。
シングルクオートの方がいいんじゃないか >>79
- 82 名前:>81 投稿日:2000/10/24(火) 10:18
- 同感。
変数がないのにダブルクオート相当のものを使うのも、初心者な証拠(笑
- 83 名前:名無しさん 投稿日:2000/10/24(火) 10:48
- 実際には変数あるんじゃないの
おいらもいつも qqつかってます
あとはひあどきゅめんと
- 84 名前:名無しさん 投稿日:2000/10/24(火) 14:36
- フォームから送られてきた半角カナを全角カナに変換したいのですが
jcode.plを使って
&jcode::convert(*kana, "sjis", "z");
とかやってもうまくいきまへん。どないしたらエエんでしょうか?
- 85 名前:名無しさん 投稿日:2000/10/24(火) 14:44
- SOCKETモジュール使って
タイムアウト値の設定はどうすればいいですか?
- 86 名前:>84 投稿日:2000/10/24(火) 14:48
- &jcode'h2z_xxx(*line)
JIS X0201 KANA (so-called Hankaku-KANA) to X0208 KANA
(Zenkaku-KANA) code conversion routine. String xxx is
any of "jis", "sjis" and "euc". From the difficulty
of recognizing code set from 1-byte KATAKANA string,
automatic code recognition is not supported.
- 87 名前:81 投稿日:2000/10/24(火) 15:17
- 俺はシングルクオートと、ヒアドキュメントしか使わない。
qqは実は79で始めて知ったが、さほど優れた書式とも思えない。
ちなみにヒアドキュメント中の変数は{}で囲みまくってる。
- 88 名前:84>86 投稿日:2000/10/24(火) 15:27
- つまり変換前のコードがjis, sjis, eucのどれであるかを
あらかじめ把握しておかなければならないんすね。
フォームから送られてきたばかりの半角カナって、
%記号のあとに16進コードが続いているから
$name =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
で%記号を取って、16進バイナリに変換して
&jcode'convert(*name, "jis");
とやってるから、この後に
&jcode'h2z_jis(*line);
を追加してみることにするです。
ありやとやんした > 86
- 89 名前:名無しさん 投稿日:2000/10/24(火) 16:23
- >85
ていうと、use IO::Socket で楽チンしようとせずに、
use Socketでガリガリ書きたいと? 漢ですな。
やっぱconnectの直後にalarmを仕掛け、一定時間が
経過したらソケットを強制的にクローズするのかな。
use Socket;
(中略)
connect(SOCK, $sockaddr_in);
$timeout_flag = 0;
$SIG{'ALRM'} = sub{ close(SOCK); $timeout_flag=1; };
alarm(60); # 60秒でタイムアウト
while (<SOCK>) {
(作業)
}
if ($timeout_flag) {print "タイムアウトで失敗";}
else {print "正常終了";}
- 90 名前:名無しさん 投稿日:2000/10/24(火) 16:34
- まじかよ。(じゃねーな)
しかし初心者までソケットゴリゴリのスクリプト
書くのはなんでかね。
おれなんか使ったことねえよ。
# あ、初心者か(藁
- 91 名前:名無しさん 投稿日:2000/10/25(水) 00:31
- useした後にrequireするとエラーになってしまいます。
requireを絶対パスで指定すれば回避出来ますが、
複数のファイルをrequireする時に面倒です。
もっと効率的に回避するというか、他の回避法はないでしょうか。
- 92 名前:名無しさん 投稿日:2000/10/25(水) 01:06
- フォームに入力された郵便番号が架空のものかどうかを
チェックしたいのですが、なにか手軽で良い方法はないもの
でしょうか?郵政省関連のページから郵便番号データはダウンロード
してきましたが、これがまた巨大なサイズで約16Mbytes、途方に
暮れております。
- 93 名前:名無しさん 投稿日:2000/10/25(水) 01:29
- 結局どの文字の前(後)で『¥』使うんだろう・・・
使うな派が大多数か・・・
でも、配布されてるCGIって、¥がいっぱいな気がする・・・。
- 94 名前:名無しさん 投稿日:2000/10/25(水) 01:36
- >>92
その郵便番号で郵便を出してみる
届いたら有効な番号、というのはどう?
というのは置いといて、16MBつーのは地域名も入ってるんでしょ?
番号だけのファイルにするとかDBMに入れるとか、ツリーを構築して
そのままバイナリでファイルにしておくとかすればいいんじゃない?
- 95 名前:81 投稿日:2000/10/25(水) 02:19
- 不親切君です。
>>93
それはPerl初級者の作ったスクリプトだから。
>>94
DBMに入れる案は俺も賛成。
住所をvalueにすれば、住所の入力が省けるかも知れなくてラッキー
- 96 名前:名無しさん 投稿日:2000/10/25(水) 02:20
- >>92
要SQLか?
- 97 名前:92>94..96 投稿日:2000/10/25(水) 03:07
- 16Mbytesつーのは地域名とか、その読み仮名もはいってました。
おっしゃるとおり、郵便番号と地域名だけ抜き出せばもっと小サイズ
になるです。
PostgreSQLの本を買ってきてヘロヘロ読んでる最中です。
PHPとかいう言語(なのかな?)も覚える必要がありそうで
ドキュソな僕に前途は多難であります。(mySQLつーのもあるのね)
番号と住所だけならDBMだけでもイケるんかなあ。
「CGIのための実践入門Perl」著:アーク・シンク・タンク 三島俊司
を参考にしてるんだけど、これによると「1Kから4Kバイト程度の小規模
で単純なデータベースを管理するライブラリ云々」とあって、ちょっと
サイズが・・・(いや、一番足りないのは自分のオツムと
重々わかっております)
郵便番号が7桁、フルに入力されてなくても住所データから
補完できるようにすれば、エンドユーザには親切かなぁと
その逆に7桁ちゃんと入力されてれば、ある程度住所は確定できるし
などと漠然と考えてる段階です。
- 98 名前:名無しさん 投稿日:2000/10/25(水) 05:14
- それだったらRDBMSだろうなあ。。
- 99 名前:名無しさん 投稿日:2000/10/25(水) 15:54
- CGIで将棋かオセロやろうと思ってんだけどどうよ。
- 100 名前:名無しさん 投稿日:2000/10/25(水) 16:30
- コンピュータの先読み部分が時間がかかる上に
CGI だと普通毎回読み込む必要があるのでJAVAの方がストレスが少ないかも。
- 101 名前:名無しさん 投稿日:2000/10/25(水) 17:53
- HTTP_REFERERってCGIのみで取得するのは無理なんですか?
SSIもJavascriptも使えません。
- 102 名前:名無しさん 投稿日:2000/10/25(水) 18:15
- >101
アホ発見!
- 103 名前:名無しさん 投稿日:2000/10/25(水) 18:16
- パールなら $ENV{HTTP_REFERER} です。
- 104 名前:名無しさん 投稿日:2000/10/25(水) 18:41
- パールなら $cgi->referer です。
- 105 名前:名無しさん 投稿日:2000/10/25(水) 21:31
- javascriptの
escape("文字")
に値することをperlで出来ませんか?
↓みたいにやってみたんですが、出来ませんでした。
$aaa = "文字";
$aaa =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
よろしくお願いします。
- 106 名前:>99 投稿日:2000/10/25(水) 21:43
- オレもJavaでやった方が楽だと思うが、もしかして対象がi-modeだと
するとそれもできん。しかしi-modeの入力ってストレスたまり
まくりですじゃ。
- 107 名前:名無しさん 投稿日:2000/10/25(水) 22:28
- >>105
できましたけど?どういう状況でできなかったんでしょか。
ソース:
$aaa = "文字";
$aaa =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
print $aaa;
結果:
%95%B6%8E%9A
- 108 名前:105 投稿日:2000/10/25(水) 22:34
- >>107
javascriptで
document.write( escape("文字") ) ;
結果:
%u6587%u5B57
になります。
これをperlでしたいのですが、無理ですか?
- 109 名前:107 投稿日:2000/10/25(水) 22:41
- それunicode…。
スクリプトが間違ってるんじゃなくて入れてる文字コードが違うの…。
- 110 名前:105 投稿日:2000/10/25(水) 22:52
- >>107
じゃあどうしたらいいですか?
javascriptで、
%95%B6%8E%9A
を、
文字
に変換することは出来ないですか?
unescape("%95%B6%8E%9A");
では出来ませんでした。
よろしくお願いします。
- 111 名前:105 投稿日:2000/10/25(水) 23:00
- または、
perlで、"文字"を、"%u6587%u5B57"にすることは出来ませんか?
- 112 名前:105 投稿日:2000/10/25(水) 23:16
- 少し分かりました。
IE5じぁ、unescape("%95%B6%8E%9A");
すると、文字化けしますが、
ネスケでは、ちゃんと表示されます。
これは、IEが原因?(謎)
- 113 名前:名無しさん 投稿日:2000/10/25(水) 23:37
- HP関係をこれから勉強しようと思うんですが
cgi、HTML、JavaScript等はどういう順で勉強していけばいいでしょうか?
- 114 名前:名無しさん 投稿日:2000/10/26(木) 00:10
- >113
全く経験ないんだよね?
そしたら、普通にサイトを作るとしたら、当然最初はHTML。
で、多分、カウンタやらアクセス解析、掲示板の必要に迫られて、
cgi(自作じゃなくても他人のを触ってるうちに基本は勉強せざるを
えないと思う)。その後は必要に応じてJavaScript勉強しても
いいし、cgiを深く勉強してもいいと思う。
というか、ごちゃごちゃ考えないでとにかくサイト作れば?
とにかくHMTL書けなければ話が始まらない。
- 115 名前:名無しさん 投稿日:2000/10/26(木) 01:08
- >>114
わかりました。ありがとうございます。
サイトを創る気は無いんですが、教養として覚えたいんです。
そういう場合は何を目標にしたらいいでしょうか?
参考までに教えていただけるとうれしいです。
- 116 名前:名無しさん 投稿日:2000/10/26(木) 01:30
- 御託はいいからそういうときはとりあえず index.html を書けよ
- 117 名前:>115 投稿日:2000/10/26(木) 01:44
- >そういう場合は何を目標にしたらいいでしょうか?
KENT
- 118 名前:むぎ茶 投稿日:2000/10/26(木) 02:30
-
目標ぐらい自分で決められない奴は障害者だね。
- 119 名前:107 投稿日:2000/10/26(木) 03:44
- >>112
IE4以降では uncode にしてしまうようだ。おかしなことを…
%uXXXX は uncode の印だから内部で判定して Jperl.pm で unicode と他のコードとの変換、
それをエスケープ…できると思うんだけどどうなんだろう。その辺は詳しくない。スマソ
どっちにしろ目的によって unucode まで意識しなくていいんじゃないかな。
CGIとJavaScriptを連携させる(JavaScriptの出力をCGIに送るとか)なら
上のような面倒なことをしないといけないだろうけど暗号化も復号化もCGIでやるなら最初ので問題ないかと。
JavaScript でunicodeにエスケープされた Cookie を受け取る場合はややこしそうだ。
- 120 名前:107 投稿日:2000/10/26(木) 03:45
- uncodeじゃなくてunicode だった…。
- 121 名前:名無しさん 投稿日:2000/10/26(木) 04:51
- うんこーどage
- 122 名前:名無しさん 投稿日:2000/10/26(木) 07:04
- 自分で定義した関数を呼び出すときに & を付けたときと
付けないときの違いを教えて下さい。
いつもつけるものだと漠然と思っていたのですが
つけなくても動きますよね(?_?)
- 123 名前:>122 投稿日:2000/10/26(木) 10:30
- サブルーチンが定義済なら同じだね。
でも&を省略すると読みにくくならない?
- 124 名前:名無しさん 投稿日:2000/10/26(木) 10:51
- >111
119が言ってるようにJcode.pmを利用すれば
Unicodeでescapeする関数が作れるはずだと思って書いてみたら、
すげーごちゃごちゃになってしまったよ。
ソース:
use Jcode;
sub escape {
my $j = new Jcode;
join "", map {
/[\x80-\xFF]/ ? "%u".unpack("H4", $j->set(\$_)->ucs2) : $_
} split /([\x80-\xFF]{2})/, $j->set(shift, "sjis")->euc;
}
$a = &escape("文字");
print $a;
結果:
%u6587%u5b57
- 125 名前:名無しさん 投稿日:2000/10/26(木) 15:50
- >>122 あーほんとだ
初めてきがついた
定義済みならってのはどういう意味なんすか?>>123
知らないことがざくざくでてくる…鬱だ…
- 126 名前:105 投稿日:2000/10/26(木) 17:49
- 皆さんいろいろありがとうございます。。
>>119
まさに、私は、クッキーの処理で悩んでました。。escapeしないとネスケで文字化けするし、
したら、IEで化けるし・・ブラウザが複数あるのがいけないんですよね。
いっそのことみんなひとつに統一して欲しいですね。。。
そしたらどれだけ楽になるか…
ブラウザの問題と分かりましたので、ブラウザ別に処理を分けることにします。
皆さんありがとうございましたm(__)m
- 127 名前: