【Perl】 初心者コーナー

このエントリーをはてなブックマークに追加
1名無しさん
とにかく、初めて来た方、初心者は、このスレッドから
始めよう。。。

いらっしや〜〜〜い。(三日以内には、レス付くと思うよ、誰かから)
過去ログ全部とは言わないが、このスレッド一回は、全部読んでから書きこんでネ。
2Perl見習い:2000/05/02(火) 07:48
Perlの板ができたことを契機にこれからPerlを独学してみようかと思います。
3CGI童貞:2000/05/02(火) 16:46
先日意を決してCGIというものに手をだしてみました。
レスキューとかKENTWEBとかをたよりに何とかアップすることに成功し、
勿論出来合いのものですが、とりあえずアクセス解析のプログラム
をつけてみようと試みました。
パーミッションの設定もしっかりやり、.htaccessも何とかうまくいき
いざ、起動してみたころどうにかうまくいったみたいです。
ただ、しかし時刻の設定が、海外のサーバーだけに日本の時間になっていないのが
難点で、この修正方法がどこかに載っていたのは見たことがあったのですが、
どうしても現時点で自力で解決出来ないのです。
全部でなくていいので、ここを見れば書いてあるぜとか、ここをこうしてみろ
っていう有り難いご意見を伺えれば幸いです。どうか宜しくお願いします。
ちなみに使ったプログラムは、http://www.rescue.ne.jp/cgi-rescue/cgi?analyzeの
ログアナライザというやつです。
43:2000/05/02(火) 18:52
ホームページ板のほうで教えてくださった人がいて解決できました。
お騒がせしました。
5Cも初心者だけど:2000/05/16(火) 23:27
Cと違ってPerl独特の表現?がわかりにくいです。
他人のスクリプト読むのが難しいです。
慣れですか?Cと一番違う表現って何なんでしょう?
6ぴょん基地:2000/05/17(水) 16:32
正規表現
7名無しさん:2000/05/18(木) 06:24
文字列の比較
8名無しさん:2000/05/18(木) 07:02
Perl初心者が参考にできる(初心者でも読みやすい)
スクリプト置いてある所教えてください。
9ひっぱりあげ:2000/06/19(月) 17:07
ちょっと新しいスレはなんなので・・・
.$a. って表記の「.」ってなんの意味があるのですか
誰か暇な人教えて〜
10名無しさん:2000/06/19(月) 17:23
文字列連結演算子。左辺と右辺の文字列を連結する。
$a = "omae";
$b = "mona-";
$c = $a . $b;
print $c; # omaemona- と出力される。
まあ、この例なら
print "omae"@` "mona-";
の方が自然だが。
11名無しさん:2000/06/19(月) 18:42
Perlマニアは逆にC風の書き方を嫌う・・・
129:2000/06/19(月) 19:17
"action=normal&hoge1=.$hoge1.&hoge2=.$hoge2.&hoge3=.$hoge3"
ってのがあったから聞いたんですけど
これで$hoge3の後ろとnormalの前後にはつかない
ってのがよく分かりました。ありがとうございます
ところで$c = $a $b;って書くのはダメなの??
んーーー???
139:2000/06/19(月) 19:18
あ、だめやん
printと勘違い
さげー
14名無しさん:2000/06/19(月) 20:55
まったくの初心者(Cも知らない)でも分かる本ないですか?
初心者向けっていっても本当の初心者には分からない事ばかりです。
15改造くん:2000/06/19(月) 23:21
「Perlで作るCGI入門」はどう?
http://www.hyuki.com/
16名無しさん:2000/06/20(火) 17:16
print と echo のの違いがいまいちわかりません。
17名無しさん:2000/06/20(火) 17:31
Perl に echo はありませんが。
18名無しさん:2000/06/20(火) 18:19
「?0秒たったよー」ってなのを
一定時間ごとに出させようとおもい、
----time.pl
#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $time(10@`20@`30@`40@`50){
print<<"EOF";
<html><head><title>時間</title></head>
<body>
$time秒たったよー
</body></html>
EOF
sleep(10);}
exit;
--------
これでは全然うまくいきませんでした
ある段階で一度全部出力させてってのは
どう書けば良いのですか?
あと、特に時間に正確にこだわるわけでは
ないです
19:2000/06/20(火) 20:45
CGIとJavaアプレット間でデータの送受をしたいのですが、
やり方がわからず悩んでいます。
わかる方よろしくおねがいします
http://saki.2ch.net/test/read.cgi?bbs=prog&key=961501426&ls=50
20:2000/06/20(火) 20:46
>18
違ってたらごめんなさい
$|=1; を指定するとか?
あと、</body></html>で閉じちゃうとだめのような気が
21名無しさん:2000/06/20(火) 21:11
>18
そういうのは良くない、というのはさておき、CGIにやらせるのは無理です。
1回のりクエストに対して1つの返答を表示して終了、という機構なので。

おとなしく JavaScript を使うか(サーバと、接続時間を考えるとこれが一番妥当)、
出力される html に
<meta http-equiv="Refresh" content="10;url=(CGIのURL)">
を入れるか、でしょうね。

アプレットでもできるかもしりませんが私は経験ないので知らず…。
22名無しさん:2000/06/20(火) 21:34
>18
できるよ。普通やんないけど。

$| = 1;
$uniq = "((($$ 他と重複しない文字列 $^T)))";
print "Content-Type: multipart/mixed; boundary=$uniq\n\n";
foreach $time(10@`20@`30@`40@`50) {
print "--$uniq\n";
print "Content-type: text/html\n\n";
print "<html><head><title>時間</title></head><body>\n";
print "$time秒たったよー\n";
print "</body></html>\n";
sleep(10);
}
print "--$uniq--\n";
2318:2000/06/20(火) 22:33
>20、21、22
さんくすー
$| = 1; これ初めてみました
調べてみます
24名無しさん:2000/06/21(水) 04:33
sleep(10); で何回も回したら http のリクエストで
ブラウザがタイムアウトにならないんですか?
25名無しさん:2000/07/01(土) 01:11
age
26お悩み相談者:2000/07/01(土) 01:55
SQLでDBからレコードを抽出します。
「ID@`時間@`その他情報」を時間(昇順)で取ってきます。
----------------------
ID00@`01:00@`情報A@`情報B
ID11@`02:00@`情報C@`情報D
ID33@`02:00@`情報E@`情報F
----------------------
その中で、一番古い時間(01:00@`02:00...とかだったら01:00)のレコードを出力したいです。
もちろん、抽出されるIDも時間も情報は、毎回違います。
僕は、どうしたらイイでしょうか?
27名無しさん:2000/07/01(土) 03:10
抽出データって配列なんかにセットしてるんじゃないの?
もういっかいsqlなげたら?
select * from table_name order by time desc;
とか
28japu:2000/07/01(土) 03:18
SELECT *
FROM moe m
WHERE m.foo < ALL (SELECT foo FROM moe n WHERE m.foo <> n.foo);

SQL はあまり得意ではないので、もっと良い方法があるのかもしれないけど。
(foo = 時刻情報)
29お悩み相談者:2000/07/01(土) 04:08
最初にDBからガポっと必要な情報を取ってきます。
3つのテーブルから取って、WHERE条件を5つぐらい並べて、時間と他1つフィールドを昇順で並べてる。
更に、そこからフラグを見て、情報を2つに割ってます。で、更に古い時間のレコードのみ出力。
現時点でのソースは↓こんな感じです。(SQL文は長いので省略)

$dbh = DBI->connect ($dbname@` $dbuser@` $dbpass@` $dbd);
$cur = $dbh->prepare($SQL);
$cur->execute();
 die "Prepare error: $DBI::err .... $DBI::errstr" if $DBI::err;
while (($ID@` $TIME@` $DATA@` $Flag) = $cur->fetchrow) {
 if ($Flag == 0) {
  print "$ID@` $TIME@` $DATA";
 }
 elsif ($Flag == 1) {
  print "$ID@` $TIME@` $DATA";
 }
}
$cur->finish();
30お悩み相談者:2000/07/01(土) 04:14
言い忘れました。1つの情報を2つに割ることで、1番古い時間のレコードは
2行になります。従って、この2行のみを出力しなくてはなりません。
場合によっては、3行になるかもしれないし、4行になるかもしれません。
31名無しさん:2000/07/02(日) 04:19
ちょっと聞きたいんですが、
正規表現で、oオプションするとパターン展開が
一回しか行われなくなり高速になりますが、
その際、mod_perlだと動作がおかしくなります。
(前のパターンが残る)
たぶん、展開したパターンの結果がなんかの
特殊グローバル($^Tとか)に保持されてると思うんですけど、
どうやって初期化するべきでしょう?
32>26:2000/07/02(日) 07:24
つうか SQL をみんな知らんのか?。Perl より全然簡単だぞ。手続きじゃなくて
集合演算だから勝手が違うだけで。

で、SQL サーバーには何を使っている?> 26
実装にもよるが、あるテーブル中にある全データの中から、タイムスタンプが
一番古いレコードを選択するだけなら、

SELECT id@` time@` data FROM your_table WHERE time =
(SELECT MIN(time) FROM your_table);

で OK だろ?。sub select(括弧 () の中にクエリーを書いて、抽出された
レコードをクエリーの対象や条件として用いること)が実装されてないなら、
$dbh = DBI->connect ($dbname@` $dbuser@` $dbpass@` $dbd);
$cur = $dbh->prepare("SELECT MIN(time) FROM your_table");
$cur->execute();
$mintime = $cur->fetchrow;
$cur2 = $dbh->prepare("SELECT id@`time@`date FROM your_table WHERE time = ?");
$cur2 = execute($mintime);
という風に、2回に分けてクエリーを実行せよ。
# perl 初心者なんで上のコードが間違っていたらごめんな。

データはデリミタで区切ってあるんだろ?。こんな風に "data1@`data2@`date3..."
だったら split 使えばいいじゃん。
3331:2000/07/03(月) 14:42
あげとくよ?
3431:2000/07/04(火) 16:13
まだ?
3531:2000/07/04(火) 20:05
早く答えろや!!こらぁ!!
もうさげ。
つーか、この板もう駄目だ。
36お悩み相談者:2000/07/05(水) 03:03
おかげさまで、できました。
最初に時間を取ってきて、それを条件にして情報を取りました。
SQLを2回投げればヨカッタのですね。
37名無しさん:2000/07/05(水) 03:50
>31
質問するときは自分でスレッドを立てて質問しなさい。そうしないと
この板が寂れます。スレッドを立てると活気付きます。
そもそもこんなスレッドに書き込んでも質問しているかどうか他の
人には気づきにくいので無視されても文句は言えません。

-----------------------完------------------------
38名無しさん:2000/07/05(水) 09:54
人がたくさんいるページだと無闇にスレッド立てると怒られるけどね。
ここは人がいないから少しぐらい立てすぎる方がいいのかな?
39>35(=31):2000/07/05(水) 12:48
ダメなのはあなたの頭である事が無事判明致しました
40名無しさん:2000/07/05(水) 15:53
SQL ってなに?
うんこ?
41初心者です。。:2000/07/05(水) 17:06
>40
尊敬します。
そういうの。
42名無しさん:2000/07/08(土) 17:04
この内容で初心者ですか・・・僕の先が思いやられます。
ちなみに、みなさんはシンプルな掲示板のスクリプトを理解するのにどのくらい
かかるのでしょうか。宜しければお聞かせ下さい。
43>42:2000/07/09(日) 00:33
すぐ
44>42:2000/07/09(日) 00:52
スクリプトの美しさに因る
4542:2000/07/09(日) 01:06
>43
すぐとおっしゃいますと、どのくらいでしょうか。
因みに僕の場合Perlの本を読み始めて1週間になるのですが、簡単なスクリプトでもちんぷんかんぷんです。
やはり、これでは遅過ぎるでしょうか。まだ本を読み終わってないせいもあるのですが。
>43
例えばYY-BOARDのスクリプトを理解するのにどのくらいかかりましたでしょうか。


それから、「かかるのでしょうか」ではなく「かかったのでしょうか」の方が適切でした。
すみません。つまり、超初心者の時といいますか・・・。

4643:2000/07/09(日) 01:36
解説書に載ってるようなモンなら、解説読みながらあそんでたら
自然と理解できたもんだが・・・・。

YY-BOARDはソース見たこと無いです。

個人差ですから、諦めずがんばりましょう。
47初心者:2000/07/13(木) 07:28
はじめまして。
サーバにおいてあるテキストファイルを、一行一行printで表示
させると、「鉄鋼」という字が「鉄香e」みたいに化けてしまいます。
文字コードの関係かと思い、jcode.plをインクルード(でいいですか?)
させて、sjis2eucで保存、euc2sjisで展開させて、printで表示させても
結果は同じでした。結局、printの時にシフトJISを表示させてはいけない
ようなんですが・・・これをなんとか回避する方法はありませんでしょうか。
任意に\を入れて直す、という方法はとれないので(テキストの中身が
常に変わるため)、御教授宜しくお願い致します。
48>47:2000/07/13(木) 07:35
jperl を使う
49名無しさん:2000/07/13(木) 07:44
途中で変な処理かましてるんじゃないの?
ふつうにファイル読んでメタ文字解釈されることはないと思うけど?
50初心者:2000/07/13(木) 08:22
>48&49
 お答えくださりありがとうございます。
 jperlはインクルードファイル(?)ですか?
 49さん、特に変な処理はしていないと思うんですが、perlは
 全然自信がないので、ひょっとしたらしているかもしれません。
 今手元にソースがないので、後で書かせていただきます。
51名無しさん:2000/07/13(木) 08:30
>50
> jperlはインクルードファイル(?)ですか?
いや、言うなれば「perl日本語版」みたいなものです。
52初心者:2000/07/13(木) 11:37
ソースは下のような感じです。


open(REC@`">>$id");
print REC "「鉄鋼」の字が化けるテスト\n";
print REC "なんで化けるのぉ?!\n";
close(REC);

open(HTML@`"$exhtml");
@lines = <HTML>;
close(HTML);


print 'Content-type: text/html; charset=Shift-jis \n\n';

foreach $line (@lines)
{
$line =~ s/[\r|\n|\r\n]//g;
print $line;
print "\r\n";
}

質問ばかりで大変恐縮ですが、どうか宜しくお願い致します。


>51
 なるほど、日本語版Perlというものがあるのですね。
 残念ながら、レンタルサーバに依存してしまうので、こちらでは
 選択肢がないのです。情報ありがとうございました。
53初心者:2000/07/13(木) 11:38
げっ、ソース間違えてました(^^;;;
こちらです。

open(REC@`">test.txt");
print REC "「鉄鋼」の字が化けるテスト\n";
print REC "なんで化けるのぉ?!\n";
close(REC);

open(HTML@`"test.txt");
@lines = <HTML>;
close(HTML);


print 'Content-type: text/html; charset=Shift-jis \n\n';

foreach $line (@lines)
{
$line =~ s/[\r|\n|\r\n]//g;
print $line;
print "\r\n";
}
54初心者:2000/07/13(木) 11:39
たびたびすいません・・・あれれ?
ええっと、オープンさせてるところがバケちゃってますね(^^;;
@lines = <HTML>
です。

スレ汚してすいません・・・
55japu:2000/07/13(木) 11:57
まず、根本的な間違いから。

> print 'Content-type: text/html; charset=Shift-jis \n\n';

1. '...' (または q/.../) では「\\¥、「\'」以外の処理は行われないので改
行が出力されません。(変数展開も行われない。)

2. Shift-jis は不正な指定です。Shift_JIS が正しい。(ハイフンではなくて、
アンダーバー) なお、7ビットJISはISO-2022-JP、日本語EUCはEUC-JPとなる。

3. 文字化けの理由は分からないけど不正な文字セットを指定しているので、ブ
ラウザが発狂している、に3000点。

----
次に改善した法が良い点を。

> @lines = <HTML>;

とするのは非効率です。
while(<HTML>) {
...;
}
としましょう。(今回の場合はほとんど違いは出ませんが。)
56初心者:2000/07/13(木) 12:50
ご丁寧な指摘をしていただき、本当にありがとうございます!
早速試してみましたが・・・ブラウザベースだとうまくいきました。
が、VBのopenURLで取得すると、やはり文字化けしてしまいました。

結果はこんな感じです。

【元のテキスト】
硬めの鉄鋼テスト。鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄鋼鉄

【CGIを通して呼び出したテキスト】
硬めの鉄鴻eスト。鉄酷S酷S酷S酷S酷S酷S酷S酷S酷S酷S酷S酷S酷S・


「てっこう」と読めなくないですが、これでは「テスト」が「スト」
になってしまいますので・・・しかも、鉄鋼を繰り返すと、鉄のあとに
「酷S」という怪しい文章に・・・
もうどうしたらよいものか・・・それこそ酷な状況です。
何度もすいません。どうか宜しくお願い致します。
57japu:2000/07/13(木) 16:03
それは単にVBで作ったプログラム(?)が悪いのでは?
58名無しさん:2000/07/13(木) 18:13
$line =~ s/[\r|\n|\r\n]//g;

$line =~ s/\r|\n|\r\n//g;
59名無しさん:2000/07/13(木) 20:48
print REC "「鉄鋼」の字が化けるテスト\n";
print REC "なんで化けるのぉ?!\n";

print REC '「鉄鋼」の字が化けるテスト'@`"\n";
print REC 'なんで化けるのぉ?!'@`"\n";
を試してみて♪
60初心者:2000/07/13(木) 21:06
>57、58、59

 レスありがとうございます!
 VBのプログラムが悪いのかと思い、改めてブラウザからCGIを
 呼び出してみたところ・・・化けてしまいました。
 記録してあるファイル自体が悪いのかもしれないと思ってチェック
 してみたら、そちらは大丈夫でした。
 改行コードの除去は[]がいらないのですね。ありがとうございます。
 59さん、早速いまから試してみます!

 2ちゃんねるの他の板やスレでは、こんなに親切にしてもらったこと
 ないだけに、感激ひとしおです。本当に嬉しいなぁ。
61初心者:2000/07/13(木) 21:53
その後・・・お陰さまで解決しました!
なんと、原因は改行コードの取り除きかたにありました。

$line =~ s/\r|\n|\r\n//g; を、
$line =~ s/\n//g; に変えたら治ってしまいました(^^;;

うーん、でもどうして、 CR LF CR+LF の全部を取り除くって
やると化けるのか未だに不思議です。
S-JISにこれらのコードが重複しているのでしょうか?!
(そんなはずないですよねぇ??)
しかし、昨日からずっと悩んでいただけに、解決して本当にホッと
しています。
皆様、ありがとうございました!(^O^)
62japu:2000/07/13(木) 22:32
あ、見逃していた。正規表現中で s/[\r|\n|\r\n]//g; としたら、CR@` LF@` 「|」を削除しちゃうからなぁ。(文字クラスの内部ではほとんどの文字はメタ性を失う) てなわけで、tr/\r\n//d; としましょう。

(蛇足)
"「鉄鋼」の字が化けるテスト" は Shift_JIS では
0000000 201 u 223 S 215 | 201 v 202 314 216 232 202 252 211 273
0000020 202 257 202 351 203 e 203 X 203 g
で、「|」を含んでいるので。
63名無しさん:2000/07/13(木) 22:36
リロードするのが面倒で、スレッドに新しい書きこみがあったら
表示するのを作っているのですが、perlの作法がいまいち判りません。
下のような書き方でいいのでしょうか?

$server='mentai.2ch.net';
$board='mona';
$thread='960867157';

$cpath='/home/yamasaks/2ch_cnt';
$cntfile="${board}-${thread}.cnt";
$logfile="${board}-${thread}.log";
$waitcnt=120;

$wget_addr="'http\:\/\/${server}\/test\/read.cgi\?bbs\=${board}\&key\=${thread}\&ls\=2'";
$wget_file="read.cgi\?bbs\=${board}\&key\=${thread}\&ls\=2";

while(True){
print "check!\n";
$|=1;
`wget --output-file=wget.log ${wget_addr}`;
rename($wget_file@`$logfile);

open(INFILE@`$logfile) || die "log-file open error\n";
while(<INFILE>){last if(/^.title./);}
/^.title.(.*)/;
$title=$1;
while(<INFILE>){last if(/^.dt./);}
$_=<INFILE>;
close INFILE;
($cnt@`$author@`$time@`$res)=/^.dt.(\d+) .*\<font.*\<b\> (.*) \<\/b\><\/font\> (.*)\<br\>\<dd\>(.*)\<br\>\<br\>\<br\>/;
$oldcnt=`cat ${cpath}/$cntfile`;
if($cnt>$oldcnt){
`echo ${cnt}>${cpath}/$cntfile`;
print "New message No.[ ".$title." :".$cnt." ]\n";
print " [ ".$author." ]";
print " ".$time."\n";
$res=~s/\&gt;/>/;
$res=~s/\&lt;/</;
$res=~s/\&amp;/&/;
$res=~s/\s*\<br\>\s*/\n/g;
print $res."\n";
}
sleep $waitcnt;
}
64初心者:2000/07/13(木) 22:40
>62japuさん

 なるほど、そういうことだったんですね。
 S_JISのコードまで書いてくださるなんて、本当に御親切にありがとう
 ございました(^O^)

 見た目だと、s/[\r|\n|\r\n]//g; なら、CRLFをとってくれそうに
 見えるんですけど、こういう場合の「2文字(?)」を取り除くって
 いうやり方はダメなんですか?

 しかし、クラス内部でメタ性を失うのって、昔チックでいいですね。
 かつての某パソ通みたいに、全角に対してBSキーを押したら、奇妙な
 消え方をするのを思い出しました。
65名無しさん:2000/07/14(金) 19:50
s/[\r|\n|\r\n]//g;

は 「\r と | と \n と \r\n を ヌル文字列に置きかえる」

「\r と \n と \r\n を ヌル文字列に置きかえる」なら
s/[\r\n]//;

でも perl メモには
s/\r//;
s/\n//;
s/\r\n/;
のほうが速いとかいてあったぞ♪
66japu:2000/07/14(金) 23:48
(FYI)「削除する」だけなら、tr/\r\n//d; が一番高速だと思う...

#! /usr/local/bin/perl

use Benchmark;

$CRLF = "\r\n";

timethese(100000@` {s0 => q{ $_ = $CRLF; s/[\r\n]//g }@`
s1 => q{ $_ = $CRLF; s/\r//; s/\n// }@`
tr => q{ $_ = $CRLF; tr/\r\n//d }} );

__END__

Benchmark: timing 100000 iterations of s0@` s1@` tr...
s0: 8 wallclock secs ( 4.35 usr + 0.00 sys = 4.35 CPU)
s1: 7 wallclock secs ( 5.22 usr + 0.02 sys = 5.24 CPU)
tr: 4 wallclock secs ( 3.03 usr + 0.01 sys = 3.04 CPU)

うぐぅ。マシンパワーが...
67名無しさん:2000/07/15(土) 00:56
IPでアクセス制限をしたいのですが・・・。
方法がわかりません
ご指導をおねがいします。
68名無しさん:2000/07/15(土) 01:24
exit if ($ENV{'REMOTE_ADDR'} =~ m/$ip_list/);
69名無しさん:2000/07/15(土) 01:49
IPはどこに書き込むのでしょう・・・。
あと、どこに記述すれば?
もうしわけないのですが
よろしくおねがいします。
70初心者:2000/07/15(土) 02:49
すみません。質問させてください。
"Abcdef"と言う文字列があって、これを
"ABCDEF"と言う風に、小文字のアルファベットを全部大文字に変換する方法があれば教えてください
71>70:2000/07/15(土) 02:51
tr/a-z/A-Z/
7270:2000/07/15(土) 02:58
>71
2分後とは早いですね。
どうも、ありがとうございました。
73japu:2000/07/15(土) 04:19
別解
$var = "Sakura Moe";
$uvar = uc $var;
print "$var\n$uvar\n";
この方法だと、ロカール情報まで考慮されて高速に処理されるはず。
74japu:2000/07/15(土) 11:02
一応、やってみました。

#! /usr/local/bin/perl -w

use Benchmark;
$STR = "Sakura-chan Moe";
timethese(100000@` {tr => q{ $x = $STR; $x =~ tr/a-z/A-Z/ }@`
uc => q{ $x = uc $STR }} );

__END__

Benchmark: timing 100000 iterations of tr@` uc...
tr: 12 wallclock secs ( 9.19 usr + 0.02 sys = 9.21 CPU)
uc: 2 wallclock secs ( 0.83 usr + -0.01 sys = 0.82 CPU)
75>74:2000/07/15(土) 15:48
ucって聞いた事ないっす。
変数に高速にアクセスできるようになるんですか?
76monalove:2000/07/15(土) 16:02
手元のFreeBSDだと、ほとんど違いがありません。
japuさんの試されたperlはHAS_SETLOCALEではないのでしょうか?

tr: 1 wallclock secs ( 1.38 usr + 0.00 sys = 1.38 CPU)
uc: 1 wallclock secs ( 0.98 usr + 0.02 sys = 0.99 CPU)
77>75:2000/07/15(土) 16:05
man perlfuncすると載っています。
要はC言語のtoupper()です。
7875:2000/07/15(土) 18:49
なんだ、、、大文字にするだけの関数か、、
79名無しさん:2000/07/15(土) 23:37
別海
$str = "Fuckin Sakura";
print "\U$str\E";#この場合\Eは要らないけど、いちおー
8070:2000/07/16(日) 01:42
次の日になってびっくり。
いろんな方々がさまざまな別解を考えてくださいまして、
感謝感謝です。

あと
>tr: 1 wallclock secs ( 1.38 usr + 0.00 sys = 1.38 CPU)
>uc: 1 wallclock secs ( 0.98 usr + 0.02 sys = 0.99 CPU)
のような測定ができることも初めて知りました。
個人的にしてみたいので、調べてみます。

どうも、ありがとうございました。
81japu:2000/07/16(日) 02:33
ある程度高速なマシンだとほとんど差が出ないようですね。(うちのパソコン、
ボロいもんで。)

ロカールに関しては、「考慮されることもある」程度の意味です。場合によっ
ては "a" に "'" が付いた文字が "A" に "'" が付いた文字に変換されること
が期待できそうってことで。日本語を処理する場合に関しては tr/a-z/A-Z/
と変わらないでしょうけど。
82名無しさん:2000/07/20(木) 19:52
カール板が動かないんですけど@`@`@`
何回やっても駄目なんです。
どうしたらいいですか?
83japu:2000/07/20(木) 23:05
82:
その情報から可能なアドバイスは以下の通り:
1. 祈る
2. 念じる
3. 勉強する
4. お金で解決
# 嬉しい回答は良い質問から。
84monalove:2000/07/21(金) 00:09
5.あきらめる
85名無しさん:2000/07/21(金) 00:26
6.マシンをかるく叩いてみる
86japu:2000/07/21(金) 01:29
85: 斜め45度から食らわすのがコツです。
87名無しさん:2000/07/21(金) 16:14
1:ささやき
2:詠唱
3:祈り
4:念じよ!

カール板は灰になりました

88超初心者:2000/07/21(金) 20:32
すみません、本当に初心者なんですけど、、
掲示板とかを自分のHPに設置して動きを見るときって、
どうしても電話代がかかってしまって、、。
オフラインでそういうテストをできるようなツールって
あるんでしょうか。。
探してみたんですが、よくわかってないのもあって、
見つけられませんでした。。

すみません、教えてくださいませんか。。
89名無しさん:2000/07/21(金) 21:18
初心者というくらいだからWindowsだよね?
1. http://www.activestate.com/Products/ActivePerl/Download.html
  で、Windows用ActivePerlを手に入れ、インストールしよう。Windows Users: という
  注意書きがあるので、そこのソフトを先にダウンロード&インストールするのを忘れずに。
2. AN HTTPD というソフトをどうにかして手に入れ、インストール&設定しよう(URL忘れた)。
3 ブラウザから http://localhsot/(何とかかんとか)/test.cgi などと指定すればオッケーだ!

2 と 3 の間が難しいかも。AN HTTPD の説明書など読んでがんばってくらさい。
あと flock とか symlink 使ってるCGIは動かないので注意。
90:2000/07/21(金) 21:20
Macだったかな…。
91あっ:2000/07/21(金) 21:21
3 は "localhost" でした。
92japu:2000/07/21(金) 21:25
Windows なら、AN HTTPD でしょうな。
結構セキュリティホールが発見されているようだけど。

オススメなのはFreeBSDなどのPC UNIX。
Apache入れればほぼプロバイダと同じ環境で実験できるはず。
93超初心者:2000/07/21(金) 21:53
>89@`92
めちゃめちゃありがとうございました。
今、ANHTTPDというソフト探してみてます。。
ActivePerlはそこの、WindowsUsers:の先から
落としました。

聞いてみて良かったです。。。
94名無しさん:2000/07/21(金) 22:22
kent-webにオフラインでCGIの説明があったと思う。
行ってみてください。
http://www.kent-web.com/
95名無しさん:2000/07/21(金) 23:17
カドルト
96名無しさん:2000/07/22(土) 00:24
二つ質問があるのですが
<Form Method="Get" Action="./Test.cgi">
<Textarea Name="value" Cols="60" Rows="6"></Textarea>
<Input type=submit value=submit></Form>
こんなフォームで

あいうえお
かきくけこ

って感じで入力されてきたのをcgi-lib.plを使わずに処理する(デコード?)
にはどうすればいいですか?
もう一つは上の場合で改行で区切るのはどうすればいいのですか?
多分splitを使うのだと思うのですが区切り文字\nでは無理でした・・。
よろしくお願いします。
97マルチ@超初心者:2000/07/22(土) 01:14
日本語の無料HPサービスで、CGIが設置できるトコありませんでしょうか?
勉強がてら、いろいろ試してみたいのですが。。。
98>97:2000/07/22(土) 01:23
http://tadamono.to/

ここ見るとわかるかも。
9997:2000/07/22(土) 02:03
>98 ありがとうございました。
100わん:2000/07/22(土) 02:09
>97
いろいろ試すなー
お願いだから、ANHTTPDでやってくれ〜
101名無しさん:2000/07/22(土) 02:23
Macの場合はMacJPERL5.2かMacPERL
ここからダウンロードが可能
ただし、線がかなり細いので注意
http://world.std.com/~habilis/macjperl/MacJP5.j.htm

おろしにくいのでこれを使うのが良い
http://www.vector.co.jp/soft/mac/net/se083423.html
シェアウェアなのが痛いが・・・
10297:2000/07/22(土) 02:30
>100 申し訳ないJMFI Webに登録しちゃいました
103すいません:2000/07/22(土) 03:48
http://www.nihen.com/
ここで、板の名前をどこでも良いのでクリックすると、2chみたいに
板に移動します。例えば一番上の「オロスコ」板をクリックします。
そして、オロスコ板に行った状態でIEでリロードすると、また
トップのページ(http://www.nihen.com/headline.html)に
戻ってしまいます。そうではなくて、リロードしてもオロスコ板が
表示されるようにするにはどうすればよいのでしょうか?
真剣に悩んでいます。マジレスお願いいたします。

HP板で書いたのですが、なかなかうまくいかないので
御教示お願いします。
104名無しさん:2000/07/22(土) 05:53
質問です:

cgiにつくらせたフォルダとファイルの所有者がnobodyになってしまいました
(他のファイルはmaster)
ファイルを消すことができない状態です
nobodyをmasterにするにはどうしたらいいんでしょうか?
ちなみにffftpを使っています

よろしくお願いします
105名無しさん:2000/07/22(土) 05:59
telnetのchownコマンドをつかうんでしょうか?
106名無しさん:2000/07/22(土) 06:14
> 104
ファイルを削除するCGI使って消すべし

> 105
通常のUNIX系OSの場合、chownはrootでないと使えない。
107名無しさん:2000/07/22(土) 06:31
>>106さん
telnetコマンドについていろいろ調べたんですが無駄だったようですね...
質問に質問を重ねてしまうんですが、ファイルを削除するcgiは作れるんでしょうか?
108名無しさん:2000/07/22(土) 08:47
>107
perl の組込み関数 unlink をお使いください。
109>107:2000/07/22(土) 10:25
#!/usr/local/bin/perl

$query = $ENV{QUERY_STRING};
$query =~ s/[^\w.-]//g;

print "Content-Type: text/html\n\n";
print "<html><body>\n";

if( -f $query or -l $query ){
if( unlink $query ){ print qq|"$query" の削除に成功しました。\n| }
else{ print qq|"$query" は何故か削除できませんでした。\n| }
}
else{ print qq|"$query" は削除しないほうがいいです。\n| }

print "</body></html>\n";

exit;


こんな感じ? テストしてないけど。
del.cgi とでも名前を付けて、del.cgi?log.dat とでも指定してみてください。
110名無しさん:2000/07/22(土) 23:19
ありがとうございます!
とりあえず試してみます
111名無しさん:2000/07/23(日) 04:12
>>109
インターナルサーバーエラーがでました

#!/usr/local/bin/perl
$query = $ENV{QUERY_STRING};
$query =~ s/[^\w.-]//g;
unlink $query

これくらいまで減らして試してみたんですが動かなかったです……

状況を説明すると、掲示板用に作成したフォルダがあって、そのフォルダと中のファイルの所有者がnobodyになっています
フォルダにはアクセスできるんですが、削除はできません
フォルダ内に削除用のcgiをアップロードすることさえできません

どうにかなりませんでしょうか……
わかる方よろしくお願いします
112余計なお世話君(一号:2000/07/23(日) 04:16
109さんのスクリプトは
消したいファイルと同じディレクトリに置くんですよ♪
113名無しさん:2000/07/23(日) 04:18
unlink $query;
114余計なお世話君(一号:2000/07/23(日) 04:23
>112
111さんの投稿を確認出来ずに投稿したため
外した発言になってしまいますた。
115名無しさん:2000/07/23(日) 04:26
消したいフォルダの中に入れるのではなく、
消したいフォルダの1つ上に入れるわけだが、
理解できているだろうか。
116名無しさん:2000/07/23(日) 04:29
117名無しさん:2000/07/23(日) 04:30
っていうかこれだけでいいんじゃない?
#!/usr/local/bin/perl
unlink "ファイル名";
118117:2000/07/23(日) 04:31
あ、>フォルダ内に削除用のcgiをアップロードすることさえできません
読んでなかった。。。スマソ(^^;
119117:2000/07/23(日) 04:33
じゃ、これは?
unlink "フォルダ名/ファイル名";
120117:2000/07/23(日) 04:35
んで、その後
rmdir "フォルダ名";
121名無しさん:2000/07/23(日) 04:53
>>117
rmtreeを使えば一発、というのが116。
122117>121:2000/07/23(日) 05:03
なぬっ、そんな関数があったのか(^^;
っていうか、俺が持ってるリファレンス本に載ってないよぅー(泣
123名無しさん:2000/07/23(日) 05:11
消せました!
>>116さん >>117さんのやり方どっちでもよかったようです
ありがとうございました
というか、みなさん親切すぎます
ここは本当に2chなんでしょうか(笑)
12413:2000/07/23(日) 05:33
いや、俺も1つ勉強になったです(^^;
12517:2000/07/23(日) 05:33
いや、俺も1つ勉強になったです(^^;
126117:2000/07/23(日) 05:35
124=125
あぅ、中止ボタン間に合わなかった(藁
別スレで13だったから。。(^^;
っていうか17でもなくて117じゃん。。
あぁ、、、なんか鬱だ。。。(ワラ
127>117:2000/07/23(日) 08:50
気にするなよっ
128わっかんないっす:2000/07/26(水) 02:19
<a.txt>
123
456
789
となってて、
これを@_に入れます
$kazu="012";
unshift @_@`"$kazu¥n";
としてa.txtに書きこむと
012
123456
789
となってしまう。つまり123のあとの改行指示がなぜか消えてしまうんだけど
どうすればいいでしょうか?
129名無しさん:2000/07/26(水) 02:32
なんも操作しないでa.txtを書き戻すとどうなるの
130名無しさん:2000/07/26(水) 02:38
なにも操作しないで、というと?
@_を読みこんですぐにまた書きこむということですか?
ちょっとやってみます
131128:2000/07/26(水) 02:43
とてもへんてこになりました。
改行指示がまたしても無視されてます
132名無しさん:2000/07/26(水) 02:49
読み込んだ直後と書き込む直前に画面に配列内容吐かせてみたら
133128:2000/07/26(水) 03:02
ちょっとやってみます
134>128:2000/07/26(水) 03:53
改行コードは統一されているか?
135128:2000/07/26(水) 05:41
やってみました。
@_のなかみは<012 123 456 789 >となってるので
正常だとおもうのですが、
これを書きこむ時にエラーがおきるみたいです。
何故でしょう。改行コードも統一してますし。
もういちど全ての要素の最後に¥nをつけてみようと思うのですが
これまたどうすればいいのかわかりません。
136名無しさん:2000/07/26(水) 06:08
@_=map {chomp; $_.="\n";} @_;
137間違えた:2000/07/26(水) 06:27
map {chomp; $_.="\n";} @_;
138名無しさん:2000/07/26(水) 11:56
えっと配列からタグ(と思しきもの)を抜き出そうと思いまして

@html = (
'<p>abc<i>'@`
'abc<br>def'@`
'a<b>b<u>c');

foreach (@html) {
push (@tag@` (/<(.+?)>/gi) );
}

のようにやってみたんですけど配列の要素中に該当するものが
複数ある場合、その全てを抜き出すにはどうすれば?
上の例の場合だと、

@tag = ('p'@`'i'@`'br'@`'b'@`'u')となるようにしたいです。
なんか iとか uが無視されちゃうんですが…
139名無しさん:2000/07/26(水) 12:09
上のコード実行したら、uもiも入ってましたが?
140128:2000/07/27(木) 03:29
うまくいきました。ありがとうございました。
そんですみませんが、もうひとつお願いします。
@_の中の最後の10要素をとりだすにはどうすればいいのでしょうか。
@_の中に何個要素が入ってるかわからない場合です
@_にリバースかけて@revなどとして頭から取り
そしてそれをまた@10などにいれてリバースかけて10個という風にするしか
ないのでしょうか?
順番どうりにとりだしたいのですが、、
141名無しさん:2000/07/27(木) 03:41
たしか配列の中身の数を返す関数があったと思うから
それを使ってそれを-10した数からやればいいんじゃないかな。

こういう事を考えていくのも、勉強のうちだよ。
っていうかこういうのが楽しめなければ
スクリプト組むのはよしたほうがいい。
142128:2000/07/27(木) 03:48
やっぱ関数がきっちり載ってる本かわないとダメですね。
入門書だけだとキツいっす。
143名無しさん:2000/07/27(木) 03:50
@last_ten = @_ > 10 ? @_[-10..-1] : @_;

関係ないけど、 @_ は普通の用途にはなるべく使わないほうがいいと思う。
(最後の10個をとりだすサブルーチンだったらいいんだけど)
144128:2000/07/27(木) 04:04
ありがとう。とてもたすかりました。
@なんたら。って名前が思いつかない時は何気に@_よくつかってました
以後気をつけます
145名無しさん:2000/07/27(木) 05:09
変数や配列の名前ってなにげに思いつかないよね。(笑)
でも、@_とか$_使ってると
そこに何が入ってるのかわかんなくなっちゃったりするから
ちゃんと名前つけといた方がいいよ。
絶対に分かる!って自信があるならいいけど。(^^;
146名無しさん:2000/07/27(木) 18:08
open (OUT@` ">$fileA");

open (OUT@` ">>$dirB/$fileA");

>の数が違うのは何か意味があるんですか?
147japu:2000/07/27(木) 19:03
あります。詳しくはマニュアル参照。
148名無しさん:2000/07/27(木) 20:01
テキストフィールドをテキストエリアに変えようと思って
<form action="$myname" method="$method">
<textarea name="aaa" rows=6 cols=72 wrap=off></textarea>
<input type=submit name=submit value=OK>
<input type=reset value=reset>
</form>

ってやって、

$FORM{'aaa'} = "<pre>$FORM{'aaa'}</pre>";

とやったのですが、
書き込みで改行した分を投稿しても改行されてないんです。
何か他に必要なんでしょうか?
149>148:2000/07/27(木) 20:29
\nを<br>に置換する。
150146:2000/07/27(木) 20:34
>147
冷たい人だね
151>150:2000/07/27(木) 23:44
もうちょっと自分で勉強する努力をしなさい。
なんでも聞いてると上達しないよ。
本を一冊買うか、perl関係のサイトをまわるかしてみれば?
152>149:2000/07/28(金) 00:13
<pre>で囲んでるなら\nのままでいいのでは?
153名無しさん:2000/07/28(金) 00:43
配列の中から重複するものを取り除くにはどうすれば効率良いでしょうか?

@A = ('a'@`'b'@`'c'@`'a'@`'d'@`'c'@`'b'@`'a');

@A = ('a'@`'b'@`'c'@`'d');

配列内の順番はどうなっても良いです。
154名無しさん:2000/07/28(金) 01:16
@temp{@A} = ();
@A = keys %temp;

なんてどうかな。
155153:2000/07/28(金) 02:20
>154さん
できました!
@temp{@A} = ();
こんな書き方もあるんですね〜
ハッシュはまだ全然使いこなせてないのでもっと勉強します。
本当にありがとうございました。
156名無しさん:2000/07/28(金) 02:33
ファイルロックってひとつずつやらなければならないのでしょうか?

ファイルロック開始;
ファイルA操作;
ファイルB操作;
ファイルC操作;
ファイルロック解除;
てなことは良くないのですか?
157>156:2000/07/28(金) 02:37
158156:2000/07/28(金) 02:58
うーん。難解な文章だなぁ。
159monalove:2000/07/28(金) 03:46
ごめんなさい。書いた私もそう思います。
とりあえず、ファイルロックは一つのファイルごとに行う必要はありません。
むしろ、それぞれのファイルがお互いに無関係でない限りは
一回のロック〜アンロックの間にまとめて行わなければいけません。
160156:2000/07/28(金) 03:52
なるほど。わかりました。挑戦してみます
161名無しさん:2000/07/28(金) 07:18
1バイトコードと2バイトコードの判定ってどうすればいいんでしょうか?

例えば、フォームから入力するとき、”半角英数のみ”という指定にしたいのです。
これは正規表現なんかでできるものなんでしょうか?
どなたかお教え下さい。
162>161:2000/07/28(金) 07:29
[0-9a-zA-Z]
163japu:2000/07/28(金) 20:00
die if($var =~ /[^A-Za-z0-9]/);
-or-
die if($var =~ /[\W_]/); #tricky
164名無しさん:2000/07/31(月) 00:52
HTMLのフォームからinput type=fileで
ファイルアップロードしたいのですが、
一体どうすればいいのでしょうか。
リファレンスサイトなどありますか?
165名無しさん:2000/07/31(月) 22:42
Windows CEでperlありますか(ソフトありますか)?
166名無しさん:2000/07/31(月) 23:56
>>165
なかったと思う。。。
167ラプ:2000/08/01(火) 12:06
今、パールを勉強してるのですが、
デバックが快適にできなくて悩んでます。
参考書をそのままコーディングしただけでも、
エラーが出てしまい。どこがエラーなのかも解からないし、
何個エラーがあったのかも解りません。
デバックの仕方を教えて下さい。宜しくお願いします。
OSはウインドウズ95を使っています。
168>165:2000/08/01(火) 14:37
PocketDOS入れてPerl使え
169>167:2000/08/01(火) 14:38
perl -cw test.pl

で見てわからん?
英語がわからないとかいうのは論外だけど…。
170いやづら:2000/08/01(火) 15:38
>>167
Copal
http://homepage1.nifty.com/kaityo/
ついでにPerlEditor
http://village.infoweb.ne.jp/~ckawa/index.htm
Winのperlは使えない関数もあるので注意
171ラプ:2000/08/01(火) 16:05
>169
perl -cw test.pl を
どの様にすると、わかるのでしょうか?

いつもは、コーディングが終わったら、FTPで送って
ブラウザで開いてみます。
で、internal server error というログが出ると、
ああ、またバグがあるのだな。
と考え、参考書とソースを交互に見比べて、
何処が違うのか捜しています。

ひつこく(しつこい?)て、申し訳ありませんが、
もう少しだけ詳しく教えて下さい。
もしくわ、説明の乗ってるHPをご存じなら
URLを教えて下さい。

>170
べんりな物がある見たいですね。
でも、基本的な事がキット解ってないと思うので、
ツールを使わなくても、バグってる箇所がわかる方法を
知りたいと思っています。
その後にツールへチャレンジしてみたいと思っています。
ありがとうございます。


172いやづら:2000/08/01(火) 16:21
>170
とりあえずローカルでテストできる環境を作った方がよくないですか?
参考スレッド:WIN 95/98/NTでPerlのテスト環境構築
http://tako.2ch.net/test/read.cgi?bbs=perl&key=964575342&ls=50

ANHTTP+あくちぶぱーる+Copal+エディタでいけるはず
余裕あればhttpdはApacheでもいいけど
173いやづら:2000/08/01(火) 16:21
↑ >171の間違い
174ラプ:2000/08/01(火) 16:34
>172
そうですネ。
読んでやってみます。
いつも、つなぎっぱなしなので、
ローカルで出来るとスゴク良いと思います。
ありごとうございます。
175名無しさん:2000/08/03(木) 12:30
誰か、164さんの質問答えてあげてください。
(ごめんなさい、私はわかりません)
176名無しさん:2000/08/03(木) 13:11
177Perl2週間目:2000/08/03(木) 23:39
open IN@`"/public_html/head.txt";
が無効であることがやっとわかったのですが
opendir "/public_html";と
chdir "public_html";
どちらがいいのでしょうか?
より良い方ってどちらですか?
178名無しさん:2000/08/04(金) 00:36
ネタですか?
179名無しさん:2000/08/04(金) 00:48
いやマジです。
180名無しさん:2000/08/04(金) 00:52
perlより相対パスをお勉強しましょう
181名無しさん:2000/08/04(金) 00:56
なにー!
PERLの問題じゃないのー?
あ、ちなみにpublic_htmlはaaでもlogでもなんでもいいです。
ドキュメントルートなどは無視して考えてください
182名無しさん:2000/08/04(金) 00:57
無視ってのもへんだからドキュメントルートはusrrootね
183名無しさん:2000/08/04(金) 01:09
やっぱりパスのお勉強だねー

それに
opendir と chdir のどちらでもよい
っていう状況がわからんな(藁
184名無しさん:2000/08/04(金) 01:12
えー
そうなのかー。ま、いいや
185名無しさん:2000/08/04(金) 10:49
とりあえず、

print `pwd`;

とでもして、Web サーバのパスと UNIX 上のパスの違いを
自覚してもらうのがいいと思う。
・・・まさか、ドキュメントルートを / に設定してる訳は
ないでしょう。
186名無しさん:2000/08/05(土) 23:32
"0008052329"という文字列を

"00/08/05 23:29"という文字列に変換したいのですが、
どうすればよいでしょうか?
187名無しさん:2000/08/06(日) 00:04
s{^(..)(..)(..)(..)(..)$} {$1/$2/$3 $4:$5};
188japu:2000/08/06(日) 00:24
#! /usr/bin/perl -w

$str = "0008052329";
($year@` $month@` $day@` $hour@` $min) = unpack "A2A2A2A2A2"@` $str;
$str = "$year/$month/$day $hour:$min";

print "$str\n";

__END__
189186:2000/08/06(日) 02:37
>187&japuさん
返答ありがとうございます。
助かりました。
190名無しさん:2000/08/06(日) 04:17
CGIをアップロードしました。ブラウザで見ようとすると
「ファイルのダウンロード」のダイアログが出てしまいます。

簡単なブラウザ情報を表示するCGIです。Perlのパスも間違って無いです。
属性が違うんでしょうか?705と755でも同じ状態です。
誰か教えてください。お願いします…
191名無しさん:2000/08/06(日) 04:31
>190
"Content-Type: text/html" をブラウザが受けとっていないことが考えられる
再確認してみれ
192190:2000/08/06(日) 04:50
解決しました。191さん、ありがとうございました。
193名無しさん:2000/08/07(月) 02:43
CGIから他のサイトのCGIを動かす?呼び出す?にはどのようにすればよいでしょうか。
194>193:2000/08/07(月) 02:48
Location:
195193:2000/08/07(月) 23:42
>194
ありがとうございます。
196名無しさん:2000/08/08(火) 01:00
一旦文字列として取得したものを後から変数展開させることは出来ますか?
(コマンドラインやテキストファイルから取得するため)

$test = '$A . $B';
$A = "abc";
$B = "fgh";
$C = ($test を式として実行);

こんなイメージです
197>196:2000/08/08(火) 01:04
eval 。

>(コマンドラインやテキストファイルから取得するため)
これの意味がよくわからない…。大抵、置換の方が楽なものだけれど。
198japu:2000/08/08(火) 01:08
$C = eval $test;
199名無しさん:2000/08/08(火) 01:35
use Safe;
$test= q{ $A = "abc"; $B = "fgh"; $A . $B; };
$cpt=new Safe;
$C=$cpt->reval($test);
200名無しさん:2000/08/08(火) 02:57
http://www.jmarshall.com/tools/cgiproxy/にある、「CGIproxy」を
hypermartのアカウントに設置したのですが、実際に使用してみると
”Address family not supported by protocol family”と言った表示が出て
connectの所でエラーになってしまいます。

hypermartではsocketは使えると思うのですが、何処を直せばうまく動作する様になるのでしょうか?
201名無しさん:2000/08/08(火) 03:44
ここは"人間初心者コーナー"じゃないよ
202名無しさん:2000/08/08(火) 07:20
>197-199
有難うございます

203203:2000/08/09(水) 12:04
まず2択選択のスレッドを作ってもらって
そこにレスを書いていくというものなんですが、
レスにはホストやIPが表示されません。
私のような若輩者にはどこをどういじればわかりません。
おそらくここにおられる方には屁みたいなものと思います。
ちょっと見てもらえませんか?
http://www.mediawars.ne.jp/~okapin/CGI/dotch/download/dotchcnv_cgi.txt
204>203:2000/08/09(水) 12:43
これは古いバージョンのログファイルを最新のものに対応するようにコンバートするものじゃないのか?
205名無しさん:2000/08/09(水) 12:45
改造ネタはそれ用のスレッドがあるからそこでお願いね。
206203:2000/08/10(木) 09:44
>204
あ、勘違いしてました。すいません。
>205
了解しました。

あ、気にせず続けてください。
207名無しさん:2000/08/10(木) 11:24
http://www.web-kyoto.com/
今日見つけたんですけど、ここのCGIは有名ですか?
208チョウ初心者:2000/08/10(木) 13:28
perlってなんですか?
209>207:2000/08/10(木) 14:03
有名だけど、今行ったら弾かれた(笑)
IE5かNN4.7でないとダメなんだってさ。
210名無しさん:2000/08/10(木) 17:30
sort などで日本語の文字列を五十音順に並べかえたいんですが、良い方法ありませんか?

ひらがな→カタカナ→漢字
な具合にしたいんですが…
211名無しさん:2000/08/11(金) 00:32
$string がユーザに入力させる任意の文字列だとして、
index で検索したいのですが、たとえば

$string =~ s/['\\]/\$1/g;
$x = "index( \$line@` '$string' );";
eval $x;

は安全でしょうか?
ちょっと不安なので…。
212211:2000/08/11(金) 00:43
あ、間違えた。
index じゃなくて正規表現で

$string =~ s/[\/\\]/\$1/g;
$x = " /$string/ ";
eval $x;

です。
213名無しさん:2000/08/11(金) 04:15
一応 use Safe; しとくのが無難なのかね。
特にsecurityにうるさくなかったらevalでいいような
気がするけど。
$c = new Safe;
$c->permit_only('m');
$c->share(qw($string $_));
$c->reval("m/$string/");
みたいな感じか。
(実験してない スマソ 違ってたら訂正キボン)

214212>213:2000/08/11(金) 13:55
回答ありがとうございます。
ちょっと動かそうとしたのですが、レンタルサーバにSafeモジュールがインストールされてないみたいです。
すみません。

>特にsecurityにうるさくなかったらevalでいいような気がするけど。
$string に "./;system('...');/."
とか入れられちゃったらまずそうなので、212のパターンを考えたのですが、
何か見落としがありそうでコワいです(笑)
検索なので s/\W//g としてしまうわけにもいかないし…。
215名無しさん:2000/08/11(金) 15:17
CGIでtarを使いたいのですが、どうすればいいのでしょうか?

#!/usr/bin/perl

print "Content-type: text/html \n\n";
print "<HTML>\n";
$system = `tar cvzf /home/back/a.tgz /home/user/*`;
print "$system";
$system = `ls -l /home/httpd/html/back`;
print "$system";
print "</HTML>";
__END__

と、試しに作ったのですが
コンソール上では出来るのですが
ブラウザではだめでした・・(lsは動くのですが)
216215:2000/08/11(金) 15:47
>$system = `ls -l /home/httpd/html/back`;
$system = `ls -l /home/back`;でした

217>215:2000/08/11(金) 16:23
ダメというのは具体的にはどうなるの?
218ラプ:2000/08/11(金) 17:08
質問させていただきます。
ファイルの中の行に該当する文字が含まれていたら、
その行をファイルの行の先頭へ移動させたいのです。
以下の様なプログラムを作ったら、順番が変わることなく
動かす度に、上から1行づつ消されていってしまいます。
どこが、間違っているのか教えて下さい。
宜しくお願いします。

open FILE@`"aaa.dat";
@allbody = <FILE>;
close(FILE);
foreach $line (@allbody) {
if ($line = ~ /該当の文字/){
unshift @allbody@`$line;
last;
}else{
next;
}
}
open FILE@`">aaa.dat";
print FILE @allbody;
close FILE;
219213>214:2000/08/11(金) 18:56
Perlのバージョンが最近のだったら qr// が良い感じなんだけどね。
use Safe; がだめなら期待薄か。
あとはエキスパートの出番やね。

こんなので遊んでみている。

#!/usr/bin/perl -w -T
$string = shift or die "Regexp not specified.\n";
print STDERR $string@`"\n";
($regex = qr/$string/) or die "Regexp has syntax error.\n";

while (<>) {
print if ($_ =~ m/$regex/);
}

220215:2000/08/11(金) 19:02
>217
ブラウザからだとlsの結果しか出ないのです。

Total (0)

な感じになってしまうのです。tarの結果はぜんぜん出てきません・・
221名無しさん:2000/08/11(金) 19:08
>>212
そもそもなんで $x = /$string/; じゃだめなんだっけ。
Safeを持ちだすほど難しい問題にも見えない。

> $string =~ s/[\/\\]/\$1/g;
この処理意味不明。何をやりたいのか日本語で説明してみて。
222212>221:2000/08/11(金) 23:19
>> $string =~ s/[\/\\]/\$1/g;
>この処理意味不明。何をやりたいのか日本語で説明してみて。
すみません。全然違ってました。 $string =~ s/([\/\\])/\\$1/g; です。
\ と、デリミタ / だけエスケープしておけば、パターンマッチを終わらせられないので、
214のような危ない文字列を入れられても大丈夫かな、という意図です。
223名無しさん:2000/08/12(土) 00:45
>220
これなら配列に入るけど。
open(TAR@` "tar cvzf /home/back/a.tgz |");
@system = <TAR>;

逆クォート演算子はスカラーしか返さないんかね?
もっと詳しい人のフォローきぼーん。
224名無しさん:2000/08/12(土) 03:56
>223
perldoc perlopによると、 $/で切ってリストにしてくれるってよ。
225名無しさん:2000/08/12(土) 03:59
>222
evalを使わずに
 $x = /$string/;
なら問題ないと思うけど。実行するたびに$stringの内容を
正規表現としてコンパイルし直してくれる。

$stringの中に(?{system...})とか書かれる場合はあるけど、
taintチェックではねられるよ(perldoc perlre参照)。
226おぼーん:2000/08/13(日) 19:40
おぼーん
227名無しさん:2000/08/13(日) 23:49
>218
「=」と「~」の間にスペース入ってない?
演算子「=~」はくっつけて書かないと別の意味になるよ。
あとunshiftだけだと、元の行が残ったままになるので
spliceで削除すると、こんな感じ?

$i = 0;
foreach $line (@allbody) {
last if ($line =~ /該当の文字/);
$i++;
}
@deleted = splice(@allbody@` $i@` 1);
unshift(@allbody@` @deleted);
228名無しさん:2000/08/14(月) 03:18
$nj = '';
@char = ('a'..'z'@`'A'..'Z'@`'0'..'9');
srand(time|$$);
foreach (0..9) {
{
local(@temp);
push(@temp@`splice(@char@`rand(@char)@`1)) while @char;
@char = @temp;
}
$nj = $char[($_)] . $nj;
}

これってどういう意味ですか?
229名無しさん:2000/08/14(月) 09:24
こんばんは。はじめまして。
unshiftというのが良く分からないのですが、
「配列の先頭に要素を追加します。」
とあるのですが、どういうことですか?
ログファイルに、書き込むということですか?
230名無しさん:2000/08/14(月) 11:44
>223
レスありがとうございます。
でも、会社がおぼーんで開いてないから
試せない・・
231230:2000/08/14(月) 11:51
220=230です。
232名無しさん:2000/08/14(月) 14:08
>229
いやunshiftや、shift@`push@`pop@`spliceは、メモリ上で配列をいじるだけ。
その配列データをファイルに書いたりするのはまた別の仕事。
233名無しさん:2000/08/14(月) 14:28
test
234名無しさん:2000/08/14(月) 15:40
数値を3桁ごとに区切りたいです。
12345 → 12@`345
…ってな具合にしたいんですが、全く分かりません。
どなたか助けて下さい。
よろしく、お願いします。
235名無しさん:2000/08/14(月) 16:36
236234:2000/08/14(月) 17:18
ありがとうございます。>235
他にも四捨五入やら切り上げやら、欲しい物が目白押しでした!
237ラプ:2000/08/15(火) 14:21
>227
ありがとうございました。
なんだかお休みのせいで、書き捨ての様な状態になってしまって
本当に申し訳ありませんでした(いいわけ?)
それと、ソースを見比べてみて、幼稚なソースだなって
思いました。今後、気を付けてみようと思います。
238名無しさん:2000/08/15(火) 16:52
メールなどの Message-Id: ヘッダと References: ヘッダから
スレッドを生成して、そのスレッドを日付の新しい順に
並べたいのですけど、どうすればよいでしょうか?

参考になるようなソースを紹介していただければと思います。
よろしくお願いします。
239名無しさん:2000/08/15(火) 17:55
>238
perlで書かれたMHonArcていうmail-HTMLコンバータが有名かも
http://www.oac.uci.edu/indiv/ehood/mhonarc.html
240名無しさん:2000/08/15(火) 18:38
>>239
MHonArc の中の mhthread.pl がどうもそれっぽいので
しばらく眺めてみます。どうもありがとうございました。
241名無しさん:2000/08/15(火) 21:57
誰か教えてください。
一つの配列のデータからランダムで一つのデータを
表示するには↓のようにすれば良いと思うんですが、、

@test=(
"データ1"@`
"データ2"@`
"データ3"@`
);

srand;
$ramdam=int(int(3));
print $test[$ramdam];
print "\n";

では、配列が『複数』ある場合に、
ランダムで複数ある配列の中のどれか一つのデータを
取り出すには、どのように書けばいいんでしょうか?
242>241:2000/08/15(火) 22:03

print "$test[rand(@test)]\n";

こんな感じでいいと思います。

243名無しさん:2000/08/15(火) 22:29
XBM画像を解析するにはどうすればいいんですか?
244241:2000/08/15(火) 23:02
242さん、レスありがとうございます。
もう少し質問させてください。

配列が、
@member=
@partner=
@class=
というふうに<3つ>ある場合だと、どう書けば良いのでしょうか?
245わかんないっす:2000/08/15(火) 23:44
HTMLで”あいうえお”と表示するところを”     ”のように
空白スペースで表示したいのですが、うまく行かないです。
”あいうえお”は何文字の文字列になるのか分からないときです。
s/\S/<p>\s<\/p>/g
これは小文字のsが並んだのでだめでした。それで
s/\S/<p> <\/p>/g
こんなふうにしたんだけど、これも空白文字が作られないみたいだし。
どうなんでしょう。お願いします。

246japu:2000/08/15(火) 23:52
#! /usr/local/bin/perl -w

@majokko = qw[Mami Emi Pelsia Yumi Lala];
@children = qw[Rei Asuka Kaworu];
@usagers = qw[void lala-z];

$moe = (@majokko@` @children@` @usagers) [int rand(@majokko + @children + @usagers)];
print "$moe\n";

__END__

コミケ後、まだ回復していないjapuでした。
さっさと申込書書かなければ。うぐぅ。

あと、単純に
@moe = (@majokko@` @children@` @usagers);
$hoehoe = $moe[int rand @moe];
としても良い。
247241:2000/08/16(水) 00:04
japuさん ありがとうございます!
助かりました。
248>245:2000/08/16(水) 00:14
それは、HTMLだったら半角スペースは1文字に圧縮されるのでは?
全角を使うか、PREを使うかしないと…。

あと、s/PATTERN/REPLACEMENT/ の REPLACEMENT は
正規表現ではないので、\s とか \w とか使えません。
249245:2000/08/16(水) 01:50
むーぅ。微妙にムずい。preもなんだか変。
250>245:2000/08/16(水) 03:22
#!/usr/local/bin/perl

my( $x@` $y@` $sp );
$x = 'あいうえお';
$y = ' ' x ( length( $x )/2 ); # 全角
$sp = ' ' if length( $x ) % 2; # 半角

print "Content-Type: text/html\n\n";
print "<html><body>\n";
print "<pre>\n";
print "|"@` $x@` "|\n";
print "|"@` $y@` $sp@` "|\n";
print "</pre></body></html>\n";

空白だけPREでやってるのでは。"あいうえお" も含め、
すべてPREで囲まないと(FONTで等幅フォントを指定しないと)、
見た目を同じ長さにするのはHTMLでは無理。

PerlやCGIでどうという話題ではないので、あとは余所でどうぞ。
251名無しさん:2000/08/16(水) 12:06
252>232:2000/08/16(水) 15:50
>>229
>いやunshiftや、shift@`push@`pop@`spliceは、メモリ上で配列をいじるだけ。
>その配列データをファイルに書いたりするのはまた別の仕事。

unshiftとは、何をしているのですか?
メモリ上の配列とは何ですか?
ごめんなさい。初めてのプログラム言語覚えようって思っている
んです。
253japu:2000/08/16(水) 16:45
@array = qw[mami emi pelsia yumi];
print "@array\n";
$x = pop @array;
print "$x / @array\n";
push @array@` $x;
print "@array\n";
$x = shift @array;
print "$x / @array\n";
unshift @array@` $x;
print "@array\n";

output:
mami emi pelsia yumi
yumi / mami emi pelsia
mami emi pelsia yumi
mami / emi pelsia yumi
mami emi pelsia yumi
254252:2000/08/17(木) 09:37
ありがとうございます。
ソース? スクリプト? プログラム?
なんていうのか分かりませんが、親切に
教えてくれてありがとうございます。
それを、DOSのエディタで打って、実行しました。
結果が分かりました。
255名無しさん:2000/08/17(木) 11:23
URL のなかに & が含まれている場合、&amp; としなければなりませんよね?
たとえば、http://tako.2ch.net/test/read.cgi?bbs=perl&amp;amp;key=957208980&amp;amp;ls=100
とかするのですが、この?と&と=で分解される文字列の中に&が入っていた場合、
どうすればよいのでしょうか?
http://hoge.com/news2web.cgi?newsgroup=datula.Q&A&nntpserver=news.mio.org
上の場合、本当はハッシュに'newsgroup'=>'datula.Q&A'というふうに入ってほしいのですが、
当然ながら&の手前で切れてしまいます。
&を%81とか%2581とか&amp;とか&amp;amp;とかいろいろ変えてみましたが、
やっぱりうまくいきませんでした。

&以外の文字(たとえば@)を使ってスクリプトの中で元の&に変換するしかないのでしょうか?
256名無しさん:2000/08/17(木) 11:25
上の文章、&が&amp;amp;に変換されたりされなかったりで読みづらいですね。
すみません。
257>255:2000/08/17(木) 12:41
& は %26 だけど…。 %81って?

newsgroup=datulaQ%26A&amp;amp;nntserer=news.mio.org

でできると思いますが。
できないのならフォームのデータを取得する部分がおかしいのでしょう。
258255:2000/08/17(木) 14:28
あ、そういうふうにやったらちゃんとできました。
どうもありがとうございました。

%81というのは、、、なんだったんだろう?
ord "%" の値をそのときは使ったんですけど、81じゃないですね。
すみませんでした。
259お教えを請います:2000/08/17(木) 21:16
掲示板のスクリプトで投稿文章の一番最後に改行が入ってたら
削りたいのですが、どのようにすればいいでしょうか?
正規表現を使えばできると思うのですが、素人なもので。
260名無しさん:2000/08/17(木) 22:49
chmop($bunsyou);
で、そのものずばり。
でもPerl5じゃないとだめです。
あ、でもsendmailが複数行にわたるときは、どうだったかな。
261名無しさん:2000/08/17(木) 22:50
まちがえた。chompでした
262名無しさん:2000/08/17(木) 23:58
テキストファイルに下の4つの言葉が書かれていた時に
1@`オマエモナー
2@`田中
3@`ぞぬ
4@`ギコ猫

3のぞぬという言葉を一番上にもって行き後はずらす場合
1@`ぞぬ
2@`オマエモナー
3@`田中
4@`ギコ猫
とする方法を教えて下さい。
263名無しさん@?日目:2000/08/18(金) 18:07
>262
@aho = ("オマエモナー"@` "田中"@` "ぞぬ"@` "ギコ猫");
@baka = ($aho[2]@` $aho[0]@` $aho[1]@` $aho[3]);
・・・ワラ
264:2000/08/18(金) 20:41
下のようなカード占いのCGIをPerlにて作成したのですが、
http://asobiba.hypermart.net/cgi-bin/uranai/dc/7card/7card.cgi
http://asobiba.hypermart.net/7card_cgi.txt(中身)
乱数$aから$gまでが、それぞれダブらないようにするには、
どう書けばよいのでしょうか?
さらに、(後者は前者のリバースなので)
0〜21と22〜43もダブらせないようにしたいのですが……

お教え頂けたら幸いです。
265名無しさん:2000/08/18(金) 22:13
>264
0〜21の配列作成→かき混ぜ→いくつか裏返す(+22する)→7個選択
ですかね。
@a = (0..21);
@a = map { splice(@a@` rand(@a)@` 1) } @a;
foreach (@a) { $_ += 22 if rand(2) < 1; }
($a@`$b@`$c@`$d@`$e@`$f@`$g) = @a[0..6];
266>262:2000/08/19(土) 01:52
これ、昨日2分くらいで書いたのに
その間にtako落ちてた(;´Д`)

$file_name='name.txt';

$i=1;
open(IN@`"<$file_name") or die;
while(<IN>){
($num@`$nich)=split(/\@`/@`$_@`2);
chomp($nich);
if($nich eq 'ぞぬ'){
print "1@`$nich\n";
$i=2;
}else{
push(@names@`$nich);
}
}
close(IN);

foreach(@names){
print "$i@`$_\n";
++$i;
}
exit;
267こっちの方がいいや(266):2000/08/19(土) 02:01
$i=1;
open(IN@`"<$file_name") or die;
while(<IN>){
($num@`$nich)=split(/\@`/@`$_@`2);
chomp($nich);
if($nich eq 'ぞぬ'){
print "$i@`$nich\n";
++$i;
}else{
push(@names@`$nich);
}
}
close(IN);
268名無しさん:2000/08/19(土) 11:30
初心者で申し訳ございません。
<dl><dt><dd>の意味を教えて頂きたいのですが。。。
バカな質問でごめんなさい。
こんな私のような者でも解るオススメのCGIの本がございましたら、
ご推薦下さいませんでしょうか?
重ね重ねすみません。
269名無しさん:2000/08/19(土) 14:22
268<ネタだな
270名無しさん:2000/08/19(土) 15:50
ネタにしてももう少しひねってくれ。
271名無しさん:2000/08/19(土) 18:36
板違いだし
272名無しさん:2000/08/19(土) 19:21
配列で幾つかのメッセージのパターンを作り
ランダムで複数の配列の中のどれか一つのメッセージを
選び、それにあったイメージを出力するには
どうすればいいのでしょうか?
例えば、ランダムで「元気です」というメッセージを選んだら
それに合わせてjyoutai.jpgを表示させたいのですが。
ハッシュを使えばいいんでしょうか?

$image_hiragana="aisatu.jpg";
$image_katakana="henji.jpg";
$image_abc="jyoutai.jpg";

@aisatu=(
"おはよう"@`
"こんにちは"@`
"こんばんわ"@`
);

@henji=(
"はい"@`
"いいえ"@`
"そうです"@`
);

@jyoutai=(
"元気です"@`
"風邪気味"@`
"眠い"@`
);
273名無しさん:2000/08/19(土) 19:57
@array = grep (条件)@` <FILE>;

と書いたとき、1行ずつ読まれて grep の条件にかけられることを期待しているのですが、
もしかしたら、一時的にメモリにすべて読み込んでから grep にかけられるんでしょうか?
結構でかいファイルなんで、一気読みは避けたいんですが…。

while( <FILE> ){ push @array@` $_ if (条件) }

などとやらないと駄目でしょうか?
274名無しさん:2000/08/20(日) 00:04
grepの条件ブロックで読みたいファイルを変更かけたら分かる。かな。
275名無しさん:2000/08/20(日) 02:26
どもです。

#!/usr/local/bin/perl

open FILE@` "test.txt" or die;
@array = grep {
seek FILE@` 0@` 2;
1;
} <FILE>;
close FILE;

print @array;

こんなんでっちあげてテストしてみたら、@array には test.txt(2行以上) の内容が
全部入ってました。ってことはやっぱり一気読み? う〜ん。
(上のが有効なテストなら、ですけど…)
276:2000/08/20(日) 03:38
>>265さん 上手くいきました。ありがとうございます。
277名無しさん:2000/08/20(日) 23:39
>>262です
>>266さんありがとうございます


open(IN@` "name.txt");
@a = <IN>;
close(IN);

$zz= "3,ぞぬ"";
foreach $list(@a){
unless($list eq $zz){
unshift(@sub2@` $list);
}
}
unshift(@b@`$zz);

出力という感じにしました)
配列を制御する関数があることが知りませんでした。
でヒントにして上のような感じにしました。
これの悪い点がわかる人教えて下さい。
278名無しさん:2000/08/21(月) 12:25
systemを使ってDOSコマンドを実行したとき
その出力を変数で受けることは可能ですか?
出来ればファイルに書き出す前に出力を加工したいためです
279japu:2000/08/21(月) 12:55
open CMD@` "command ... |" or die;
while(<CMD>){
print;
}
close CMD;
280置換文字列での変数の使用:2000/08/21(月) 14:15
置換ルールを記述したファイルから、正規表現と置換文字列を読み込ん
で、指定したファイルに一括置換をかけるスクリプトを書いています。

しかし、置換文字列での$1、$2を使った後方参照がうまくいきません。

$str = "使用前の文字列";
$exp = "(使用)前";
$rep = "$1後";
$str =~ s/$exp/$rep/;
print $str ."\n";

上記で、"使用後の文字列"と出力されるようにしたいのですが、どのよ
うにしたらよいのでしょう。

ラクダ本などにもあたって、$repを評価したりとかしてみたのですが、
うまくいきません。

初歩的な疑問で申し訳ありませんが、どなたかご教示ください。
281置換文字列での変数の使用:2000/08/21(月) 14:30
書き忘れ。

実際には、$exp、$repは、正規表現と置換文字列をコンマで区切った
CSVファイルから読み込みます。
282278:2000/08/21(月) 14:33
>279さん
ありがとうございます
大変ためになりました
283ラプ:2000/08/21(月) 15:15
また、質問させていただきます。
1000回中で0〜2までの数字が、
ちゃんと333回づつ出るのか
試してみようと思いました。
でも、1ばかり出てしまいました。
間違っているところの指摘をお願いします。

#!/usr/local/bin/perl

$max = 1000;

for($i = 0; $i <$max; $i++){
$rand=int(rand(2));
if ($rand = 0){
$tbwidth0 ++;
}elsif($rand = 1){
$tbwidth1 ++;
}elsif($rand = 2){
$tbwidth2 ++;
}
}

$tbwidth0 = $tbwidth0/$max*100;
$tbwidth0 = $tbwidth0 . "%";
$tbwidth1 = $tbwidth1/$max*100;
$tbwidth1 = $tbwidth1 . "%";
$tbwidth2 = $tbwidth2/$max*100;
$tbwidth2 = $tbwidth2 . "%";

print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<table width = $tbwidth0 bgcolor = pink>\n";
print "<tr><td>$tbwidth0</tr></td>\n";
print "</table>\n";
print "<table width = $tbwidth1 bgcolor = pink>\n";
print "<tr><td>$tbwidth1</tr></td>\n";
print "</table>\n";
print "<table width = $tbwidth2 bgcolor = pink>\n";
print "<tr><td>$tbwidth2</tr></td>\n";
print "</table>\n";
print "</body></html>\n";
284だちゅら〜 (゚д゚ ):2000/08/21(月) 15:29
>280
$rep = q|$1.'後'|;
$str =~ s/$exp/$rep/ee;

でできます。
でも、もっとスマートなやりかたがありそうな気も…。
285置換文字列での変数の使用:2000/08/21(月) 15:32
>283

for($i = 0; $i <$max; $i++){
$rand=int(rand(3));
if ($rand == 0){
$tbwidth0 ++;
}elsif($rand == 1){
$tbwidth1 ++;
}elsif($rand == 2){
$tbwidth2 ++;
}
}

でいいんとちなう?

rand(2)だと0〜2(2は含まない)までだから、0〜2を得るにはrand(3)
じゃないとダメ。

あと、=は代入演算子。比較は==。

私の質問もよろしく〜♪
286置換文字列での変数の使用:2000/08/21(月) 15:33
あ、だちゅら〜さん、さんく♪
試してみます。
287置換文字列での変数の使用:2000/08/21(月) 15:59
たしかに、

$rep = q|$1.'後'|;
$str =~ s/$exp/$rep/ee;

にすると、希望通りの出力にはなりますが、$repにはファイルから読み
込んだ値を使いたいので、これだとうまくありません。

質問の趣旨がわかりにくくてごめんなさい。

もうちょっと試行錯誤してみます。

スマートな方法をご存知の方、引き続きよろしくお願いします。
288名無しさん:2000/08/21(月) 17:18
>置換文字列での変数の使用
こういうの考えてみましたが、やはりスマートではないっすね・・・
$str =~ s/$exp/$rep/;

eval "\$str =~ s/$exp/$rep/";
289だちゅら〜 (゚д゚ ) :2000/08/21(月) 17:39
すみません。斜め読みで回答してしまって…。

$str =~ s/$exp/"\"$rep\""/ee;

こんな物凄い方法もありますぜよ。
でも、こんなことするくらいなら eval の方がいいかも…。
290ラプ:2000/08/21(月) 17:49
>285
わかりやすい説明
ありがとうございました。
291消防の中の消防:2000/08/21(月) 18:09
/usr/local/bin/perl

$cgi="tanken.cgi";

$|=1;

read(STDIN@` $buffer@` $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/@`$buffer);
foreach $pair (@pairs) {
($name@` $value) = split(/=/@` $pair);
$name =~ s/%(..)/pack('C'@`hex($1))/ge;
$name =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C"@` hex($1))/eg;
$value =~ tr/+/ /;
$FORM{$name} = $value;
}
$admin = $FORM{'admin'};
$file = $FORM{'file'};
以下省略
これをUPするのはどーしたら良いのですか?
因みにサーバーはfreeweb です。
マジで困っています。
宜しくお願い致します。
292>291:2000/08/21(月) 18:33
探検君はfreewebでは使えませぬ
293置換文字列での変数の使用:2000/08/21(月) 20:29
>288さん
あ、式全体をevalすればよかったのか。ありがとうございました。

>だちゅら〜さん
$str =~ s/$exp/"\"$rep\""/ee;

うわー。なるほど。私には思い付かないやり方だ。

ってことで、思った通りことができました。ありがとうございました。
294名無しさん:2000/08/21(月) 22:17
293で解決したところで便乗しつもーん
$str =~ s/$exp/"\"$rep\""/ee;
↑これ、なんで2回エバらないといけないんですか?
$str =~ s/$exp/"$rep"/e;
でいいんじゃ?……と思って試したらだめだった(-д-
295名無しさん:2000/08/22(火) 00:53
/eはネスト可能、だってさ。
296241:2000/08/22(火) 04:23
>>241で質問した者です。
複数の配列のデータがあって、「配列変数だけ」を
ランダムで選ぶって出来るんでしょうか?
>>246でjapuさんが新しい配列変数を作ってからランダムで
選ぶと方法を教えていただいたのですが、配列変数を最初に
ランダムで選んで、その後に中のデータを選ぶ…という
処理をしたくなりまして。出来るんでしょうか?
教えていただけないでしょうか?

297名無しさん:2000/08/22(火) 04:32
配列の配列にしなされ。
$TEST[rand][rand];
データが既存配列ならリファレンスすればよろし。
298名無しさん:2000/08/22(火) 11:14
CGIの権限を自分のアカウントと同様にしたいのですが
どうすればいいのでしょうか。
299japu:2000/08/22(火) 11:30
setuid or suEXEC
300名無しさん:2000/08/22(火) 12:11
ローカルにプロキシチェッカーを立てたいのですが
サーバーの生存はPINGを打つとして
ポートが利用可能かはどうすればよいですか?
またプロキシサーバが返すヘッダ情報を取得する最適な方法はどうすればよいでしょうか?

現在は
$sock = IO::Socket::INET->new(
PeerAddr => "$PeerAddr"@`
PeerPort => "http($PeerPort)"@`
Proto => 'tcp');
のような感じで接続してHEADメソッドを送っているのですが
あまりうまくいきません。
ちょっとしたことでも構いません
何かヒントでもあればお願いします
301291>292:2000/08/22(火) 12:39
有難う御座いました。
因みに何処のサーバーだったら、設置できますか?
302名無しさん:2000/08/22(火) 14:00
age
303名無しさん:2000/08/22(火) 15:56
フリーでCGIが動くサーバー情報キボ〜ン
304>303:2000/08/22(火) 18:34
305241:2000/08/22(火) 20:57
241です。297さん、レスありがとうございました。
情けないのですが配列がどうしても良く判らないので
japuさんに教えて頂いたやり方でもう一度やってみようと思います。
それで何度も本当に申し訳ないのですが、質問させてください。
↓のようなプログラムを作って・・・

@nihongo=(
"おはよう"@`
"こんにちは"@`
);

@eigo=(
"good morning"@`
"hello"@`
);
srand(time);
$randam=int(rand(10));
@tekitou=(@nihongo@`@eigo);
$msg=$tekitou[int rand@tekitou];
print "$msg\n";

if ($msg=@nihongo){
print "これは日本語の挨拶だよ\n";
}elsif ($msg=@eigo){
print "これは英語の挨拶だよ\n";
}
exit;

それでif文の所で$msgが@nihongoの配列なら
「これは日本語の挨拶だよ」と返したいのですが、
ここの条件文が判らないです。単純に($msg=@nihongo)と書いても
うまく行きません。どうしたらいいでしょうか?
306241:2000/08/22(火) 21:01
241です。省略されたので抜き出します。
-----

それでif文の所で$msgが@nihongoの配列なら
「これは日本語の挨拶だよ」と返したいのですが、
ここの条件文が判らないです。単純に($msg=@nihongo)と書いても
うまく行きません。どうしたらいいでしょうか?
307名無しさん:2000/08/22(火) 23:21
eq
308名無しさん:2000/08/22(火) 23:29
掲示板荒らしの対策ってどんな方法がありますか?
309   :2000/08/22(火) 23:36
CGIはブラウザがタイムアウトしてもそのまま実行され続けるのでしょうか?
時間のかかる処理をしたいんですが、
一時的にファイルを作って、その後そのファイルを消したいのですが、
途中で終えられるとそのファイルが残っちゃわないかと心配なんです。
310名無しさん:2000/08/22(火) 23:52
普通、コネクション切れると終了しますよ。
シグナルトラップしてファイル消したらいいんじゃないかな
311298:2000/08/23(水) 00:13
>299
Apache本買ってきます。
thx!
312   309:2000/08/23(水) 00:50
310さんありがとうございます。
シグナルトラップというのが分からないです。
どのようにして行うのか、教えていただけるうれしいのですが。
313名無しさん:2000/08/23(水) 02:00
>>306

$mes=@nihongo、なら代入式じゃん。==にしても配列要素数と比較するだけだけど。

スキルが足りないなら知ってるものでなんとかしましょってのは
Perlにも言える事だけどね。単純な条件分岐でできるんだから
これをひとに訊くってのはやっぱり甘えてるかプログラマ適性がないと思うけど。
魔法のファンクションってのはそうそうないもんだよ。

とりあえず$mesの1バイト目見たら判別可能じゃないの? ねぇ。
314241:2000/08/23(水) 03:42
>>313さん。全くそのとうりです。甘えもあったし適性も無いです。
ヒントを書いてくださったので、もう一度考えてみて
($msg eq @nihongo[0@`1])こうしたのですが、「こんにちは」は
上手く行くのですが「おはよう」だと上手く行かないです。
要素の0番目が無視されてしまいます…。もう少しヒントを頂けないでしょうか?


315名無しさん:2000/08/23(水) 04:05
>>314

いや、無理言ったわたしが悪かった。もういいや。
シフトJISもしくはEUCなら次のコードで判別できる。

if (ord($msg) & 0x80) {日本語} else {英語}

頑張ってね。
316名無しさん:2000/08/23(水) 04:39
317310:2000/08/23(水) 11:10
>309=312
$SIG{'QUIT'}@`$SIG{'INT'}
を調べるといいよ。
318tori:2000/08/23(水) 11:16
use cgiが使えません・・・
オライリーには自分で解析作業
をするプログラムを書くよりこの
モジュールを使ったほうがいいとかいてあるのですが、
試してみると、CGI エラー - Content-Type ヘッダが正しくありません
Can't locate cgi.pm in @INC at
ってでてきます。
ちなみにサーバはan http serverでためしました。
319置換文字列での変数の使用:2000/08/23(水) 13:22
<318さん
それは、cgi.pmがインストールされてないんでしょ?
CAPNからcgi.pmを取ってきてインストールするか、最近のActivePerl
をインストールしたらいいんじゃない?
320でんで:2000/08/23(水) 13:23
しまった。ハンドルがこの前質問したときのままだった(^^;;
321名無しさん:2000/08/23(水) 16:04
CGIって大文字で書くなんていう問題じゃないよねえ。
322241:2000/08/23(水) 22:48
315さん、ありがとうございます。勉強になります。
実際には「英語」と「日本語」という配列を使いたいわけではなくて
複数の日本語の配列を使いたいので教えて頂いた方法が使えないのです。
わかりにくい例えですみません。

($msg eq @nihongo[0@`1])
この条件式の場合、要素の0番目が無視されて
($msg eq @nihongo[$tekitou])
こういうふうに変更したんですが、今度は要素の1番目が無視されてしまいます。
この方法では出来ないんでしょうか?
323名無しさん:2000/08/24(木) 00:52
>>322

あー、はいはい。じゃあね、

if (grep $msg eq $_ @` @nihongo) {含む} else {含まない}

もうこれでいいでしょ。それとも「配列間で内容が重複していた
場合はどうするんですか」とか訊く?(笑) あー、訊きそうだねぇ。

プリミティブな命令に分解すればいいんだよ。まずどの配列から
取るか決めて、それ覚えておいて、次に実際に取り出せばいい。
コードは冗長になるけど、動くよ、ちゃんとね。

命令の組み合わせを作ればいい。必要な知識はあなたは持ってるはずだよ。
それをしないのはもどかしい&可笑しいよ。頑張れば自分でできるのにね。
「楽したい楽したいもっと楽な方法があるんだよどこかに〜」とか
思ってるんだろうね。下手でも冗長でも、動けば勝ちなのに。
324241:2000/08/24(木) 02:07
>323さん、ありがとうございます。
なんでスライスでうまくいってくれないのかなあと
散々考えて他に方法も思いつかなかったので質問しました。
楽したいと思ってたわけでは無いんですが…。
不愉快な思いをさせてしまってすみません。
325名無しさん:2000/08/24(木) 05:37
>>324

スカラーコンテキストでスライス使う問題以前に、
eqに検索能力を求めるほうが無理があると思うけどね。
326241:2000/08/24(木) 17:00
foreachの連続で出来ました。
正直323さんにキツイなあと思いましたが、出来たのは
323さんのアドバイスのおかげです。ありがとうございました。

foreach $youso(@nihongo){
if ($msg eq $youso){
print "これは日本語の挨拶だよ。\n";
}
}
327名無しさん:2000/08/24(木) 18:42
ああ、何かいい加減にして欲しいよなぁ。
口調だけは謙ってるけど「慇懃無礼」の典型だな。全然本気で勉強して無さそうだし。
何でもすぐ人に頼るなよ。少しは自分で悩んで解決しろ。
328名無しさん:2000/08/25(金) 05:18
ソケットってなんですか?
概念が良くわかりません
どう言うことをするものなのか、
どういう物を指すのか等。
教えてください
329>328:2000/08/25(金) 05:37
入口出口
330名無しさん:2000/08/25(金) 10:53
このスレッドを読んでいるとPerlが以下に出来の悪い中途半端な
言語であるかよくわかります
331名無しさん:2000/08/25(金) 15:38
アプローチがたくさんあって、ビギナープログラマーには優しくないのに、
CGI言語ゆえにネット利用者にいちばん身近って点では不幸だわな。
332名無しさん:2000/08/25(金) 16:50
>ビギナープログラマーには優しくないのに
何と比べて言ってるの?
Perlほど簡単で、「動く」ものがすぐに書ける言語も少ないだろ。
ビギナーには最適だ。

中途半端といえばそうだけど、簡便さと機能と速度のバランスは
取れているよ。

333???:2000/08/25(金) 17:11
つーか凝り出すといくらでも凝れてしまうというのが。。。
スバラシイ(げら

ところで CPAN の *.pm 初めて使う時に楽に導入する
TIPS なんかないもんかね?
結局ソースに逝き着くのかという感じはしてきたんだが。。
334名無しさん:2000/08/25(金) 18:59
>何と比べて言ってるの?

C、C++、VB、VBA、JScript、コボル、sed、桐…くらい。
335ひろっち:2000/08/25(金) 21:06
ひろっちだ。
少なくとも文字列の扱いにおいて
C より perl のほうが明らかにビギナー向けであるから
331=334の比較は偽である。
以上。

336名無しさん:2000/08/25(金) 22:08
文字列がどうとかなんて本質じゃないよ。
実際、文字列を扱えても、そこからさきは「プログラムとは
なにかすごいグレートな呪文がふにゃふにゃと集まってる」
ようなイメージしか持ってないんじゃないのかね。
この板見てるとそう思うよ。
337名無しさん:2000/08/25(金) 22:25
何事も自分が出来ないことは難しく見えるものである。
338ひろっち:2000/08/25(金) 23:09
ひろっちだ。
ビギナー向けかどうか、についての基準について
議論の余地があるようだが
不毛なのでやめようね。
くだらないし。
以上。
339名無しさん@指にウンコ付いてた:2000/08/26(土) 02:34
簡単に動かせるのは事実。
N88-BASICより更に簡単
340名無しさん:2000/08/26(土) 02:54
>>336は他の言語は使ったことはないの?(C/C++/Basic/Pascal/etc...)
他のに比べると標準で使える文字列関係の関数にはかなり便利なものがたくさんあるよ。
むしろ、あなたがプログラムに不向きなのかもね。
341名無しさん:2000/08/26(土) 04:40
334=336だ。スキルは知らんが対人関係は確かにプログラマ向きではないな。

言語に便利なファンクションがあるのは当たり前だろう。あほか?
ifなどの文法、それから派生する手法がトリッキーだっつーの。

違うってんならシュウォーツ変換ばりの記述がある言語と例をあげてくれ。
俺が勉強不足なだけかも知れないからな。
342名無しさん:2000/08/26(土) 08:39
シュウォーツって、Schwartz変換のこと?
@array = sort func @array;
だって初心者なら構わないでしょ。
初・中・上級者で書き方、効率が違うのは当たり前だろう。
例に意味がないっつーの。

Perlが解りづらい言語だから、ではなく、身近だし、とっつきやすいので
手を出す奴が多いが、まともに勉強している割合は少ない(当たり前だけど)
から、336のような印象を受けるんだと思うね。

まあ、本当のことがわかるわけもないのでさげ。
343>329:2000/08/26(土) 10:07
むむ、なるほど・・・

でも、もう一声御願いできませんか?
344名無しさん:2000/08/27(日) 13:27
age
345日本語でのソート:2000/08/28(月) 03:25
以下のCSVファイルがある場合において,
例えば,html上のボタンで第一要素を用いて
日本語50音順にし,その結果を別のCSVファイルに,
出力するにはどのようにすればよいのでしょうか?
ご親切な方おられたらよろしくお願いします。

↓元のCSV
ほっかいどう@`くしろ@`くっちゃん@`
やまがた@`さかた@`しんじょう@`
かごしま@`まくらざき@`ちらん@`

346japu:2000/08/28(月) 04:31
#! /usr/local/bin/perl -w

open IN@` "moe.csv" or die;
open OUT@` "> ordered.csv" or die;
@ordered = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_@` (split /@`/)[0]] } <IN>;
print OUT @ordered;

__END__

CGI として動作させるところは自分で考えて下さい。
347名無しさん:2000/08/28(月) 07:08
printf "%4.2f\n"@` 10.00;
printf "%4.2f\n"@` -10.00;
printf "%4.2f\n"@` 100.00;
printf "%4.2f\n"@`-100.00;
を実行しても以下のようになり桁が合いません。
どこがいけないのでしょうか?
10.00
-10.00
100.00
-100.00
348名無しさん:2000/08/28(月) 07:42
sprintf な >>347
349名無しさん:2000/08/28(月) 10:45
perl で書かれた電子掲示板等の CGI を使っているのですが、
私は「MS漢字コード」が大嫌いでして、CGI に関しては
EUC-JP を使っています。

ただ、HTML は ISO-2022-JP を使ってまして、掲示板も
JIS にしようかと jcode.pl での指定を 'jis' にした上で
掲示板の CGI を JIS にエンコードしてFTPでアップロード
しても "500 Server Error" が出てしまいます。

jcode.pl ではなく nkf を使わなければ解決しないのでしょうか???
350名無しさん:2000/08/28(月) 12:10
>347
"%4.2f"つーのは、「小数点の左4文字:右2文字」じゃなくて
「全部で4文字:右2文字」って意味です。
-100.00まで出したいなら全部で7文字だから"%7.2f"が正解
351名無しさん:2000/08/28(月) 13:49
$a = "おなか\@いっぱい"
と言う文字列から
$b = "おなか"
$c = "いっぱい"
というふうに出力するためにすはどうすればよいのでしょうか?
352さゆ:2000/08/28(月) 14:31
はじめて質問します。かなり初心者ですみません。

・HTMLの中に、コメントでキーワードを二つ入れる。
(&lt;!-- はじめ --&gt;と&lt;!--おわり--&gt;)

・フォームで新たに文章を入力すると、そのタグの
間が書き換わって出力される。他の部分は変わらない。

ということをやりたいのですが、なかなか上手く行きません。
どうやったらよいか、教えてください。
よろしくおねがいします。
353NoName:2000/08/28(月) 17:05
>>351
($b@`$c) = split(/\@/@` $a);
かな?
354名無しさん:2000/08/28(月) 17:09
>>349
漢字コード以外の問題では?
$ perl -wc script_name
してチェックした結果はどうなんでしょう?

>>351
if ($a =~ /([^\@]+)\@([^\@]+)/) {
$b = $1;
$c = $2;
}

>>352
CGI の話でいいのでしょうか?
前半は print "&lt;!-- はじめに --&gt;\n"; とか適当にやって。
後半は CGI では無理。Javascript なら可能。
355351:2000/08/28(月) 17:29
>>353 534
どうもありがとうございました。
助かりました。
356NoName:2000/08/28(月) 17:49
>>352

作ってみましたよん
以下は、「www.hoge/bbs/」にbbs.htm @` bbs.cgi を設置したものとして
います。

--------------- bbs.htm --------------------------------------
<html><head>
<title>bbs</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<font color=blue size="+2"> bbs </font>
<HR>
<table>
<tr><th width=25%>名前</th><th width=70%>コメント</th></tr>
&lt;!-- new --&gt;

&lt;!-- 新規書き込み用FORM --&gt;
<tr>
<form method=POST action="./bbs.cgi">
&lt;!-- ↑ cgiを指定する。htmと同じ場所の場合は変更しない --&gt;
<td><INPUT TYPE=text NAME=name SIZE=20></td>
<td><INPUT TYPE=text NAME=comment SIZE=100></td>
</table>
<INPUT TYPE=submit VALUE="書き込む" NAME="submit">
</form>
</body></html>

-------------- bbs.cgi ---------------------------------------
#!/usr/local/bin/perl

require './jcode.pl'; # jcode.pl
$htmfile = "./bbs.htm"; # cgiがあるパスからの相対パス
$htmfile2 = "http://www.hoge/bbs/bbs.htm"; # htmファイルの絶対パス

## --- フォームからのデータ処理
read(STDIN@` $buffer@` $ENV{'CONTENT_LENGTH'});

@pairs = split(/&/@` $buffer);
foreach $pair (@pairs) {
($name@` $value) = split(/=/@` $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C"@` hex($1))/eg;
&jcode'convert(*value@`'sjis');
$value =~ s/</\&lt\;/g;
$value =~ s/>/\&gt\;/g;
$value =~ s/\"/\&quot\;/g;
$FORM{$name} = $value;
}
$mode = $FORM{'mode'};
$name = $FORM{'name'};
$comment = $FORM{'comment'};
$comment =~ s/\r\n/<br>/g;
$comment =~ s/\r|\n/<br>/g;

## --- htmファイルの書き換え
$newmsg = "<tr><td>$name</td><td>$comment</td></tr>\n" ;
open(IN@`"$htmfile");
@new = ();
while ($line = <IN>) {
if ($line eq "&lt;!-- new --&gt;\n" ) { push( @new @` $newmsg ); }
push( @new @` $line );
}
close(IN);
open(OUT@`">$htmfile");
print OUT @new;
close(OUT);

# htmfileに飛ばす
print "Location: $htmfile2\n\n" ;

exit;
357さゆ:2000/08/29(火) 03:12
>>NoNameさん

できました! どうもありがとうございました。
とても丁寧なコードでわかりやすくて嬉しいです。
これからも頑張ってperl勉強していきたいです。
もう一度、本当にありがとうございました。
358japu:2000/08/29(火) 03:29
> 掲示板の CGI を JIS にエンコードして

Perlとかで書かれたCGIプログラムをJISにしているの?
うまく行かなくなることが多いよ。

プログラムは EUC-JP、出力は JIS が吉でしょう。
内部の取り扱いも EUC-JP が吉。
359名無しさん:2000/08/29(火) 05:41
配列を空にするには普通どうするんでしょうか?
splice(@a@`0@`@a);
というのを考えたんですが、一般的でない気がします。
360日本語でのソート:2000/08/29(火) 05:44
>347
ソート部分はこれで良いのですね。ありがとうございました。
ソート部分が解れば何とかなりそうです。
361359:2000/08/29(火) 06:31
自己解決しました。
@a=();
でいいのか。
362名無しさん:2000/08/29(火) 06:34
@a=undef;
とかでもいいよん。
363名無しさん:2000/08/29(火) 06:45
配列って使った後は空にした方がいいんですか?
364名無しさん:2000/08/29(火) 06:47



            ノ ‐─┬       /
          @`イ  囗. |      / _ 丿丿
            |    __|    ―ナ′
                     /  ‐' ̄
              @`‐       /
            ナ' ̄       /   、___
     /      ノ`‐、_
    / _ 丿丿  _メ       | _/
  ―ナ′     〈__         X / ̄\
   /  ‐' ̄               / V   /
   /       \   l       レ ' `‐ ノ
  /   、___  Χ ̄ ̄〉
             \ 丿       /
              \          / _
                    ―ナ′__
     | _/       ̄ ̄〉     /   @`
    X / ̄\       ノ     /  _|
   / V   /             /  く_/`ヽ
   レ ' `‐ ノ  ―――'フ
              / ̄      ┼┐┬┐
 み            |          〈 /  V
 つ           `−      乂   人
 を
             ┼‐      |  ―┼‐
             ┼‐       |    |
             {__)      |   _|
                        |  く_/`ヽ

365名無しさん:2000/08/29(火) 06:56
>364
あんた、天才だよ。
朝から笑わせてもらった。
366名無しさん:2000/08/29(火) 11:20
>>364
伊集院光・深夜のバカ力のリスナーでしょ?(藁
367349:2000/08/29(火) 11:43
>>354
まだJISに変換したスクリプトのデバックはしてないのですが、
単純なスクリプトを書いてJIS変換してもダメでした。↓こんなのです。

#!/usr/local/bin/perl

print "Content-type: text/html\n\n";
print "あいうえお";

>>358
やっぱりダメですか。結局CGIでHTML(等)を出力するには
EUC−JPばかりです。

スクリプトをMS漢字→EUCに変換した上で以下のような感じに
するだけで宜しいのでしょうか?

&jcode::convert(\$value@`'jis');
&jcode::h2z_jis(\$value);
368349:2000/08/29(火) 12:06
すいませんでした。解決しました(^^;

たった2行で解決しました。私が使っているサーバの nkf のパスは
/usr/bin/nkf で、以下の2行を付け加えるだけで解決・・・
これで問題ないでしょうかね?

$nkf = "/usr/bin/nkf";
open(STDOUT@`"|$nkf -j");
369349:2000/08/29(火) 12:14
>>354
>まだJISに変換したスクリプトのデバックはしてないのですが(自己レス)

syntax OK でした。
370ヨウボウ君:2000/08/29(火) 12:23
パーミッションの設定のやりかた教えて下さい。
371名無しさん:2000/08/29(火) 12:29
>>370
FTPソフトで変えるのが一番簡単。
372名無しさん:2000/08/29(火) 12:54
>>371
Perlでだろ
chmod(mode@` file)
373379:2000/08/29(火) 13:50
>>371
>>372
有難う御座いました
374名無しさん:2000/08/29(火) 14:13
自分のHPにgoogleなどのサーチエンジンの検索窓をつけたのですが
漢字コードが違うせいか文字化けしてしまいます
検索窓に入力された文字を任意の漢字コードに直して
サーチエンジンのCGIに送るにはどうすればいいのでしょうか?
PerlかJavaScriptでできますか?
375名無しさん:2000/08/29(火) 14:40
>374
364を読むべし!!
376名無しさん:2000/08/29(火) 16:06
$a = 'http://tako.2ch.net/perl/index2.html'
と言う変数から
$b = 'http://tako.2ch.net/perl/'

$c = 'http://tako.2ch.net/'
のようにさらに階層を登ったURLに変換する
方法はありますでしょうか?
377名無しさん:2000/08/29(火) 16:15
($b = $a) =~ s|/[^/]+$|/|;
で どうだろう?
378364すげーな:2000/08/29(火) 16:17
あんたすごいよ。
他に作品が見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい
見たい見たい見たい見たい見たい
見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい
見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい
見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい
見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい見たい
379名無しさん:2000/08/29(火) 20:48
コピペ(364)にそこまで反応するなよ。
380名無しさん:2000/08/29(火) 21:51
378は多分364と同一人物です
ところで検索窓どうやればいいんでしょうか?
381名無しさん:2000/08/29(火) 22:27
>>374 >>380
検索フォームを設置するHTMLの文字コードを
日本語EUC (EUC-JP) にしておけば手軽で安心(^^)
382名無しさん:2000/08/29(火) 22:32
>>381
googleはsjisじゃないとだめみたいなんです、、、
検索窓おいてあるhtmlはeucなんですが
383腐れ厨房:2000/08/29(火) 22:50
>>382
んで検索窓置いてあるhtmlをsjisにしたくないんなら、フレームで別のhtml(sjis)上の検索窓を読み込むってのはどですか?
384名無しさん:2000/08/29(火) 22:50
>>382
google って http://www.google.com/ のことでしょうか?
それを今覗いてきたのですが、SJISでした。
検索窓を置くHTMLをSJISにすればOKなのでは?
当然ながら、半角カナが入力されないと云う前提で。
385361:2000/08/30(水) 06:04
>362
だめみたいよ。以下の結果をみると$a[0]にundefがあるみたい。

@a = (1@`2@`3);
printf @a . "\n";
@a =undef;
printf @a . "\n";

@b = (1@`2@`3);
printf @b . "\n";
@b =();
printf @b . "\n";
386名無しさん:2000/08/30(水) 08:32
@a = undef; はイカン
undef @a; にせれ
387>385:2000/08/30(水) 09:30
こう?

#!/usr/local/bin/perl

@a=(1@`2@`3);
print join('@`'@`@a)."\n";
@a=undef;
print join('@`'@`@a)."\n";

@b=(1@`2@`3);
print join('@`'@`@b)."\n";
@b=();
print join('@`'@`@b)."\n";
exit;

undef @aの方が好き。
388BK:2000/08/30(水) 10:12
perlでデータベース(ACCESSとかオラクルとか)って扱えるんですか?
まったくの初心者なので正確に質問ができないかもしれませんが、よろしくおねがいします。
389名無しさん:2000/08/30(水) 11:06
ACCESSは扱えないんじゃ?
オラクルは扱えるよ。
390BK:2000/08/30(水) 12:02
そうなんですか。ACCESSは使えないんですかモジュール使えばなんとかなるかなぁと思ってました。
そう言う詳しい説明が載ってるHPってありますか??
探してるんですけど、なかなか難しくって・・・・
HPあったら教えてください。
391名無しさん:2000/08/30(水) 12:33
自分もきぼーん
データベースを勉強できるホームページってあまり無いような気がします
392名無しさん:2000/08/30(水) 12:38
>388
つかえるよ。
DBIとDBD::ODBCモジュール使えばいけるはず。
俺自信はつかったことないけど。
393名無しさん:2000/08/30(水) 12:40
>391
ここでURL書くのはあれなんで、gooいってDBIで検索かけて
みてくれ。
394BK:2000/08/30(水) 13:00
情報ありがとうございます。
検索してみます。
395名無しさん:2000/08/30(水) 14:53
ちょっとお聞きしたいのですが、
http://ryan.sys.i.kyoto-u.ac.jp/~tokuda/inng/inng.cgi?newsgroup=2ch.test&message-id=8oi73m$ogj$1@ryan.sys.i.kyoto-u.ac.jp
ここに書かれているモナーの左耳が変なんですけど、なんででしょう?
ソースを表示させたらべつにどちらも同じ文字なんですけど、、
ブラウザのせいかなぁ?
HTTP_USER_AGENT: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) です。
396BK:2000/08/30(水) 16:04
DBIとDBD::ODBCモジュールは手に入れて解凍していっぱいファイルができたんですが、
これじゃまだインストールしたことになりませんよね??
この後ってどうやればいいんでしょうか?
397名無しさん:2000/08/30(水) 16:21
WindowsのActive Perlだと簡単なんだけどなぁ。
./configure
make
make install
とかするのかな?
398名無しさん:2000/08/30(水) 16:27
以下の手順のモジュールは多いです。DBI、DBDも
同じかどうかは知りません

perl Makefile.PL
make
make test
make install
399BK:2000/08/30(水) 16:28
>397さんレスありがとうございます。
WindowsNTを使ってまして、ActivePerlも入ってます。
ただActivePerlの使い方がよくわかりません。
DOS窓でそのコマンド(?)を打てばいいんでしょうか?
400名無しさん:2000/08/30(水) 16:44
Active Perlならppmを使うんだよ。
DOS窓でppmと打ち込んでhelpで大体の使い方は判ると思います。
具体的にはinstall dbiでokです。
401BK:2000/08/30(水) 17:42
>398さん、400さんありがとうございます。
やってみます。
402名無しさん:2000/08/31(木) 01:20
perlスクリプトの上の方の設定部分に間違えて

$

とだけ書いてしまってたんですが
CGIで実行したら
SCALAR(0x876f0b0)
という謎のファイルが。。。
これって何なんでしょう?
403名無しさん:2000/08/31(木) 02:10
$foo_ref = \$foo;
とすると、$$foo_ref が $foo をあらわし、$ref は SCALAR(0x876f0b0) というようなリファレンスを
あらわしているんだけど、その辺の副作用じゃないの?
404名無しさん:2000/08/31(木) 03:58
こんにちは。
間抜けな質問で申し訳ありませんがご指導いただければ幸いです。

Carlさんの掲示板Ver.3.12を設置してみたのですが
(Macなんですが.sitファイルが開かず、Win用.zipファイルをダウンロードして
Jeditで開き、改行コードをUNIXのまま必要な部分を書き換えました)、
これにKENTさんのG-LIGHTのようにプルダウンメニューから
好きな画像アイコンを選択して書き込みメッセージ横へ表示するようには
できないでしょうか?

またべつに、リモートホスト表示(オンライン時にブラウザしている本人にだけ
見えるようにする設定)は可能でしょうか?

どうぞよろしくお願いいたします。
405:2000/08/31(木) 04:01
ブラウズ、です(^^;;失礼しました。
406名無しさん:2000/08/31(木) 04:15
カール板にアイコン…
407名無しさん:2000/08/31(木) 10:30
cgiでhtmlを表示さすだけのcgi何ですがエラーが出てしまいます、
copalで表示されるエラーは
Unrecognized character \x81 at C:\Documents and Settings\tmp\copal163\copal.tmp line 33.
です、この情報だけで答えられる人居ましたらご回答下さい
ちなみに33行目付近は
32:&header;
33: print <<'__html__';
34:
35:<html><head>
となってます、&headerではgzipを追加したりしてますが
header部分は壊れてないはずですが
408>407:2000/08/31(木) 11:34
 print <<'__html__';
↑これが全角スペースだから
409407:2000/08/31(木) 12:32
ノ(´д`)ありゃ、、
ありがとうございました
410名無しさん:2000/08/31(木) 17:54
掲示板に検索機能をつけようとしてます。
jcode.pl(ver2.11)を使って入力されたキーワードをEUCに
変更しようと思ったら、Shift_JISの「車」という1文字が
うまく変換できません。つまり、

$word = '車'; #Shift_JIS
&jcode::convert(\$word@` 'euc');

と書いても$wordの中身はShift_JISのままなのです。
どうしたらいいでしょう。
jcode.plではなくXXXを使え、とかいうご意見でもいいので
教えてくださーい。
411名無しさん:2000/08/31(木) 18:17
&jcode::convert(\$word@` 'euc'@` 'sjis');
はどでしょ?
412名無しさん:2000/08/31(木) 18:26
&jcode::sjis2euc(\$word);
413名無しさん:2000/08/31(木) 18:37
個人的な趣味だけど
Jcode.pm使って

use Jcode;
$sjis = '車';
$j = Jcode->new($sjis@`sjis);
$euc = $j->euc;

が好きだなぁ

あとは
chomp ($nkf = `echo $sjis | nkf -e`);
とか? nkfについては普段は使ってないので適当かも.間違ってたらスマン.
414名無しさん:2000/08/31(木) 19:02
おいらは Kconv.pm が好き
415410:2000/08/31(木) 19:39
>411さん、412さん、413さん
jcode.plやJcode.pmで、入力コードも明示的に指定すれば
いいんですね。やってみました。できましたー。
ありがとうございました。
この場合、検索フォームのページでcharset=Shift_JISを指定しとけば
CGIは必ずShift_JISコードを受け取ると思っていいのですか?
UNIX系のOSのブラウザとかでも。

あと413さんのnkf方式も、試してみたところ、ばっちりでした。
これだと'車'がSJIS@`EUC@`JISのどれで入力されてもうまく変換できました。
でも調べたのは'車'だけなんで、ほかの文字だとどうなるかわからないので
やっぱり入力コードを明示的にsjisと指定する方法でいきます。

>414さん
Kconv.pmは手元にないんで、あとで探してきまーす。
416402>403:2000/08/31(木) 23:25
なるほど。
気になるんでその線でもうちょっと調べてみます。
ありがとうございました。
417名無しさん:2000/09/01(金) 01:06
>>413
Jcodeだったら
$euc = Jcode->new($sjis@`sjis)->euc;
でいいのでわ。
418413:2000/09/01(金) 11:19
適当なこと言ってすんません
nkfの奴他スレで突っ込まれてるけどcgiに書いたらセキュリティホールの元っすね
自分で使ってないことを書くもんじゃないね.マジ反省.

>>417
そうですね
他に元のオブジェクト使わない場合
419名無しさん:2000/09/01(金) 12:47
質問です。
Perlってなんて読むの?
ピール、ピエール、ピェラチオ?
420>>419:2000/09/01(金) 13:05
真珠の Pearl と同じ発音でいいらしい
だから パール でいいと思う
421むぎ茶:2000/09/01(金) 13:07
ネタにマジレス。420=ダウン症
422名無しさん:2000/09/01(金) 13:08
ピエールです。
18世紀初頭にピエール伯爵が考案したことからこの名が付けられました。
423名無しさん:2000/09/01(金) 16:36
ペルリを推奨。
424名無しさん:2000/09/01(金) 17:15
ActivePerl のアイコンって、モロに真珠じゃん。
425名無しさん:2000/09/01(金) 17:37
うちの会社ではペルールですね。
正式名称は何でしょうか?
426UG-Man:2000/09/01(金) 19:54
ペール
427名無しさん:2000/09/01(金) 21:08
ポールニューマン
428質問:2000/09/01(金) 21:16
$ENV{'REMOTE_HOST'} で アクセスログを取っていたのですが、突然取れなくなりました。
日付・時間も同時に取っていたのですが、日付と時間は記録されていて IPの欄は何も記録されないんです。途中でスクリプトをいじったとかいうことはありません。

どなたか解決方法を教えてください。
virtualaveのCGIです。
429名無しさん:2000/09/01(金) 21:17
23てん
430名無しさん:2000/09/01(金) 21:48
>428
ネタか?
431名無しさん:2000/09/01(金) 23:27
>428
一応マジレス。
Virtualは、リモホ取れなくなったぞ。
432428:2000/09/02(土) 01:41
Virtualaveで、どこのプロバイダから接続しているかどうかを調べるというのはもう絶対無理なんでしょうか?
何か方法があれば教えてください。
(つまり428で書いた方法以外があれば…ということになります)
433名無しさん:2000/09/02(土) 01:57
俺はVirtua使ってないんだけど
$ENV{'REMOTE_ADDR'}で取っておいて
必要になった時だけ
http://www.mse.co.jp/ip_domain/
とかで調べるってのは?
434名無しさん:2000/09/02(土) 01:59
× $ENV{'REMOTE_HOST'}
○ $ENV{'REMOTE_ADDR'}
435433:2000/09/02(土) 02:30
gethostbyaddrが使えるんならそれがいいけど
つーか、俺もVirtua使ってみよ。
436>432 :2000/09/02(土) 02:47
これでちゃんとホスト名取れてるよ
ちゃんと調べろ

$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if (($host eq $addr) || ($host eq '')) {
$host = gethostbyaddr(pack('C4'@`split(/\./@`$addr))@`2) || $addr;
}
437名無しさん:2000/09/02(土) 02:50
最近はhttpdでgethostbyaddrすると重くなるから
やらなんだよ。>リモホ取れなくなった理由

やりたきゃ上のようにするしかないね。
438428:2000/09/02(土) 03:04
たしかにREMOTE_ADDRで解決しました。
アドバイスありがとうございました。
439陽介:2000/09/02(土) 17:19
CGIのなかで、GET ACTIONを使用しなければ、

$buffer = $ENV{'QUERY_STRING'};

の一行は消してもいいと聞いたんですが、消せますか?
KENTのYYBBSです。
440むぎ茶:2000/09/02(土) 17:24


んなもんもともと必要なし。消せ消せ
441名無しさん:2000/09/02(土) 17:26
>>439
実際に掲示板を設置して、いかなるURLの末尾に "?" が
付かなければ必要ありません。

「次ページ」に進む手段などで、
http://hogehoge.com/cgi-bin/yybbs.cgi?next=5
                    ~~~~~~~
みたいなのが無ければOKです。

442441:2000/09/02(土) 17:27
ズレた。スマソ。
443むぎ茶:2000/09/02(土) 17:49


GETっつってるだろ、あまえの頭はタコか?
444あまえ:2000/09/02(土) 22:30
タコれ〜す
445名無しさん:2000/09/03(日) 22:46
お時間のある方、ご教授ください。

アクセスしてきた人のリファーを
前10アドレス位、URLを習得できないでしょうか。
JavaScriptでdocument.referrerだと1つ前は取れるのですが、
history.go だと アドレスを表示出来ないのです。

収集するつもりは無いので、データをサーバに保存することは
考えていないのですが。

観覧者がIE5以降でもURLを習得する方法はありませんか?
446名無しさん:2000/09/03(日) 23:30
保存しなければ無理
保存するときに、一番古いのを削って新しいのを加えればよい
447名無しさん:2000/09/03(日) 23:38
ヽ(´ー`ー´)ノアホカ
448名無しさん:2000/09/03(日) 23:41
まちがってたらゴメンなさいね。
445の質問って、10人ぶんのrefererを保存したいのじゃなくて
ある1人の訪問者が自サイトに来るまでたどってきた履歴を
10サイト前までさかのぼって暴きたいということでしょ?
449名無しさん:2000/09/03(日) 23:54
なるほど。
perlやjavascriptでソンナコドデキルワケナイダロヽ(´ー`)ノ
あくちぶXでもツカットケヽ(´ー`)ノ
450名無しさん:2000/09/03(日) 23:57
つーか、俺はjavascriptの方はあんまし知らないので
もしできるんだったらスマソ(;´Д`)
451名無しさん:2000/09/04(月) 01:12
445ってよほどバカなんだな。
笑えるこのスレ
452名無しさん:2000/09/04(月) 07:16
ファイルhoge.datから最後の行数求める方法で
open(DATA@`"hoge.dat");
@a = <DATA>;
close(DATA);

$#aで求めています、遅いのでいい方法教えて下さい。
453 :2000/09/04(月) 07:32
ありません。
454名無しさん:2000/09/04(月) 07:45
$gyousuu=@a;
455名無しさん:2000/09/04(月) 10:44
my $numOfLine = scalar(<DATA>);
456>452:2000/09/04(月) 12:09
遅いんじゃなくてメモリの問題じゃないの?

++$count while <DATA>;
seek DATA@` 0@` 0;
$skip = $count - $lastX;
<DATA> while $skip-- > 0;
@lines = <DATA>;
457名無しさん:2000/09/04(月) 12:20
あ、「最後の何行」じゃなくて単なる行数か。
458名無しさん:2000/09/04(月) 12:37
カウントする時も1行ずつ読み込んだ方が、全部読み込むよりも
速いみたいです。
459名無しさん:2000/09/04(月) 12:43
勝手にカウントしないで下さい
460名無しさん:2000/09/04(月) 15:32
文字列の中にus-ascii以外の文字が含まれているかどうかを判定するには、

if (/[^\x20-\x7f]/){
print "include non us-ascii";
}

というのより効率のいいのはありますか?
461名無しさん:2000/09/04(月) 16:00
use sigtrap;
ってしたら、たまに
Caught a SIGTERM at /path/to/hoge.cgi line 0
みたいなエラーメッセージがerror_logに残るんですけど、
デバグとかでどういうふうに利用したらいいんでしょうか?
462RRW:2000/09/04(月) 16:00
初心者質問です。ヒアドキュメントを書くと必ずエラーがでるんですが

print <<"HTML";
<HTML>
 |
</html>
HTML

って書いてるんですが、実行すると
Can't find string terminator "HTML" anywhere before EOF at C:\パス line○.
見たいにエラーがでてくるんですがこれって何の意味があるんでしょうか?
解決策を教えてください。よろしくおねがいします。
463名無しさん:2000/09/04(月) 16:09
読んで字のごとく
"HTML"という文の終わりがどこにも見つからない。
464名無しさん:2000/09/04(月) 16:24
print <<"END_OF_HTML";
<html>
 |
</html>
END_OF_HTML
465>460:2000/09/04(月) 16:50
if( tr/\x20-\x7F// ){
}
466名無しさん:2000/09/04(月) 17:10
>464
そういう問題じゃねーだろ
467名無しさん:2000/09/04(月) 17:10
>>465
message/rfc822 の From ヘッダの処理なので消されたら困るんですけど。
468名無しさん:2000/09/04(月) 17:14
>>466
やってみたのかよ。
469467:2000/09/04(月) 17:17
>>465
あと、それだと日本語に含まれる文字もエスケープコードみたいなの以外消えちゃいますね。
470名無しさん:2000/09/04(月) 18:27
>462
終りを示すHTMLは行頭から書いているか、
行末によぶんなもの(スペースとかタブとか)が
ついてないかを確認せよ。

# \rが悪さするなんてこたあねえよな??
471465:2000/09/04(月) 18:29
よく考えてみたら tr だと「全部探す」から、ひとつ見つかったら終了、の
正規表現より遅いかも…。

でも、消えはしないよ。やってみてから言ってくれ。
472460:2000/09/04(月) 18:56
>>471
すみませんでした。ごめんなさい。消えなかったです。

$str = 'HOGEHOGE';
$time = time;
for($i=0;$i<500000;$i++) {
if( $str =~ tr/\x20-\x7F// ){
$count++;
}
}
$time = time - $time;
print "tr: $count times match. time : $time sec.\n";
$time = time;
for($i=0;$i<500000;$i++) {
if( $str =~ /[^\x20-\x7F]/ ){
$count++;
}
}
$time = time - $time;
print "m: $count times match. time : $time sec.\n";

で、こういう感じでテストしてみたんですが、m///;のほうがはやいみたいです、、
473472:2000/09/04(月) 19:00
上のテスト、$countの初期化忘れてた、、すみません。
474名無しさん:2000/09/04(月) 19:10
その程度の処理で効率気にしてどうするんでしょ?
475472:2000/09/04(月) 19:34
たとえば本文全体が US-ASCII だった場合は
Content-Type: text/plain; charset=US-ASCII
にして、日本語が含まれていた場合は
Content-Type: text/plain; charset=ISO-2022-JP
というふうにしたいですよね?
本文が長いときとかそういう処理が連続する場合とかは
結構気になるんですけど、、必要なし?
476名無しさん:2000/09/04(月) 19:41
実際に実行してみて その部分がボトルネックになるならば
必要だろうけど 今の時点では必要ないと思います
ぼくだったら関数にわけるだろうし もっと実行効率は落ちるだろうけど
ぜんぜん気にしません
計算量のオーダーがかわるアルゴリズムなら設計時に気にしますけれど
たかだか数%の速度向上ならたいていの場合無視します
477472:2000/09/04(月) 20:43
なるほど。たしかにそうですね。
ちょっと気にしすぎてました。
どうもありがとうございました。
478名無しさん@ぱーら:2000/09/04(月) 22:59
if(index($_@`"\x20\x21\x22...(省略)\x7f")>=0)
はどうよ?
479名無しさん@ぱーら:2000/09/04(月) 23:00
問題を勘違いしてた。すまん。
480名無しさん:2000/09/04(月) 23:15
質問なんですが・・・。

Win32 APIのIsDBCSLeadByteみたく
文字が2バイト文字の先頭バイトかチェックする方法ってありますか?
481名無しさん:2000/09/05(火) 00:30
&nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;($ret)&nbsp;=&nbsp;@_;
&nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;$entity&nbsp;=&nbsp;qr/(#\d{1@`4}|#[xX][a-fA-F\d]{1@`4}|
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute)/;

&nbsp;&nbsp;&nbsp;&nbsp;$ret&nbsp;=~&nbsp;s/&/&amp;/g;

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($ret&nbsp;=~&nbsp;/&.+;/)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ret&nbsp;=~&nbsp;s/&amp;($entity)/&$1/g;
&nbsp;&nbsp;&nbsp;&nbsp;}

正規表現の中でパターンが上のようにとても長い(まだつづく)のですが、このままだと、'nbsp' にもマッチしてほしいのに、改行したりしているため "\n\s+nbsp" にマッチしてしまいます。
見易さのために適当なところで改行を入れたいのですが、うまい方法はないでしょうか?
482名無しさん:2000/09/05(火) 00:32
ぐは、&amp;amp;と&amp;が混じって見づらい。。
まぁ、本題とは別のところなのでいいか。
483名無しさん:2000/09/05(火) 00:44
>>480
charset は何でしょうか?JIS なら
http://www.asahi-net.or.jp/%7EBD9Y-KTU/dtd_f/rfc_f/rfc1468j.html
にあるように
ESC "$" ( "@" / "B" )
のあとの文字を1バイトづつ読んで、奇数なら先頭バイト、偶数ならそうでない、みたいにすればいいかも。
ほかのコードはわかりません。ていうか、この JIS の説明もかなり怪しいです。すみません。
484名無しさん:2000/09/05(火) 03:31
>481
my $entity = qr/〜略〜/x;
ぢゃダメなん?
485名無しさん:2000/09/05(火) 04:34
>484
できました!
あと、# を \# にしました。
なるほど、こういうときに使うオプションだったのか。>x
どうもありがとうございました。
486名無しさん:2000/09/05(火) 05:03
Use of uninitialized value at /usr/lib/perl5/site_perl/5.005/i586-linux/Jcode.pm line 470@` <SOCK1> chunk 279.
Use of uninitialized value at /usr/lib/perl5/site_perl/5.005/i586-linux/Jcode.pm line 477@` <SOCK1> chunk 279.

Jcode.pm が上のようなエラーメッセージを出すのは
入力に JIS X 0201 (半角カナ) と ISO-2022-JP の両方が含まれているからでしょうか?

Jcode.pm の該当する行
470 return $$r_str if $icode eq $ocode; # do nothin'
477 load_module("Jcode::Unicode") if $icode =~ /ucs2|utf8/o;

ふつうは自動判定するのに、相反するようなコードが含まれているからエラーになる、
という認識でよろしいでしょうか?
487名無しさん:2000/09/05(火) 07:02
>>480
Shift_JISの場合、全角文字の先頭バイトは必ず[\x80-\x9f\xe0-\xfe]で始まっているそうです。
これを利用すればできるかも?
488名無しさん:2000/09/05(火) 16:47
個人で Perl スクリプト書くのに、サブルーチンとかのモジュール化は必要ですか?
これくらいの規模になってきたらモジュール化したほうがいいとか、最初からオブジェクト指向を考えて
書いていったほうがいいとか、あるんでしょうか?
489名無しさん:2000/09/05(火) 16:58
>488
オブジェクト指向で書きたければ、クラスごと(あるいは
共通のベースクラスごと)にモジュールにしていった方がよいでしょう愛

OOでなくてもいいやとか、OOはあまり勉強してないという人は
普通のモジュールにした方がいいでしょうね。

いずれ大きくなりすぎてファイル分割するとわかっているのなら、
require 'myproj-utils.pl' よりも use MyProj::Utils の方が
よいでしょう。

perldoc perlmodlib@` perlxstut@` h2xsなどを参照のこと。
490Syn:2000/09/05(火) 17:04
491名無しさん:2000/09/05(火) 20:50
nobodyで動いているCGIから、
パーミッションで書き込み許可が付いていないファイル(r--)を
削除するには、どうしたら良いんでしょう…。

$cfile=@_;
eval{chown($>@`$)@`$cfile);};
if($@){ print "<font color=#FF0000><b>chown to [ $uid + $gid ] …失敗…</b></font><br>\n"; return; }
eval{chmod(0777@`"$cfile");};
if($@){ print "<font color=#FF0000><b>chmod 0777 失敗…</b></font><br>\n"; return; }

こんな関数組んで、
evalの結果を見る限りでは成功してるようなんだけど
問題のファイルは残ったまま…。
どこが悪いんでしょう?
492491:2000/09/05(火) 20:52
あ…忘れた。
上のやつの後、こんなコトしてます。

open(DT@`"+< $cfile");
eval{flock(DT@`2);}; truncate(DT@`0); seek(DT@`0@`0); print DT "";
close(DT); ## FileSizeを0にして削除する
unlink("$cfile");
print "<b>Complete.</b><br>\n";

(rw-)だと、サイズが0にはなるんだけど、unlink出来ないみたいです。
493>491:2000/09/05(火) 22:16
消すのはそのディレクトリが xx7 でないと駄目では?
494名無しさん:2000/09/05(火) 22:42
>>493
xx6で可能?ディレクトリンに書き込み権限あればOKでしょ
495493:2000/09/05(火) 22:54
うんにゃ、ディレクトリの実行権はアクセス権なので
たぶん駄目だと思います。
496名無しさん:2000/09/06(水) 00:38
>486
エラーというよりヲーニングすね。
文字コードがうまく判定できないで変数$icodeが未定義のまま
該当行を実行するとこの警告がでてきます。だから

>ふつうは自動判定するのに、相反するようなコードが含まれているからエラーになる、
>という認識でよろしいでしょうか?

でオッケー。ちなみに相反する文字コードじゃなくても
"ココモマターリスレニンテイ(;´ー`)y−〜〜"
てな文字列を与えても、おなじ警告がでました(ワ
497別の話:2000/09/06(水) 04:03
for(;;)
{
  open( FILE @` "file.dat" );
  if(<FILE>)
  {
    last;
  }
  close( FILE );
}

file.datの中身が真になるまでのループなんですけど、
これはfile.datの中身を壊しますか?
498480:2000/09/06(水) 04:16
> 483さん、487さん、Synさん

アドバイス大変参考になりました。
ありがとうございました。
499japu:2000/09/06(水) 04:47
1 while(not -s "file.dat");
とするのが良いと思います。ハイ☆

# 別の話さんのやり方でもファイルの中身を破壊することはありませんが。
500491:2000/09/06(水) 05:36
>>493-495
う…ディレクトリか…。忘れていた…。
ありがとうございます、そっちからチェックしてみます。
501超初心者:2000/09/06(水) 05:55
全くの初心者ですみませんがよろしくお願いいたします。

文章の入力のページとそれが出力されるページが違うモノが作りたいです。

友達にHP作ってあげていて、その人用に文章入力のためだけの
ページを渡し(もしくはそのページのURLだけを教えて)、
そのページに文章を入力するとあらかじめ作っておいた
ヒナ型のページにその内容が反映されるということがしたいのですが
どのようにすればよろしいのでしょうか?

わかりづらい質問ですみませんがご教授下さい。
502むぎ茶:2000/09/06(水) 09:55
501へ
初心者とバカとは違います。
あなたにはお花畑板が似合いそうです

〜501は放置〜
503>501:2000/09/06(水) 10:21
入力フォーム部と過去ログ表示部が分かれてるやつでしょ?
お知らせ用に管理者が使うような。
改造なら簡単だけど。探せば専用のものもあるよ。
504501:2000/09/06(水) 13:08
>503さま   その通りです。
そういったモノの検索サイトってあるのでしょうか?
505toc:2000/09/06(水) 13:17
表示部のCGIでリファラが入力用フォームからのものかチェックし、
入力用フォームからそのCGIを呼び出すだけでいいんじゃないの?
506503:2000/09/06(水) 14:44
まず適当な板をDLして、メインのCGIだけコピーして2つ用意します。
1つは管理者用にそのまま使い。もうひとつはログ表示用に投稿フォーム
の表示部を削除します。ページからリンクさせるのは後者だけ。

検索あるらしいけど知らないね。知ってるのはHP板の人じゃないの。
507名無しさん:2000/09/06(水) 14:49
>>499
japuさん、ビジーウェイトしてまっせ。
sleep 1 while -s $file;
だったらよいか?
508名無しさん:2000/09/06(水) 17:59
HTMLファイルを読み込んで
それをテキストベースで編集できるCGI捜しています。
509名無しさん:2000/09/06(水) 18:37
頑張ってください!
510名無しさん:2000/09/06(水) 19:11
>508
メモ帳を使え
〜完〜
511toc:2000/09/06(水) 19:12
>>508
フォームの中で
print "<textarea name=\"hoge\" cols=\"70\" rows=\"15\">";
print read_html("filename");
print "</textarea>\n";
でいいんじゃないの?submitで保存。
512japu:2000/09/06(水) 21:01
499:
あぁ。ゴメン。コピー失敗していた。
最初に sleep 入れていたんだけど。
てなわけで、
sleep 1 while(not -s "moe.txt");
513名無しさん:2000/09/06(水) 21:40
TXTファイルを読み込んで
それをCGIの出力結果で

<html>
<head>
<title></title>
<head>
<body>
<pre>
ここにTXTの内容を入れたい
</pre>
</body>
</html>

と排出させるやつを考えているのですが
今までデザインを変えるくらいしか
やったことないので どうか教えてください。
514japu:2000/09/06(水) 22:25
open FILE@` "< moe.txt" or die;
print "<pre>\n";
print while(<FILE>);
print "</pre>\n";
515513:2000/09/06(水) 22:50
本当に初心者なんで
#!/usr/local/bin/perl
からの記述希望です。
本当に情けないのですがよろしくお願いします。
516513:2000/09/06(水) 22:55
できました。
やっぱり基本もわからないと
つらかったです ありがとうございました。
517508:2000/09/06(水) 23:30
>>513
それでHTMLがテキストエリアに表示できましたが
それを書き換えて保存する方法がわかりません。
すみませんが 保存する方法を教えてもらえないでしょうか?
&SJIS変換で。
518名無しさん:2000/09/06(水) 23:49
自分ではどうやればいいと思う?
ほかのページとかみて考えなさいな

まずFORMを扱えるようになりましょう
いきなりファイルを編集しようとするまえに。
あとは <pre> を<textarea> に変えればうまくいくと思うぞ
519名無しさん:2000/09/06(水) 23:50
>>517
努力のあとがうかがえないな、シンデネ
520508:2000/09/07(木) 00:00
517の>>513>>511の間違えでした
521名無しさん:2000/09/07(木) 00:03
↑なんだよ、似たような質問が2つあったのかよ。
522508:2000/09/07(木) 00:16
すみません まぎらわしいことしてしまって

一応フォームからテキストエリアの内容をCGIに渡すことは
わかりますがそれの書き込み方がわからないのです。
よろしくお願いします。
523508:2000/09/07(木) 00:22
$aaaという変数(テキストエリア)を
aaa.htmlに出力させる方法がしりたいです。
言葉下手なんでどうかこの辺で勘弁してください。
524名無しさん:2000/09/07(木) 00:23
Perl初心者です。教えてください。普段はCをやってます。
IPアドレスの管理方法についてです。
アンケートなどで一人1票の場合IPをファイルに保存して
以降そのファイルにまだ保存されていないIPのみ有効にすればいいですよね?
それでIPの比較の方法ですが、たとえば 127.0.0.1 とかのIPの場合文字列で
比較するのが簡単ですがそれだとスピード的に遅いので4バイトのバイナリ
(CでいうDWORD)で比較するのがいいと思いますがPerlでできますか?
自分が読んでる本にはPerlには数値と文字列の区別が無いとか書いてあるんですけど。
数値と文字列の区別がないならDWORDみたいなことってできませんよね?
525名無しさん:2000/09/07(木) 00:36
open(OUT@`'>aaa.html') or die;
print OUT "$aaa";
close(OUT);
526>524:2000/09/07(木) 00:38
できるんならCでやろうよ(;´Д`)
527名無しさん:2000/09/07(木) 00:39
>524
pack とか使えばできるだろうけど、この場合
ハッシュにつっこんで検索のほうが簡単便利で十分早いと思うが
528名無しさん:2000/09/07(木) 00:47
525の補足
textarea に表示・保存する場合、たいていの場合
TAGの変換が必要になると思うので気をつけて。
SJIS変換はjcode ですな。
529508:2000/09/07(木) 00:57
#!/usr/local/bin/perl

require './jcode.pl';
$aaa = $FORM{'bbb'};
&jcode'convert(*aaa@`'sjis');
open(OUT@`'>ccc.html') or die;
print OUT "$aaa";
close(OUT);
__END__

で500エラー出てしまいました。
改行コードの統一などは後でつけるつもりなのですが
どこかおかしいところはあるでしょうか?
530名無しさん:2000/09/07(木) 01:06
>508
print "Content-type: text/html\n\n";
print "<HTML>セーブ終了</HTML>";
が無いんじゃないか?(笑)
531名無しさん:2000/09/07(木) 01:14
>>508
print "Content-type: text/plain\n\n終了\n";
がないんじゃないか?(ワラ
532508:2000/09/07(木) 01:17
531さん 答えてくださったみなさんありがとうございます
どうにかできました。

本当にありがとうございました
533名無しさん:2000/09/07(木) 01:22
なんだ、ネタだったのか(;´Д`)
534名無しさん:2000/09/07(木) 02:06
>524
おれもバイナリにする必要ないと思うけど、いちおう・・・

$ip = "127.0.0.1";
$dword = pack("C*"@` split(/\./@` $ip));

逆変換は
$ip = join("."@` unpack("C*"@` $dword));

またはSocketモジュールを使って
use Socket;
$ip = "127.0.0.1";
$dword = inet_aton($ip);

この場合はホスト名でもオーケー。
use Socket;
$ip = "localhost";
$dword = inet_aton($ip);
535名無しさん:2000/09/07(木) 05:19
524です。

レスして頂いた方ありがとうございます。
バイナリ変換の必要なしってことですね。

自分がやろうとしてたことをCで書いてみます。
簡単に書くために一部省略してあります。
こういうことってpackなどを使用すればPerlでできますか。

BOOL IP_check(char *IP) // IP...チェックするIPです。とりあえず( 127.0.0.1 )
{
DWORD new_IP;
DWORD file_IP[1000]; //ファイルから読み込むIP格納用(実際は malloc などで動的に確保)
LONG i @` file_IP_num;

new_IP=(127<<24)+(0<<16)+(0<<8)+1; // char *IP を DWORD に変換。実際はちゃんと処理します。(省略です)
file_IP_num=read_IP_file(file_IP); // ファイルに保存されているDWORD配列(バイナリ)IPを読み込みます。
for(i=0 ; i<file_IP_num ; i++)
{
if(file_IP[i]==new_IP) return FALSE; // すでに同じIPがあるので FALSE を返します。
}
file_IP[file_IP_num]=new_IP;
save_IP_file(file_IP @` file_IP_num+1); // DWORD配列にIPを追加しバイナリのまま保存します。
return TRUE;
}

DWORD配列みたいなのを作ってループ構造で各配列要素と比較ってできますか。
それとCGIでCって使えますよね?
どうやって使うんですか?CGI用のコンパイラとかあるんですか?
普段はVC++でWindowsのプログラム書いてるんですが、何故か急にCGIを書くことになりました。
それではよろしく。
536名無しさん:2000/09/07(木) 05:34
535を書いた524です。
すいません。ちょっと長かった。
しかもタブ文字がHTMLで省略されて読みにくい。
537名無しさん:2000/09/07(木) 14:49
>それとCGIでCって使えますよね?

標準入出力と環境変数の参照が使えれば何でもCGIになれます。
ただこの場合、CだろうがPerlだろうが DBM使うのがいいと思います。
(Winだと標準ではDBM無いですけどね、Cのみだと)
538名無しさん:2000/09/07(木) 15:51
以下のことをやるPerlスクリプトは、
どう書くのですか?

テキストファイルを標準入力で読み込んで、
ある長さごと
(たとえば、全角1000文字ごととか、2000バイトごととか)
に分割して、別ファイルに書き出す。

別ファイルのファイル名は、
file_1、file_2、file_3、…
というような適当な名前でOK。

よろしくお願いします。
539名無しさん:2000/09/07(木) 16:18
#! /usr/local/bin/perl

use FileHandle;

my $filePrefix = "test";
my $splitByte = 2000;

my $buf;
for(my $nth = 1;read(STDIN@` $buf@` $splitByte);$nth ++){
my $fh = new FileHandle();
$fh->open("${filePrefix}_$nth"@` "w") or die "Can't open file ${filePrefix}_$nth:$!\n";
print $fh $buf;
$fh->close();
}
540名無しさん:2000/09/07(木) 16:45
httpsのサイトからデータを取るため、Crypt::SSLを使用したスクリプト
を書いているのですが、どうも連続でデータを取りに行くとプログラム
が落ちてしまいます。以下にサンプルを示します。


use LWP::UserAgent;
#use LWP::Debug qw(+);

sub get_html
{
my $ua = new LWP::UserAgent;
my $req = new HTTP::Request(GET => $_[0]);
my $res = $ua->request($req); //ここで落ちる
#以下省略
}


$url= "https://www.asahi.com/"; //httpの場合
get_html($url); print "1\n"; //1回目OK
get_html($url); print "2\n";  //2回目OK

$url2= "https://www.nodeworks.com/splash.htm"; //httpsの場合
get_html($url2); print "3\n"; //1回目OK
get_html($url2); print "4\n"; //2回目NG


ということで最後の行を実行すると落ちてしまうのですが、なにかお気づき
の点がありましたら教えてください。

こちらの環境はActivePerl5.6 on Win2000でCrypt::SSLモジュールは
ppmでインストールしました。なおnodeworksというのはSSLのreadmeに
のってたアドレスで、httpsである以外特に意味はありません
541名無しさん:2000/09/07(木) 16:52
>540
初心者コーナーの範疇を離れてると思う
地道にデバッガで追ってみてはどうでしょうか?
542名無しさん:2000/09/07(木) 16:58
ちょっとした疑問ですが…
GETメソッドは URLに付加するから、
FORMタグで簡単にサーバー越せますよね。

そうすると…
POSTメソッドだと…STDINだから無理って事ですか?
それとも、それでもサーバーを越す方法があるのかな…。

Duke系の攻撃への防御を考えていて気付いたんですが。
もし越せないなら、メソッドをPOST限定にして作れば、
他サーバーからの攻撃は防げることになりますよね。
543名無しさん:2000/09/07(木) 17:07
538から539さんへ。ありがとうございます。
すばらしい。早い、安い、うまい、ですね。
動かしてみたら、ちゃんと、ばっさり分割してくれました。
2バイトの漢字コードの途中で分割するので、
漢字の場合、読めなくなるんで、
その対策は、僕のほうで考えます。
お手数おかけしました。
544名無しさん:2000/09/07(木) 17:14
>他サーバーからの攻撃は防げることになりますよね。
サーバーとクライアントの理解がごっちゃになってるな…。
545むぎ茶:2000/09/07(木) 17:15
>メソッドをPOST限定にして作れば、
>他サーバーからの攻撃は防げることになりますよね。


アホだね。

546542:2000/09/07(木) 17:46
マジアホでした。
別の板見ていて気付きました。

鬱だ氏のう…
547名無しさん:2000/09/07(木) 23:04
>524=535

>DWORD配列みたいなのを作って
これはPerlじゃ効率よく作れないと思います。
データを1つの文字列にごそっと読み込んで、
先頭から4バイトずつ見ていくのが近いかな?
読み込んだデータを @array = unpack('N*'@` $data) で
先頭から4バイトごとに32ビット数値として配列に格納する
ことはできるけど、DWORDのまま扱うわけじゃないし。

>ループ構造で各配列要素と比較ってできますか。
そりゃできますけど、やっぱりperlでは素直にDBなり
ハッシュなり使うことを勧めます。
つーか、Cでも535にあるみたいなリニアサーチは
やんないほうがいいのでは・・・
548名無しさん:2000/09/08(金) 00:26
524=535です。
どうもありがとうございました。

ところでさらに初歩的な質問ですが・・・
IP(例えば 127.0.0.1 )の4つの部分(127と0と0と1の部分)って
どういう規則性で割り振られているものなんですか?

549名無しさん:2000/09/08(金) 01:00
jpnicに申請してみれ
550名無しさん:2000/09/08(金) 01:13
>548
基本資料はこれかな?
http://ring.shibaura-it.ac.jp/pub/doc/RFC/rfc1466.txt
もう古い? 教えてjapuさんトカイッテミル
551名無しさん:2000/09/08(金) 01:30
548です。
英語は基本的に読めないので何となくですが、最初の部分(127の所)は国とか広い地域で
下の桁に行くほど狭い地域になるってことですよね?

552japu:2000/09/08(金) 03:46
とりあえず、アドレスのプレフィクスによってクラス何とかとして割り当てる方法は既に廃れて、現在はクラスの無い割り当て (CIDR) になっているはずです。

まだ私は読んでいませんが、RFC 1466 はすでに廃れたものになっているので、RFC 2050 を読むと良いかも:
http://rfc.asuka.net/rfc/rfc2050.html
553名無しさん:2000/09/08(金) 07:01
>>121
121で出ている、rmtreeの使い方を知りたいんですが…
どなたかご存じ無いですか?

引数と戻り値(成功or失敗)が解ればOKです。
554名無しさん:2000/09/08(金) 10:50
perldoc Path
によると
It returns the number of files successfully deleted.
Symlinks are treated as ordinary files.
だそうです
でも こいつエラーがでるとばしばし carp するから使いにくくて
きらい
555550:2000/09/08(金) 16:33
>552
japuさんありがとーん。RFC2050もらいました。
ああ読むべきRFCがどんどん増える。全部読めるのはいつの日か
556名無しさん:2000/09/08(金) 22:53
うお。初心者の質問かっていうのもあるな。
勉強になる。
557むぎ茶:2000/09/09(土) 05:22
&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;
&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;
&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9617;&#9618;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;
&#9619;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9618;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9617;&#9618;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;
&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;
&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9617;&#9618;&#9619;&#9619;&#9619;
&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9617;&#9618;&#9619;&#9619;&#9619;
&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;
&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;
&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;
&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9617;&#9618;&#9619;&#9619;&#9619;
&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;&#9619;
558名無しさん:2000/09/09(土) 05:46
>むぎ茶

それ、やたら見かけるけど何?
559むぎ茶:2000/09/09(土) 09:11
見てわからんやつには、言ってもわからん
560名無しさん:2000/09/09(土) 15:35
まあそのとおりだが。UTF8 に対応してるブラウザで読め。>558
561名無しさん:2000/09/09(土) 16:11
なんかハテナマークしか見えないんだけども…
562名無しさん:2000/09/09(土) 16:27
UTF8 に対応してるブラウザで読め。>561
563名無しさん:2000/09/09(土) 19:13
IE5.01じゃだめなの?
564名無しさん:2000/09/09(土) 19:42
IE5.01だけど、残念ながら見られるよ。
はっきり言って「うざい」
565MM:2000/09/10(日) 00:40
ド素人っす。
「名無しさん@`北海道@`26@`男@`よろしくお願いします。」
この文字列をカンマを区切りに
$name、$place、$age、$sex、$comment
に分割して代入するにはどのようにすればいいんでしょうか。
またデータの区切りにカンマは適当ですか。
566名無しさん:2000/09/10(日) 00:50
($name@`$place@`$age@`$sex@`$comment)=split(/@`/@`"名無しさん@`北海道@`26@`男@`よろしくお願いします。");
567>565:2000/09/10(日) 00:55
データにカンマを含まないなら適当。
568MM:2000/09/10(日) 00:57
ありがとうございます!>566、567
569名無しさん:2000/09/10(日) 02:09
データの区切りに\tは適当ですか?
570名無しさん:2000/09/10(日) 02:34
私は \t にしてます。普通に使いたい時はスペースで代替してほとんど問題ないし、
カンマはけっこう使うことがあるから、ちょっと不便。

571名無しさん:2000/09/10(日) 03:37
\tが一番いいよね
formでTAB入れるの難しいし(って、可能?)
572名無しさん:2000/09/10(日) 03:44
>571
コピぺすれば誰にでも可能です。
573572:2000/09/10(日) 03:49
プログラム系の掲示板だとよく使われるので
俺はTABはそのままログに書き込んで
表示させるルーチンにこんなの入れてます

$comment =~ s/\t/&nbsp;&nbsp;&nbsp;&nbsp;/g;
574572:2000/09/10(日) 03:51
あ、実体参照そのまま書いちゃった(笑)
実際はこうです。

$comment =~ s/\t/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/g;
575名無しさん:2000/09/10(日) 03:57
「CGI」に使うデータの区切りなら<>が一番と誰かが
言ってましたが、本当ですか?
確かにデータ中には<>はもちろん、<や>自体も削除しちゃうので
分からないでもないですが、なんかイヤ
576名無しさん:2000/09/10(日) 04:10
俺もその辺は昔悩みました・・・
566のようにして、フォームからの取得の時は
半角カンマを全角に置き換えるとか・・・。
でも、直接ログを見るとき見にくいので(そうそうないですけど)
今は<>でやってます。
うーん、やっぱ冗長かなー・・・。って今でも悩んでるや(w
577名無しさん:2000/09/10(日) 04:19
結論
区切りは「<>」に決まり。
578名無しさん:2000/09/10(日) 04:36
区切り\t見づらい?
掲示板なんかのデータ直で見るの、非常に見易いけど。
ズレが気になるならエディタのタブの長さ変えればいいし。
ついでに<>だと2バイトかかるけど\tだと1バイトですむ。
579よく読もう>578:2000/09/10(日) 04:57
>半角カンマを全角に置き換えるとか・・・。
580名無しさん的:2000/09/10(日) 13:32
\n と \t を区切り。特殊か?

保存時に文字列に \t が入っていれば全角スペースにする、
\n を含む複数行に渡る文字列なら先頭行に ¥t 入るように(s/\n/\n\t/)変換してる。
読む時は \t 削る。
一行一情報にはならんから面倒だけど $/ つかえば読む時に空改行が区切りになるし。
エディタでログいじりやすい。
581名無しさん:2000/09/10(日) 16:13
俺は\0。
582名無しさん:2000/09/11(月) 11:41
\0にいっぴょ。
583名無しさん:2000/09/12(火) 18:54
wakwakざんまいでCGI設置するのに相対パス指定
を変えないといけないんですがrequire や open
の他に変えるとこあったら教えてください。
584名無しさん:2000/09/12(火) 19:04
\0だとエディタで編集できなくない?
585名無しさん:2000/09/12(火) 22:09
Perlでよそのサーバにあるhtmlファイルを読みたいのですが
どうしたらできますでしょうか?
586名無しさん:2000/09/12(火) 22:38
587名無しさん:2000/09/13(水) 11:52
単にログファイルにIPアドレスを書き込ませるには
どうしたらいいですか?
588>587:2000/09/13(水) 12:42
print FILE $ENV{'REMOTE_ADDR'};
です。
589名無しさん@9月病:2000/09/13(水) 12:47
>>587
環境変数 REMOTE_ADDR に IPアドレス、
REMOTE_HOST にホスト名(たまに無かったりIPになったりする)がセットされているので
%ENV から読み出します。
$ENV{'REMOTE_ADDR'} の形で変数を保存すればいいかと。
ファイルへの保存方法はわかりますよね?
590mika:2000/09/13(水) 13:05
初めてCGIを作りたいと考えてるものです。


何か初心者用で参考になる本とか教えて欲しいんですけど。
具体的でなく申し訳ないです。
591むぎ茶:2000/09/13(水) 14:13



「初めてのPerl」
KENTやrescueの本はクソ 
592名無しさん:2000/09/13(水) 15:11
クソっていうなウンコといえ!
593( ´∀`)さん:2000/09/13(水) 16:24
>>590
できるだけ書店で立ち読んでから買えよ。本代高いから
http://www.kiwi-us.com/~gonosuke/cgibook/
http://www.att.or.jp/books/perlbook/
594( ´∀`)さん:2000/09/13(水) 16:26
595587:2000/09/13(水) 16:27
>>587-589
いまから実際にやってみます。ありがとうございます。
596585:2000/09/13(水) 17:30
>>586さん
無事にサブルーチン化できました。
どうもありがとうございました。
一人じゃ絶対出来なかった・・・ほっ
597mika:2000/09/14(木) 12:54
591さんありがとうございます。
これから私は591さんを目指してCGIの学習に励むことにします。

594さんもありがとうございます。感謝
593さん、ありがとう。ちゃんと立ち読みしてから買うからね。
みか
598ぽんきち:2000/09/15(金) 13:56
すみません、みなさん。
教えてください。

<img src="〜.cgi></img>

を使ってHTMLにCGIを埋め込もうとしてますが、
どうしても画像が出てくれません。
エラーマークが出てしまいます。(涙)

下がソースです。

print "Content-type: image/gif\n\n";
print "Home.gif;

Home.gifは.cgiと同じディレクトリに入れてます。
ファイルがおかしいのでしょうか?
アップロードするサーバは、win2000です。

どうか、ご指導お願いします。
599ぽんきち:2000/09/15(金) 13:59
print "Home.gif;→→print "Home.gif";

入力ミスです。
ごめんなさい。

ご指導お願いします。
600>598:2000/09/15(金) 15:11
"Home.gif" という文字列を出力したって、画像が出るわけありません。

print "Content-Type: image/gif\n\n";
open GIF@` "Home.gif" or die "can't open gif image : $!\n";
binmode GIF;
$/ = undef;
print <GIF>;
close GIF;

とか?
601ぽんきち:2000/09/15(金) 15:46
600さん

どうも、ありがとうございます。
無事に出来ました。

2ちゃんねるってすごい・・・
実感しました。

感謝!
602>:2000/09/16(土) 14:16
質問です。
よくCGIに使うPerlスクリプトがS-JISで書かれていると
「お子さま向け」とか、言われているようなのですが、
なぜなんでしょうか?
EUCの方が優れている点を教えてください
603名無しさん:2000/09/16(土) 15:35
ruby の作者も見ている ruby 掲示板ってないですよね?
ML のほうに伝えてほしいのですが、
ruby 本の p.p.71
s.captialize -> s.capitalize
だということを。
604名無しさん:2000/09/16(土) 21:16
>602
お子様向けなんて聞いたこと無いな。(w
>603
本の出版社に手紙を送っておけ。
605名無しさん:2000/09/16(土) 22:46
>>602
http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP
あたりを読むと60%ぐらいは理解できるかも。

>>604
とりあえず聞いたことはある。氏かも他ならぬこの2chのどっかで。
# でも他では聞いたこと無い。
606名無しさん:2000/09/16(土) 23:18
>>605
俺は、この板の「掲示板を作ろう」っていうスレで見た覚えが有るぞ(w
607名無しさん:2000/09/17(日) 01:37
DBMのファイルの容量上限って、どれくらいなんですか?
あと、SDBMなどがあるそうですが、それはサーバによって変わるのですか。
608名無しさん:2000/09/18(月) 01:40
>>602
一寸実際に落として説明。
EUCは文字コードとして2バイト文字と1バイト文字がかぶらないので、
文字化けのことを考えなくてよくなる。SJISだとその辺余計な手間が多くなる。

でもSJISは特にwindowsだとデータファイルとかを普通に
テキストエディタで書いておけば通るのでその辺は気楽。
EUCはコード変換とか必要になってうざい。
でもEUCの方がCGI本体は手堅いな。ってことで。

要するにSJISはCGIだけしか見てない近視眼的プログラミングゆえに
お子様と呼ばれるのではなかろうかと。
609名無しさん:2000/09/18(月) 02:32
>602
> よくCGIに使うPerlスクリプトがS-JISで書かれていると
> 「お子さま向け」とか、言われているようなのですが、
配布対象が注意書きを全く読まない初心者だということでもあります。
EUC-JPのスクリプトを配布しているサイトのサポートBBSでは
次のような書き込みが激しく“既出”してますから。
「DLして解凍してメモ帳で開いたら文字化けしてます〜(>_<)」
610srandで:2000/09/18(月) 02:50
初歩的な事ですみません。乱数を作る時に、
srand(time);を記述すると、乱数が殆ど変化しません。
srand;だけだと、結構変化します。時刻を乱数の種にしても意味が
ないのでしょうか?

611名無しさん:2000/09/18(月) 05:48
>>610
perl5以上ならsrandしない方がいいと思うよ。俺は。
612名無しさん@9月病:2000/09/18(月) 05:54
意味はあると思うんだけどなあ…。
srand だけだと基数が固定されてるはずだから実行中で1度目、2度目のrand 呼び出しで毎回同じ値が返るはず。
だから time でゆらぎを出すのが目的なはずだし…。
ほとんど変化しないというのは具体的にどういうことなのかな?
rand 呼び出し毎に同じ値ということならなんか別に問題がありそうなのだけど。
613名無しさん@9月病:2000/09/18(月) 05:55
>>611
なにか問題あるんですか?
614611:2000/09/18(月) 06:01
>>613
いや、ただ俺の好みなんで気にしないでくれ(w
615srandで:2000/09/18(月) 06:40
>611さん
srand(time);
$ransuu=int(rand(100));
print "$ransuu \n";

こんな感じで乱数を表示させてます。
実行して75という結果が出た時、再実行するとまた75が出ます。
そして10秒程時間が経つと、76となります。一定の間隔で1づつ
増えてるような感じなのですが。srand;だけだと、数字がばらけます。
Perl5を使っています。
616名無しさん@9月秒:2000/09/18(月) 06:55
>>614
了解!

>>615
らくだ本見たら srand; も srand(time); も同じみたいです。結局 time を引数にしてるようです。
time の値は1秒ごとに増えているので正常に動いているのなら1秒ごとに乱数の値も変わるはずなんですけどね。
小数点以下が変動してましたとかいうオチじゃないよなあ。
手元の Perl for win32 では問題ないみたいでした。
617名無しさん:2000/09/18(月) 07:35
Windowsだと1回目のrandでは乱数が散らばらないことがあるらしいです。
バグかもしれません。ともかくそれを回避するために、これでどうでしょう。

srand(time);
$dmy = rand(1); #1回目のrandはうまく乱数が得られないらしい。
$ransuu=int(rand(100));
print "$ransuu \n";
618名無しさん:2000/09/18(月) 15:50
perl5以降(マイナーバージョンは忘れた)は、
rand呼ぶ段階で勝手に種をセットしてくれます。
マニュアルで種仕込む必要はほとんどなし。
619名無しさん:2000/09/18(月) 17:02
↓のように他のサーバーからファイルを読み込ませたいのですができませんでした
何が足りないのでしょうか?
ご教授お願いします

open(HTML@`"http://www.test.net/test.html");
@a = <HTML>;
close(HTML);
print @a;
620名無しさん:2000/09/18(月) 17:12
わかる方がいましたら、教えてください。

.cgiを実行する際に、
履歴を消す(無効にする)方法・コードは
あるのでしょうか。
一度実行したcgiを、新たに実行したいのです。

cgi実行後、ホームサイトに戻り、またそのcgiを実行すると
以前に実行した時の変数が残っているようなのです。
きっとブラウザが履歴を参照しているせいだと思うのですが・・・

(うまく説明できなくて済みません。)
621名無しさん@9月病:2000/09/18(月) 17:30
>>619
open に指定するファイルは仮想パス(http://ftp://)では読めません。
コンピュータ内の実際のパス(/home/username/HomePage/test.html とか?)にしないといけません。

>>620
一部の環境変数は固定になってるものもありますが
普段使うような変数は実行毎に初期化されてるはずです。
どこかで固定値を代入しているなどが考えられますがコード見ないとわかりません。
622名無しさん:2000/09/18(月) 17:44
>>621
ブラウザのキャッシュに残ってるんじゃない?
623:2000/09/18(月) 17:45
srand(time() ^ ($$ + ($$ << 15)));
ってやりかたを読んだ記憶が。
624620:2000/09/18(月) 18:00
621さま、622さま。
気にかけて頂き、
ありがとうございます。

ホームサイトに戻った後
2度目にcgiを実行させる前に
ブラウザのキャッシュを消すと
うまくcgiが動きます。
やっぱりブラウザの履歴を2回目以降は
参照してしまうようです。

perlでブラウザのキャッシュを消す(無効にする)
方法・コード等がありましたら、教えてください。

コードは恥ずかしくて、皆さんに見せられたモノではありません。
不必要に長くて汚いコードなので・・・(^^;
ご容赦下さい。
625名無しさん:2000/09/18(月) 18:21
CGIで他サーバのOS名を調べることは出来ますか?
626名無しさん:2000/09/18(月) 18:23
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">

あと昔、この板のgif画像を再読み込みさせるという話のとき、
「有効期限を設定する」という方法があったような。
詳しくは忘れたけど。
627:2000/09/18(月) 18:24
ヘッダに
Pragma: no-cache
ボディに
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
CGI引数に
DUMMY=time()
でどーだろ
628名無しさん:2000/09/18(月) 19:17
特定の発言を禁止するPerlの書き方を教えてください。

if((投稿記事内容 =~ /htm/)){
HPの宣伝は禁止です;
exit;
}

こうしたのですがエラーになるんです。
どうすればいいか教えてください。
629620:2000/09/18(月) 19:20
626さま、627さま

有り難うございました。
cgiのなかの HTML表示部分に
(printでタグを吐き出す部分です。)
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
を吐き出させたら、解決しました。
気にかけていただいた皆さまに感謝します。

私も”おしえて君”から卒業したいです。
失礼しました・・・・
630>628:2000/09/18(月) 19:32
>こうしたのですがエラーになるんです。
ネタ?
631628:2000/09/18(月) 20:10
まじです。
教えてください。
632名無しさん@9月病:2000/09/18(月) 21:00
そうかブラウザのキャッシュだったのか。
さっきのカキコは勘違いしてました。

>>628
変数は理解されてます?$message とかに記事が入ってると思うんですが。
「投稿記事内容」というのが単にわかりやすく書いたおつもりなら
逆にわかりにくいだけなんでソースそのまんま書いてくださいね。
それを踏まえて書くと $message =~ /htm/ ですが、とりあえず書籍かPerlの支援サイトをよく読みましょう。

あと文字を表示させるには多分ヘッダも出してないでしょうから
print "Content-type: text/html\n\n";
print "HPの宣伝は禁止です";
としましょう。
633名無しさん:2000/09/18(月) 21:08
http://dictionary.hypermart.net/pl/mkpwd.txt
の文字列を作った後a.txtとかに表示させたいのですが
どうすればいいですか?ちなみに文字列作るときはローカルでやってます
634srandで:2000/09/18(月) 23:02
>616、617、618、ぽさん、ありがとうございます。
原因は不明ですが今日同じコードを実行したら10秒ごとに
乱数が増えるという変な現象が出なくなりました。
うちのWIN固有の問題だったようです。
お騒がせしました。
635丸々:2000/09/18(月) 23:45
めちゃ初心者なんですが、質問があります。
WebサーバーがNT4.0で構築されてるんですが、フォームメールをperlで作りたいと思ってる
ですが、sendmailが使えません。この場合どのようなやり方があるんですか?
調べてみたところsendmail.pmとか使いなさい!ってあるですがDLしてきてはみたものの
インストールもできません。ActivePerlはインストールしてあるんですが、どうやっていいか教えてください。
sendmail.pm以外にも簡単にsendmailが使える方法もあったら教えてください。
よろしくおねがいします。
636せお:2000/09/18(月) 23:58
1000hit/日程度のサイトを運営しています。
カウンタ&ログ取得にはteraco2を使用しております。
http://www.chibaken.net/cgi_s/teraco2/index.htm
これの1日1回カウント機能なのですが、これはどれぐらいサーバに負担をかける&
訪問者の読み込み時間に影響するものでしょうか。
大したことないのなら使いたいし、結構影響が大きいのだったら止めておきたいので。
よろしかったらご教授ください。
637名無しさん:2000/09/19(火) 00:30
ホスト名→IPアドレス、のような変換はどうするのでしょうか?(gethostbyaddrの逆)
638名無しさん:2000/09/19(火) 00:34
>637
getaddrbyhost
639名無しさん@9月病:2000/09/19(火) 01:13
>>637
gethostbyname かな。
戻り値は gethostbyaddr と一緒。
(gethostbyname($name))[4] とかやれば一番目のIPアドレスが取得できます。
複数ある場合は [5] 以降にも入ってますけどね。
640MM:2000/09/19(火) 23:08
ファイルロックについて伺います。
ロック→アンロックの間でファイルを読み、
加工して書きこむときに、
「一時ファイルに書きこみ→元ファイルにリネーム」
とするのが安全、とあったのですが何故でしょうか。
ロックされていれば最初から元ファイルに書きこんで問題ないのでは
ないのでしょうか。
641名無しさん@9月病:2000/09/19(火) 23:23
>>640
ロックといっても完璧なものではないだろうからね。
ファイルへの致命的な打撃を避けようということじゃないかな。
リネームを使えば他のプロセスが書き換えるのはなるべく避けられるはずだから。
ロックの精度が高ければ元ファイルに書き込んでもいいと思う、
カウンタやチャットには flock だけだと不安だけど。

どの辺で妥協するかは精度とその人の性格じゃないかな。
私はそこまでしてませんが。
642MM:2000/09/19(火) 23:40
どうもです。>>640
643MM:2000/09/19(火) 23:43
失礼しました。642>641で。
644無名人:2000/09/19(火) 23:44
フリーのサーバ上にて、常に動きつづける CGI を書きたいのですが、
(というと文句言われそうですが、負荷は殆ど無いものです)
なぜか半日程度で止まってしまいます。
シグナルをすべて無視してみましたが結果は同じでした。
繰り返す所を eval で実行するようにしてもエラーが拾えません。
他に何か考えられる事はありますでしょうか?
ゾンビタスクだと思われて殺されてる??
ちなみに、ちゃんと終了方法は持っています。
645無名人:2000/09/19(火) 23:52
×タスク
○プロセス
だったっけ?
646>640:2000/09/19(火) 23:52
・同じファイルを書き直す方法だと基本的にファイル全体をメモリに読み込んで
おかなくちゃならないので、サイズの大きいファイルのときはあまり良くない。

・複数ファイルを書き換えるとき、途中で処理が中断するとファイルの
同期がとれなくなるので、全部一時ファイルに書き出して一気にリネーム
すると、ちょっとだけその危険性が減る。
647名無しさん:2000/09/20(水) 14:09
readme.txtに
ギコ猫
モナー
ゾヌ
-----
という3つの言葉が入っている場合に
↓のコードで実行したのですが、結果が

モナー
はいってよし

…というふうに、改行がされてしまいます。
chopを書く場所を間違えているのでしょうか?

open (FILE_HANDLE@`"<readme.txt");
$count=0;
chop $nyuuryoku;
while ($nyuuryoku[$count]=<FILE_HANDLE>){
chop $nyuuryoku; #chopでもchompでも同じ。
$count=$count+1;
}
chop $nyuuryoku;
close (FILE_HANDLE);
print "$nyuuryoku[1]はいってよし。\n";


648:2000/09/20(水) 14:29
chop $nyuuryoku;
じゃなくて
chop $nyuuryoku[$count]
ですね。
@nyuuryoku = grep(chop($_)@` <FILE_HANDLE>);
とかね。
649名無しさん:2000/09/20(水) 15:07
遅まきながら一連のsrandについて。

perldoc -f srand読んでください。
最新のPerlではsrand(time);よりsrand;(または全然srandしない)の方が
よりランダムな初期値を与えます。

5.004以前では確かにsrand;はsrand(time);の意味でした。
perldoc -f srandにはそこらへんの経緯も書いてあるし、
>>623
> srand(time() ^ ($$ + ($$ << 15)));
はもう必要ないとも書かれています。

プロバイダーのperlが5.004以前(5.005未満)の場合は
今までの議論の方が成立します。

ちなみに「CGIではtime ^ $$はダメだよん」とも書いてあった。
やはりperldocは必読ですね。
650初心者:2000/09/20(水) 17:37
初めまして、CGIプログラムを作っているます。
他のサーバーなど外部のHTMLファイルを読み込ませたいのですが、どのようにすればいいのでしょうか?
651ななしさん:2000/09/20(水) 17:46
>647
データに改行が入ってるからでは?

>650
ソケットで検索してみそ
652名無しさん:2000/09/20(水) 20:54
表示されたテキストを自動で保存したいんですが
653名無しさん:2000/09/20(水) 23:27
ぽさん、ありがとうございます。
なるほどー。配列になってるのだから[$count]も必要ですよね
ずっと悩んでたので本当に助かりました。
654名無しさん:2000/09/21(木) 03:48
しょうもない質問だったらすみません。
トクトクで「.cgiのパーミッションは700で」
とありますが、これは(自分以外の)閲覧者は実行不可→
CGIで表示させるページを見られない、ということなんでしょうか?
755で動作していますが。
655名無しさん:2000/09/21(木) 04:07
>654
実験してみれば分るけど
パーミッションの変更だけでアクセス制限は出来ませんよ。
656>654:2000/09/21(木) 04:13
つーかさ…自分で試してみれば済む事じゃない?
657しろうと:2000/09/21(木) 05:00
チャットを移転したのですが、
CGIで他のアドレスに自動でジャンプさせるにはどうしたらいいのでしょうか?
(既存のCGIを置き換えたい)
ロケーションで飛ばせば?
659>657:2000/09/21(木) 05:19
print "Location: 移転先のURL\n\n";

つーかMETAじゃダメなの?
660名無しさん:2000/09/21(木) 05:23
つーかチャットへリンクを貼っているHTMLを書き替えるだけじゃダメなのか?

そこまでしないといけないほど直リンクで来る人が多いのかな。
661657:2000/09/21(木) 05:36
>>659
METAでやったんですが、うまくいかなかったんです。

>>658
既存のCGIを置きかえる、というのは、
infowebで運用してたYYCHATをwakwakに移転させたんです。
そこで、infowebのyychat.cgiにwakwakのyychat.cgiへ自動的に飛ばすcgiを作って、
ファイル名をyychat.cgiにしてinfowebに転送したかったんです。

HTMLなら、
<META HTTP-EQUIV="Refresh" Content="0; url=移転先">
で簡単なんですけどね。はぁ。

662657:2000/09/21(木) 05:38
>>660
複数のWEB持ちでチャットを共同運営してるんです。
リンクを直してくれるまでの繋ぎです。
663名無しさん:2000/09/21(木) 06:16
質問です。
 まるでうまくCGIが動かないとき、テンションが最高に
 下がって、もうファイル全部消して寝ようという気になります。
 仕事でもないので本当に寝てしまって、さっぱり進みません。
 なぜ皆さん完成させることができますか?

ネタ風だけど、そんな感じ… 質問じゃなくて愚痴ですね。すんまそん
664名無しさん:2000/09/21(木) 06:23
>663
ヘボでもいいから動くようにする
→動いたら実際に使う
→使ってみるとヘボなので改良させようと思う
→改良させる

こんな感じ
665名無しさん:2000/09/21(木) 06:34
>>654
あなたは自分が閲覧する時は、自分が管理者だと勘違いしていますね。
あなたも一般ユーザーと同じなんですよ。
自分が見られるなら他の人も大抵見られますよ。
666名無しさん:2000/09/21(木) 06:47
デバッグが上手いひとと下手なひとって、居るよね。
667名無しさん:2000/09/21(木) 12:49
0秒のrefreshはヤメテー。ブラウザのback効かなくなるよう。
「藤原博文の館」の「あきれたページ」参照。
http://www.pro.or.jp/~fuji/horrible/index.html
668名無しさん:2000/09/21(木) 19:08
<META NAME="Location" CONTENT="http://ww.foo.com/">
使えるかな?
669654:2000/09/22(金) 02:29
>655@`656@`665
そんな感じな気がしていました。
であれば、所有者とはFTPでつないできた人を指すのでしょうか?
700だと確かに実行できなかったのですが、つまりは
そのサーバではCGIを閲覧者に実行させないことを推奨している、
ということでしょうか?
670名無しさん:2000/09/22(金) 04:10
>669
http://tako.2ch.net/test/read.cgi?bbs=perl&key=969323527

owner group nobody
最低限の意味くらい覚えよう。
671名無しさん:2000/09/22(金) 06:20
NT系サーバで
chmod(0600@`"$log_file");
とするとUNIX系と同じような動作をしてくれますか?
672名無しさん:2000/09/22(金) 06:46
fork()というのは具体的にどの様な場面で使用するのでしょうか?
673:2000/09/22(金) 10:59
スパゲティなんかを食べるときに.....

じゃなくて fork() すると そこでプロセスが2つに分かれます。
通常は どっちか片一方がすぐさま exec() して別プログラムを起動します。
・別プログラムを起動するときに使用する
がほとんどかなぁ
あとサーバーなんかでソケットに接続があった後でその処理に専念させる
プロセスを fork() したりもします。この場合はexec()せずに
同じプログラムのまま動作します。

674勉強中さん:2000/09/22(金) 23:16
Perlでのメモリの破棄?について教えてください。
現在Perl勉強中です。
ネットで公開してるCGIソースを参考に勉強してたんですが、その中でファイルから変数に読み込んで処理をした最後に undef を使用していました。
本で調べたところ undef...変数などをクリアする って書いてあったんですが、これってメモリの破棄ってことですか?
今までは変数を使ったらそのまま放置してましたが、プログラム終了時などに破棄する必要ありますか?
教えてください。
参考にしたCGIソースはこんな感じでした。

  sysread(IN @` $buf @` $size);
  close(IN);
  |
  ここで色々処理
  |
  undef($buf);
675>674:2000/09/22(金) 23:25
プログラム終了時には破棄する必要はありません。
あと、my変数はブロック終了時に破棄されます。

{
  my $buf;
  sysread( IN@` $buf@` $size );
  close( IN );
}

で、上記のコードと同じことになります。
こんなことしないけど。
676勉強中さん:2000/09/22(金) 23:43
どうもありがとうございます。
追加の質問ですが・・・
例えばもともとデータの入っている変数に再度データを入れる場合は自動的に削除されますか?

$buf="データ1";
$buf="データ2";

こういった場合 データ1 は破棄されますか?
677名無しさん:2000/09/23(土) 00:55
されます。
ついでに $buf .= 'データ2'; だと追加になりますね。
678>:2000/09/23(土) 03:25
データ1が超巨大データで、データ2が小さなデータだった場合、
もう$bufに超巨大データを入れる予定がなければ、
いったんundefしたほうがいいかもね。
679名無しさん:2000/09/23(土) 03:29
こういうのってPerlというより、OSの話だと思うけど、undefして解放されたメモリはどうなるの?
プログラム中で再利用されるの?
680■■■■:2000/09/23(土) 03:43
681勉強中さん:2000/09/23(土) 23:05
>>677-680
>677
どうもありがとうございます。
>678
つまりメモリは破棄されるのではなく同じ領域に上書きされるってことですよね?
小さい場合は再確保されその領域にコピーされる?
ってことは $buf .= 'データ2' みたいに追加する処理を複数回行い変数のメモリサイズが増えていく場合、初めに $buf に十分なメモリを確保しておいた方が高速化される?
Perlで変数に指定したサイズのメモリを割り当てることってできますか?
>679
うっ・・自分には全く分かりません。
>680
これに参加しろってことですよね?
登録して気づいたんですがこれMLですよね?
自分は情報交換するほど知識ないんですけど入ってよかったのだろうか・・・
682名無しさん:2000/09/24(日) 00:29
CGIのためのPerlという書籍付属のCDで
Perlをインストールして使っているのですが
Print命令を使うと日本語の表示が一部化けてしまいます。
PerlとJperlの最新版をインストールしようと思うのですが
上書きインストールで良いのでしょうか?
683名無しさん:2000/09/24(日) 01:27
682です。上書きでアップグレードOKでした。
ですが、現象が改善されません。
print "表示 \n";だと「侮ヲ(ヲは半角)」と表示されます。
MS-DOSから実行しているだけなのですが…。


684名無しさん:2000/09/24(日) 02:02
シフトJISで漢字コードの2バイト目がバックスラッシュ( \ )のコードと重複する文字を用いた時に発生します。
とほほのWWW入門を参考にするといいでしょう。
http://wakusei.cplaza.ne.jp/twn/www.htm
perlで日本語を扱うには
http://wakusei.cplaza.ne.jp/twn/wwwperl4.htm#Japanese
685672:2000/09/24(日) 03:52
> 673さん
これから自分で色々と試して理解を深めたいと思います。
ご教授有り難う御座いました。
686名無しさん:2000/09/24(日) 08:13
>684さん
文字化けは、実際にCGIをアップした後に発生する問題だと
思ってました。DOSで実行してるときも発生する可能性があるんですね。
教えて頂いたURL、ブックマークします。ありがとうございました。

687名無しさん:2000/09/25(月) 16:55
あげとく
688名無しさん:2000/09/26(火) 14:24
あやしいみたいなフォントって
どうやって設定するんですか?
689名無しさん:2000/09/26(火) 19:01
あやしいみたいなフォントってナニ?
690688:2000/09/26(火) 19:11
> あやしいみたいなフォントってナニ?
「ぁゃιぃ」のことです
691>688:2000/09/26(火) 20:51
やっぱりそれは使ってるところに直接聞いたほうがいいでしょ。
692688:2000/09/26(火) 21:30
「くずはすくりぷと」って言うんですが
現在配布先がつぶれてて....

あーゆー感じの文字をつかいたくて...
693>683:2000/09/26(火) 21:44
\表\示
とかじゃだめ?
694名無しさん:2000/09/26(火) 23:37
%conv_table = (
あ => ぁ
や => ゃ
し => ι
い => ぃ
);

とか変換してたりして。
695名無しさん:2000/09/26(火) 23:48
macなのですが、ローカルでcgiを試したいときにmacjperlをどう使えばいいのでしょうか?
それとも出来ないのでしょうか?
696名無しさん:2000/09/27(水) 01:45
>695
MacでローカルでCGI、な情報はとても少ないみたいですな。
http://st.sakura.ne.jp/~akehosi/maccgi.html
↑いっこ発見したけど、おれ残念ながらMacユーザじゃないので
これが役に立つサイトかどうかは判断できんです。
697MM:2000/09/27(水) 06:23
$name="田中";
$pass="1234";
print "<a href=\"test.cgi?name=$name&pass=$pass\">クリック</a>\n";

として、クリックしてtest.cgiに値を渡すと、
$nameが「田・Epass=1234」となり、$passに値は入りません。
eucに変換しているのですが、何が原因でしょうか?

「?name=$name &pass=$pass」とスペースを置くと、
「&」をエスケープ?するのは避けられ$passに値が入りますが、
$nameの末尾の文字化けはそのままです。
どなたか対処法教えて頂けませんでしょうか。 

698名無しさん:2000/09/27(水) 06:55
>>697
URL文字列には全角文字含んじゃいけませなん。
$name =~ s/([\w])/sprintf("%%%02X"@` ord($1))/eg
でとりあえず全角文字とかをエスケープしとけばいい。
699698:2000/09/27(水) 06:57
$name =~ s/(\W)/sprintf("%%%02X"@` ord($1))/eg
の間違いだった。
700名無しさん:2000/09/27(水) 07:36
>>695
http://tako.2ch.net/test/read.cgi?bbs=perl&key=965914710
『MacでUNIX向けのperlを動かすには?』も併せてどうぞ。
          
701名無しさん:2000/09/28(木) 05:48
Win98、Perl5で
任意のディレクトリ内の複数htmlファイルのJavaScript記述を消去する
スクリプト、書いてみてください。


702名無しさん:2000/09/28(木) 06:19
教えてくださいじゃなくて書いてみろってか?
703702:2000/09/28(木) 06:24
一応書いておくと s/<script>[.\n]*</script>//g; とかか?
これだけじゃ不足だろうけどな。
704名無しさん:2000/09/28(木) 17:55

置換じゃなくてファイルを編集する方法で書いてみた.


#!/usr/local/bin/perl
MAIN:
{
@all = ('test1.html'@`'test2.html');
foreach $file (@all)
{
open(IN@`$file);
@line = <IN>;
close(IN);
foreach (@line)
{
push(@out@`$_) unless /<script .*/i .. /<\/script>/i;
}
open(OUT@`">$file");
print OUT @out;
close(OUT);
@out=();
}

exit;
}
705名無しさん:2000/09/28(木) 17:58
これ自動インデントされるんだね.

open(IN@`$file);
while(<IN>)
{
push(@out@`$_) unless /script .*/i .. /<\/script>/i;
}
close(IN);

この方が見栄えがいいかも。
706名無しさん:2000/09/28(木) 18:11
<
script
>
とかに対応してないのでは?
707名無しさん:2000/09/28(木) 18:12
あと
<body onload="...">
とか
<a href="javascript:...">
とかもあるよ
708名無しさん:2000/09/28(木) 19:07
自分で書いてみてはいかが
709名無しさん:2000/09/28(木) 19:40
>706
そんなチミにHTML::Parser。

package NoScriptParser;
use base HTML::Parser;
my $n = 0;
sub start {
my ($self@` $tag@` $attr@` $attrseq@` $text) = @_;
$n++ if ($tag eq 'script');
print $text if !$n;
}
sub end {
my ($self@` $tag@` $text) = @_;
print $text if !$n;
$n-- if ($tag eq 'script');
}
sub text {
my ($self@` $text) = @_;
print $text if !$n;
}

package main;
$parser = NoScriptParser->new;
$parser->parse($_) while (<>);
$parser->end;
710701:2000/09/29(金) 00:16
皆さんアイデア出していただいてありがとうございます。
実はhtmlファイル内の処理もさることながら、
任意ディレクトリ内を検索して複数htmlファイルをリストアップする
部分の記述方法でつまづいています。
巷の書籍ではCGI用途に関する記述が主で、ローカルでのディレクトリ
操作に関する記述が少なく、またわかりづらいです。
もし良書をご存知の方は教えていただけるとありがたいです。
また、上記を解決するスクリプト書ける人は、書いてみてください。
711名無しさん:2000/09/29(金) 01:31
Win95にApacheを入れようと思うのですが、入りません。
apache_1_3_12_win32.exeはインストール完了するのですが
起動時に「プログラム開始エラー」だけのアラートが出ます。
順にバージョンを下げていったのですが、1_3_6に至っては
「return from extract=-7」というエラーでインストールも
できません。
一昨日Windowsの再インストールをしたのですが、その前までは
問題ありませんでした。
どなたかわかる方いらっしゃいましたらお教えください。
712名無しさん:2000/09/29(金) 03:37
スレ・板違いでしたらすみませんが、
特定ユーザーからの投稿を拒否するスクリプトを組もうと思うのですが、
ダイヤルアップの場合、IPの下2桁はその時々でかわりますよね?
厳密にあるユーザー(PC)からだけ拒否するにはどうしたらいいのでしょうか?
できませんか?
713名無しさん:2000/09/29(金) 04:18
Cookie 吐いて個別認識くらいかな。
マシンまで特定するならそれくらいしかできないんじゃないかな。
OFFにしてたら意味ないけど。
714リソース不足:2000/09/29(金) 06:43
ActivePerlとAN HTTPDを使用してWindowsでCGIのテストを行っています。
質問なんですが、CGIプログラムを動かしていくと何故かWindowsのシステムリソースがどんどん減ってしまいます。
最終的にはシステムリソースが不足してWindowsを再起動しなくてはならなくなります。
この原因わかりますか?
CGIプログラムが間違ってるんでしょうか?それともActivePerlとAN HTTPDの設定が間違っているんでしょうか?
教えてください。
715名無しさん:2000/09/29(金) 07:19
チャットの参加表示部分を掲示板に表示させたいのです。
チャットの参加者表示部分のソースが

require 'jcode.pl';
require 'cfx9def.pl';
##################################
dbmopen (%MEMBER@` $Memdbm@` 0644);
foreach (keys (%MEMBER)){ push (@name@` $_); }
dbmclose (%MEMBER);
if($#name == -1){ $names = 'なし'; }
else{ $names = join (' '@`@name); }
print "Content-type: text/html\n\n";
print "<font size=2>只今の参加者 : $names</font>\n";
exit(0);

の場合、掲示板の方にはどう追加すれば表示されるのでしょうか?
申し訳無いですが、御教授下さい。
716名無しさん:2000/09/29(金) 07:41
これ、ほとんどそのままでしょ。
表示させたい行の間に下の追加するだけじゃないかな?
require ですでに掲示板内で定義されているのも削っていい。
とりあえずやってみてエラーでたらそのメッセージとか教えて。

require 'cfx9def.pl';
##################################
dbmopen (%MEMBER@` $Memdbm@` 0644);
foreach (keys (%MEMBER)){ push (@name@` $_); }
dbmclose (%MEMBER);
if($#name == -1){ $names = 'なし'; }
else{ $names = join (' '@`@name); }
print "<font size=2>只今の参加者 : $names</font>\n";
717715:2000/09/29(金) 12:43
何度もすいません。
716さんの通りに挿入すると、そこから下が表示されなくなりました。
参考になるか分からないのですが
チャットと掲示板の位置はこうなってます。

掲示板::アカウント/xxx/kkk.cgi
チャット::アカウント/yyy/jjj.cgi
cfx9def.plもチャットと同じで::アカウント/yyy/cfx9def.pl
となってます。
掲示板とチャットでは「$name」のみだぶってます。
また、掲示板のcgi内では、require './aaa_bb.pl';という設定ファイルが
有効になっています。

よろしくお願い致します。
718名無しさん:2000/09/29(金) 14:43
701=710>
Dosプロンプトでディレクトリを指定する事を考慮した場合、

$dir = $ARGV[0];
`cd $dir`;
@all = `dir /B *html`;

で指定のディレクトリにある全てのHTMLファイルを持って来れますよ。
あとは配列allを一つずつ回していけばいいだけ。
実行例は
C:\(スクリプトの置いてあるディレクトリ)> スクリプト名 ディレクトリパス(絶対パス)
C:\script\perl> test.pl c:\document\hoge
↑こんな感じ
719名無しさん:2000/09/29(金) 14:59
>718
opendir()@`readdir()@`closedir()
または
DirHandle.pm
720名無しさん:2000/09/29(金) 15:01
find.pl
または
File::Find.pm
721名無しさん:2000/09/29(金) 16:01
>718
ハンドル使ってディレクトリオープンしても、
grepとかで拡張子*.htmlにマッチするかサーチしないといけないんじゃないの??
722名無しさん:2000/09/29(金) 23:37
> 718
@all = <*.html>;
ディレクトリを変数展開したいなら
@all = glob("$dir/*.html");
723716:2000/09/30(土) 00:39
>>717
>716さんの通りに挿入すると、そこから下が表示されなくなりました。
ちょっと考えが甘かったかもしれません。とりあえず以下のことをやってみてください。

>チャットと掲示板の位置
これは改めて指定しないといけないでしょうね。
同じアカウントでしょうから require '../yyy/cfx9def.pl';
としてチャットのディレクトリにあるこのファイルを読んでください。
もし、telnet が使えるのならCGIをtelnet上で実行してみてもらえれば問題がわかりやすいです。
require で読み込まれなかった場合にはファイルのエラーメッセージが表示されますから。
掲示板のディレクトリ xxx に jcode.pl がないのなら、require '../yyy/jcode.pl'; も指定してください。

>$name
これは挿入する部分だけ変えておいたほうがいいですね。
$chatname とでも変えておけば内容を書きかえられることもないでしょう。

>DBM
ところで $Memdbm の内容は多分、チャットの中でだけ定義されてますよね。
これも指定しておかないといけないので
チャットの方から $Memdbm に代入しているところを持って来てください。
724名無しさん:2000/09/30(土) 03:20
Jperl使っています。Perlではそうならなかったのですが、Jperlだと
"\x82 " !~ /[^<]+ /;
が真のようなのですが、どうすればそうなるのか解りませんでした。
どなたか解説か、解説への誘導をお願いします。
725名無しさん:2000/09/30(土) 04:34
>724
http://www.att.or.jp/perl/win/jperl.html
Jperlにもいろんな種類↑があるですが、どれを使ってるの?
同じの使ってる人がいればわかるかも。
うちのUNIX用jperl(Hirofumi_WatanabeバッチEUC版)だと
724はオリジナルperlと同じ結果になっちゃうので原因はわかりません。
726701:2000/09/30(土) 04:39
>718@`719@`721@`722
うまくいきました。 ありがとうございました。

>720
find.pl 今度はこれを使うように改良してみます。どうも。

727名無しさん:2000/10/01(日) 00:57
ごめんなさい(汗)>725
とりあえずまずは私のJperlの出力を
>Jperl -v
This is perl@` version 5.003_07
Copyright 1987-1996@` Larry Wall
+ suidperl security patch
Win32 port Copyright (c) 1995-1996 Microsoft Corporation.
All rights reserved.
Developed by ActiveWare Internet Corp.@` http://www.ActiveWare.com
Perl for Win32 Build 316 - Built 12:27:52 Mar 17 1998
Japanization patch 4 by Yasushi Saito@` 1996
Modified by Hirofumi Watanabe@` 1996. jperl5.003_05.patch7_1
Modified for Win32 by @Tori@` 1997
Ported by [email protected]. Build 117
SJIS version
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License@` which may be found in the Perl 5.0 source kit.

ということは●Perl5.003(Perl for Win32)ベースなのでしょうか…(汗)
ドキュメントに載っている最新版の配布場所は、
http://www.yk.rim.or.jp/~hizumi/perl/index.html
を指しています。
728717:2000/10/02(月) 17:37
>723さん
毎回、アドバイスありがとうございます。
以下のように、書き足してみました

require '../yyy/cfx9def.pl';
require '../yyy/jcode.pl';
##################################
$Memdbm = $Dbmdir . $Memberlst;
$Memberlst = 'MEMBERLIST';
$Dbmdir = '../yyy/dbms/';
$Charcode = 'sjis';

dbmopen (%MEMBER@` $Memdbm@` 0644);
foreach (keys (%MEMBER)){ push (@name@` $_); }
dbmclose (%MEMBER);
if($#name == -1){ $chatname = 'なし'; }
else{ $chatname = join (' '@`@name); }
print "<font size=2>【チャットの只今の参加者 : $chatname】</font>\n";

掲示板上に、【チャットの只今の参加者 : なし】 と表示されるように
なったのですが、チャットに入室があっても「なし」のまま、表示が
変わりません。
もうしわけないですが、もう少しお付き合い願いますか。
729名無しさん:2000/10/02(月) 19:02
>728
通りすがりの名無しですが、これ
$Dbmdir = '...' と $Memberlst = '...' を設定してから
$Membdm = $Dbmdir . $Memberlst;
を実行しないとだめなんじゃないっすか?
730716=723:2000/10/02(月) 19:16
>>728
おそらく 729 さんの通りでしょうね。
変数は、どこかで代入されていないとその値は空なので一部をコピーして持ってくる場合は、
使っている変数がそのスクリプトの中でちゃんと設定されているかはチェックしましょう。
そういうわけで $Dbmdir と $Memberlst の設定部分をチャットから持って来てください。
また指定ディレクトリが変わるかもしれないので、
ついでに指定方法も覚えてしまったほうがいいかもしれません。

どこかにディレクトリパスのうまい説明されてるサイトないかな?
もしよかったらどなたか教えてください。
731716=723:2000/10/02(月) 19:21
この前のようにディレクトリの頭に "../" を付けるだけで済むのならそれで楽なのだけどね。
732728:2000/10/02(月) 22:09
>716=723さん、729さん
ありがとうございました。
きちんと表示できました。本当に感謝します。
もっと、勉強してきます。
733名無しさん:2000/10/02(月) 23:08
すばらしいカウンターを探しています。
親切な人教えてください!!!
734名無しさん:2000/10/02(月) 23:22
KENTのASKA BBSで
gethostbyaddrでアドレスを取得するのと
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
で、取得するのは
何が違うんでしょうか?
735>733:2000/10/02(月) 23:50
あちこちに書いてんじゃねぇ
736716=723:2000/10/03(火) 01:19
>732
どういたしまして。頑張ってください。

>733
具体的になにが素晴らしいのか謎なんですが…

>734
gethostbyaddr はIPアドレスからホスト名を取得(逆引き)ができますが、
REMOTE_HOST で設定されてるならわざわざやる必要はありません。
REMOTE_ADDR を代入して戻ってくるホスト名とほぼ同じものです。
サーバによっては REMOTE_HOST を返さないものがあるのでその場合に受け取ればいいかと。
737734:2000/10/03(火) 01:39
>>736
勉強になりました
そろそろ、掲示板を作って見ようとソースを読んでいて疑問に思っていました
ありがとうございました
738>607:2000/10/03(火) 14:59
DBMは1レコードの長さが1KBまで、
ファイルのサイズは4KBまでです。
NDBMに関しては私も知らないので誰か教えてください。
739名無しさん:2000/10/03(火) 19:59
referrerを見てhogehoge.netを含んでいたら拒否するということはhttpd.confの
設定で可能でしょうか?可能な場合の書き方がありましたら教えて下さい。
例として、2ちゃんねるに貼られた荒し依頼などをこちらのApacheで弾く。
740名無しさん:2000/10/03(火) 22:36
>739
たとえばRewriteCondとRewriteRuleディレクティブを使えば
リファラ見て特別な処理させることも可能です。
でも、荒氏はふつうリファラーも偽装しますから、
それほどの効果はないんじゃないかと懸念されます。
741名無しさん:2000/10/03(火) 23:57
>740
ありがとうございます。RewriteCond、RewriteRule 調べてみます。

>でも、荒氏はふつうリファラーも偽装しますから、
たしかに偽装できるようなやつなら、どんな対策でも効かないかもですね。
そのままクリックしてくる人を弾くだけでも負荷は軽減されるかなと思って。
2chに書かれると、とんでもない数飛んできそうで。
742名無しさん:2000/10/04(水) 15:04
#!/usr/local/bin/perl

$hage = 'http://www.hoge.co.jp/|31yDeWzzZdoXc';

if ($hage =~ /([0-9a-zA-Z\/\.]{13})/){
print "Content-type: text/html\n\n";
print "$+";
}else{
print "Content-type: text/html\n\nNOMATCH";
}

31yDeWzzZdoXcにマッチさせたいんですけどどうしてこれだと駄目なの??
743AQ:2000/10/04(水) 15:14
if ($hage =~ /([0-9a-zA-Z\/\.]{13})/){

if ($hage =~ /([0-9a-zA-Z]{13})/){
744名無しさん:2000/10/05(木) 09:35
age
745DIL:2000/10/05(木) 15:52
表示ようの文字数字を、計算で使用するために
数値へ変換するにはどうすれば良いのですか?
初歩的な質問で、すんまそん。

$moji = '10';
$val = $moji * 3; ←これはNGですよね。
print $val
30
746名無しさん:2000/10/05(木) 16:05
アホですな
747DIL:2000/10/05(木) 16:24
アホデスンマソン。
デモ、オセ〜テクダサイ。オネガイシマス。
748名無しさん:2000/10/05(木) 16:46
は??
itteyosi とかを数値にってことか??>745

$moji = '10';
$val = $moji * 3; ←これはNGですよね。
print $val
それともこれが動かないっていうネタ??
749DIL:2000/10/05(木) 16:56
いやいや。
文字列を数値に変換したいんです。
たとえば、"10"という文字列を10という値にしたいんです。
よろしくオネガイシマス。
750俺も知りたい:2000/10/05(木) 17:06
俺も745と同じ方法を使って数値にしてる
$moji = '000010';
$moji = $moji + 0;
みたいな事やって $moji を 10 にしてる
745同様に誰かやり方教えて下さい。
751名無しさん:2000/10/05(木) 17:21
$moji = '000010';
$moji += 0;
じゃだめ??
752750:2000/10/05(木) 17:54
>751
もちろん $moji += 0; でもOK
と言うか俺も普段はこう書く。
753うざいのでマジレス:2000/10/05(木) 17:54
Perlには文字列や数値などのデータの区別はありません。よって

$moji = '10';
$val = $moji * 3;

は何の問題もなし。ちゃんと$val は 30 になります。
754DIL:2000/10/05(木) 17:55
>750 & 751
ありがとうございます。
出来たっす。感動っす。
よし、次のステップに進むぞ!!
755名無しさん:2000/10/05(木) 18:00
これほどアホな奴等は珍しいですね
756>750:2000/10/05(木) 18:08
こんな方法はいかが?

$moji = sprintf("%d"@`$moji);
757750:2000/10/05(木) 18:21
>756
ナルホド!ありがとう
758名無しさん:2000/10/05(木) 18:33
うざいからキエロ
759通りすがり:2000/10/05(木) 19:05
>755、758
スレッドタイトル見てみろや!!
初心者はウザイに決まってんだろ!!
おまえが氏ね!!
760>759:2000/10/05(木) 19:13
>初心者はウザイに決まってんだろ!!
お前どっちの見方だよ
755、758みたいな奴は無氏しときゃいいんだよ
761名無しさん:2000/10/05(木) 19:33
それ以前に自分の言ってる余計な一言が一番ウザイことに気づいていない。
762名無しさん:2000/10/05(木) 20:10
763名無しさん:2000/10/05(木) 23:32
ブラクラです!!
764名無しさん:2000/10/06(金) 07:32
別に普通のサイト。
まあ全然面白くもなんともないからバナクリックの宣伝か。
行く意味なし。
765764:2000/10/06(金) 07:32
sage損なった…。
766名無しさん:2000/10/06(金) 07:47
pushで@petの中にどんどん突っ込んでいったのですが、
@pet = ('cat'@`'cat'@`'cat'@`'cat'@`'dog');
こんな感じで重複があります。重複を避け
@pet = ('cat'@`'dog');
に変えるには、どうすれば良いでしょうか。
馬鹿みたいな質問ならスミマセン。
767弐ch編者:2000/10/06(金) 10:58
>>766
つっこむ変数が$tukkomu
だとして#ループ始まり
foreach(@pet){if($_ eq $tukkomu){$switch=1;last;}}
unless($switch){push(@pet@`$tukkomu);}
$switch=0;
#ループ繰り返し

んーなんかスマートじゃないような気がするけど
こんな感じかなぁ
768:2000/10/06(金) 11:22
my %pet;
map($pet{$_} ++@` @pet);
@pet = keys %pet;
769名無しさん:2000/10/06(金) 13:12
perldoc -q uniqueの方法bより:
my %saw; @out = grep(!$saw{$_}++@` @pet);

あるいは最初から@petに突っ込むんじゃなくて
%petに突っ込む($pet{$tukkomu}++);。
取り出すときに@pet = sort keys %pet;

>>768
voidコンテキストでmap使っちゃだめだよう。
770:2000/10/06(金) 13:20
ごめんよう(TT>768
771766:2000/10/06(金) 15:14
弐ch編者さん、ぽ さん、769さん、レスありがとうございます。
769さんの方法でやって見たところ、上手くいきました。
手元の初心者用書籍に載ってなくて、何日も冗長なソースを書いて
悩んでいたのですが、スッキリ解決ました。

>あるいは最初から@petに突っ込むんじゃなくて・・・
何だかスゴく勉強になって嬉しいです。
みなさん、どうもありがとう。
772名無しさん:2000/10/06(金) 17:42
前も答えたけど、こんなのにgrepもmapもループも要りません。

my %temp;
@temp{@pet} = ( );
@out = keys %temp;
773名無しさん:2000/10/06(金) 20:19
このスレかどうか忘れたけど自分、だいぶ前に766と同じ質問した事あります。

その際は772と同じ回答もらったよ。
772がその時の人かわからんけど感謝してます。

ありがとう、あの時の人。
774japu:2000/10/07(土) 00:04
お久しぶりです。しばらく、新マシン (hostname = ecoco) の設定ではまっていました。

さて、私は一時変数を使わない方法を。
@majokko = qw[Mami Emi Mami Pelsia Momo Yumi Lala-z Void Mami Momo];
@uniq = keys %{ { map { ($_ => "moe") } @majokko } };
として萌えて下さい。:-)
775名無しさん:2000/10/07(土) 05:33
@a = (0@`1@`2@`3@`4);
@b = (3@`4@`5@`6@`7);

両方に存在する要素のみ抜き出して配列@cに入れるにはどうすればいいか?

@c = (3@`4);

@aと@bにはそれぞれ30程度の要素があるとする。

776今非常に眠いので試してないです:2000/10/07(土) 05:46
>775
foreach $tmp (@a){
 foreach(@b){
  print $tmp if($tmp eq $_);
 }
}
777776:2000/10/07(土) 05:47
あ、ごめん
>配列@cに入れるにはどうすればいいか
だったね。
printはpushにしてね。。ねむ。
778名無しさん:2000/10/07(土) 12:20
my %temp;
@temp{@a} = ( );
@c = grep exists $temp{$_}@` @b;

配列2つでしか使えない、お手軽な方法。@b の重複も検出しません。
そういや昔どっかの馬鹿がもめてたな。この質問。
779名無しさん:2000/10/07(土) 16:32
質問です。
今レスキューの掲示板を使っているのですが、
デザイン変えるのに大変だからForm部を print等をはずして、
$FORM = <<"EOF"; EOF (ヒアドキュメントだっけ?)で囲みたいのですが、
EOF間に記述したらだめなものって何がありますか?
これを使うといつもエラーになってしまいます。
780>779:2000/10/07(土) 16:49
半角の @ がある、に一票。

telnetか何か使えるんなら、perl -cw hoge.cgi でエラーメッセージを
見てみませう。
781779:2000/10/07(土) 17:08
半角@はその間には使ってないです。

激初心者ゆえtelnetとかよく分かんないので、
これから調べに行ってきます。

ほかに使っちゃだめなのは何ですか?
7826:2000/10/07(土) 17:13
"
に一票。
783782:2000/10/07(土) 17:19
ん?これは大丈夫?
784名無しさん:2000/10/07(土) 17:42
>>779
半角英字の手前に隣接するShiftJISのスペースはないですか?
「 sample」の2バイト目以降は「@sample」なのです。
          
785名無しさん:2000/10/07(土) 18:51
つーか
<<"EOF"; でも
print ""; でも
ダブルクォート以外、エスケープの必要がある文字は同じだと思うんだが。
786弐ch編者:2000/10/07(土) 19:38
うちにくれば教えてあげるよ
787弐ch編者:2000/10/07(土) 23:41
>>779
おれが今までヤッタ失敗としては
EOFのあとちゃんと改行してないとか、、行頭にかいてないとか、、、
788779:2000/10/08(日) 01:49
レスありがとうございます。いろいろいじってたらエラーはなくなりました。
その部分を新たに書き直したのでどこを変えたのか自分でもよくわかんないです。
でも今度は別の問題がでできてしまいました。
FORMにクッキーの情報が出ないんです。
クッキー自体は作られていたので、セットされないということでしょうか?
789あっくん:2000/10/08(日) 02:36
以下のように、Unix Mailbox 形式のテキストファイルをニュースに投稿(ihave)するスクリプトを作ろうとしましたが、うまく動いてくれません。

#! /usr/bin/perl

if (<> =~ /^From </) {
&nbsp;&nbsp;while (<>) {
&nbsp;&nbsp;&nbsp;&nbsp;if($_ =~ /^From </){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$i++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open(OUT@` "| /usr/sbin/mail2news.pl ais.test");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print OUT $mail;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close (OUT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mail = "";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;$mail .= $_;
&nbsp;&nbsp;}
} else {
&nbsp;&nbsp;print "Not Unix mbox format.\n";
}

エラーログは、
Oct 8 02:18:11 ryan innd: localhost connected 18 streaming allowed
Oct 8 02:18:11 ryan rnews: bad_article missing Path
Oct 8 02:18:11 ryan rnews: cant read after 0 Bad file descriptor
Oct 8 02:18:11 ryan rnews: cant rename /usr/tmp/39df5ad3iH3JyU to /var/spool/news/incoming/39df5ad34ESZWE Permission denied
Oct 8 02:18:11 ryan innd: localhost:18 readclose
Oct 8 02:18:11 ryan innd: localhost:18 closed seconds 0 accepted 0 refused 0 rejected 0

という感じで、たぶん open(OUT@` "| /usr/sbin/mail2news.pl ais.test"); の部分が間違っているんだと思うのですが、ほかのスクリプトにひとつの引数と、標準出力を渡すには、どうすればよいのでしょうか?

mail2news.pl は、http://www.linux.or.jp/JF/JFdocs/Mail2News.html に付属するものを少し変更したものです。
790あっくん:2000/10/08(日) 02:50
えっと、上のようなスクリプトが必要なわけは、
MailingList <-> NetNews <-> WebBBS
なシステムがすでに出来上がっていて、そこに
過去の ML のアーカイブも入れたいと思ったからです。

例をあげると、Datula-ML みたいな感じで、そこに
過去のアーカイブを一気に投稿するスクリプトです。
そういうのって、きっと今までにも誰かが書いてるんじゃ
ないかなぁと思うんですけど、、
791nanasi:2000/10/08(日) 03:43
>rnews: bad_article missing Path

これがまず気になる。
メインの '/usr/sbin/mail2news.plの内容が分からんのだが
mail2news.pl の単体でテスト記事を投稿してみるが基地か。
792あっくん:2000/10/08(日) 03:58
>>791
ML -> NetNews は成功しています。
MBOX -> NetNews のスクリプトを書こうとして、失敗しています。
mail2news.pl は、先ほども書きましたが、http://www.linux.or.jp/JF/JFdocs/Mail2News.html に付属しています。

よくわかってないのですが、mail2news.pl のなかでも、

open (INEWS@` "| $inews $iopts") ......
while (<STDIN>) { ........

みたいな部分があって、そこで rnews という記事投稿用プログラムに
標準出力の結果をパイプで渡しています。
そういうスクリプト(mail2news.pl)に対して、さらにパイプで処理を渡そうとすることが間違っているのかな?
793nanasi:2000/10/08(日) 04:20
# 関係ないことだが個人的意見としては 2ch で敬語は要らんと思う。

書いてから思ったんだがユーザとかグループのパーミッションが
かなり気になる。
mail2news.pl が成功している時と、動かしているユーザが
違うということはなかろーか。

794souieba:2000/10/08(日) 04:59
cat mailbox |formail (-Y?) -s mail2news.pl newsgroup
のような感じでも出来るかも知れない。
795あっくん:2000/10/08(日) 11:14
>>793
># 関係ないことだが個人的意見としては 2ch で敬語は要らんと思う。
でも、たずねてるのに「教えろや、ゴルァ」だとやっぱ教えてもらえないんじゃ、、

>ユーザとかグループのパーミッション
これは、chmod u+s して root で動くようにしてます。
-rwsr-xr-x 1 root root 290 Oct 8 02:27 mbox2news.pl

>>794
>cat mailbox |formail (-Y?) -s mail2news.pl newsgroup
こんなのがあったとは!でも、このままだとエラー
mail2news.pl: "/usr/bin/rnews" died prematurely!
が出るので、man を見てみます。

>rnews: bad_article missing Path
なんとなくこれ、Path: ヘッダを mail2news.pl でつける前に rnews に送ってるのが原因のような気もする。
796名無しさん:2000/10/08(日) 12:26
># 関係ないことだが個人的意見としては 2ch で敬語は要らんと思う。

どこに「敬語」があるんだよ(^^;ワラ
797敬語の種類は3つ:2000/10/08(日) 13:37
話題になっている人を敬う「尊敬語」
話し手を貶めることで間接的に尊敬を表す「謙譲語」
話し相手を敬う「丁寧語」

あっくんのは一応「丁寧語」(「です・ます」調、敬体) ですから
敬語になります。796は出直してきてください。
ちなみに「だ・である」調(常体)は敬語ではありません。
798名無しさん:2000/10/08(日) 18:05
>>796
本物のアホだね。
はぁ・・・
小学生?
799nanasi:2000/10/08(日) 21:32
まあ「教えれ」という便利なローカル用語があるということでやね。
(以下略)
800質問君:2000/10/08(日) 23:47
$host=$ENV{'REMOTE_HOST'};
でリモートホスト情報がとれないのですが、
どういうわけでしょうか?
$ip=$ENV{'REMOTE_ADDR'};
これはきちんと取れる。

もうひとつ質問
$|=1;
ってどういう意味ですか?
801名無しさん:2000/10/09(月) 00:05
>800
そりゃ、鯖が逆引きしてくんないからでしょ?
gethostbyaddrかなんかで取れるんとちなう?
802質問君:2000/10/09(月) 00:09
ほう、やってくれない鯖ってのもあるのですか。
gethostbyaddrって初耳。ちょっと調べてみます。
803名無しさん:2000/10/09(月) 00:10
>800
$host=gethostbyaddr(pack("C4"@`split(/\./@`$ENV{'REMOTE_ADDR'}))@`2);

$|=1;
出力の自動掃き出し
804質問君:2000/10/09(月) 00:13
おお、調べる前に書いてくれている。
ありがとう。助かりました。感謝。
805むぎ茶:2000/10/09(月) 06:43



相当なアホだな。ここで質問する前に自分で勉強しろよ。

806名無しさん:2000/10/09(月) 11:28
Perl/Ruby Conference@` Linux Conference 2000
http://perlruby-con.opensource.gr.jp/
これなんですけど、Perl リソースキットをゲットするには
11月29日の何時ごろに受付に行けばいいんでしょうか?
やっぱ9:30前にはいっとかないとかなりの人出だから
すぐになくなってしまうんでしょうか。
いつも行ってる方とかの解説きぼー
807名無しさん:2000/10/09(月) 19:36
本屋で買えや
808名無しさん:2000/10/09(月) 23:50
先着1@`000名までですが、15@`000円の本が入場料2@`000円(学生)のみに
なるからほしいと思いました。15@`000円は書籍代としてはかなり高いと
思いますが、806さんにとってはそうではないのでしょうか。
809名無しさん:2000/10/09(月) 23:51
s/806さん/807さん/g;
すみません。
810名無しさん:2000/10/10(火) 01:01
徹夜で並べ。つーか2chで煽りにイチイチ反応してたら身がもたないぞ。
811むぎ茶:2000/10/10(火) 02:58


貧乏人はがんばって並んでください。ださ
812名無しさん:2000/10/10(火) 04:37
ファイルの作り方教えてください。
if(open(FH @` ">$filename"))
でやってたんですが、自分のパソコンではこれで良かったんですが
アップしてサーバーで動かしたらエラーになりました。
書き込みファイルをあらかじめ作っておけば(FTPで)動くんですけど・・・
これってこういうものなんですか?
open で新規ファイルって作れないんですか?
813名無しさん:2000/10/10(火) 04:43
ディレクトリの権限はどうなってる?>812
814東京kitty:2000/10/10(火) 05:14
パーミッションをいじれば解消することが多い。
パーミッションの設定は、サーバごとに違うから、
よく見といたほうがいいかもな。
>812
815名無しさん:2000/10/10(火) 05:35
とりあえず707
816812:2000/10/10(火) 05:53
レス遅くなってすいません。
こんなに早く返事もらえるとは思ってなかったので回線切ってました。
パーミッションを 707 にすればいいってことですか?
今は 755 になってました。
早速試してみます。
817812:2000/10/10(火) 06:04
707 にしてみたら動きました。
ありがとうございます。
それと、できればパーミッションについて教えてください。
いままで本などを見て適当に設定してたんですけど・・・
オーナー、グループメンバ、その他の人、ってどの人ですか?
よろしかったら教えてください。
また落ちますので返事遅れます。
818名無しさん:2000/10/10(火) 08:25
オーナー>自分
グループ>オーナーと同じサーバを使ってる人達
その他>別サーバからの人達(ブラウザでサイト見てる人もその他)
819818:2000/10/10(火) 08:36
実行>1
書込>2
読込>4

上の3つのメンバーに与えるパーミッションの属性の数字は
この3つの数の合計になってる。
7てことは1+2+4で全部OKってことだよな。
読込だけさせたければ4を指定すればいい。
読み書きなら6な。これでわかるかな。
820>812:2000/10/10(火) 18:14
open(FH@` ">$filename");

ファイルを新しく作る
=>ファイルを作るディレクトリに書く
=>ディレクトリに書く(2)パーミッションが必要

755で動かんつーのはcgiがnobody(818の言うその他)で動いてるって事。
freewebかい?
821812:2000/10/10(火) 23:50
818さんありがとうございます。
パーミッションたいぶ分かってきました。
820さん正解です。 freewebです。
822大阪の初心者:2000/10/11(水) 01:12
ディレクトリ名の変更で悩んでいます。
新名作成→旧名削除の手順を踏まず、直接変更する方法は、有るのでしょうか?
もし、有るなら教えて欲しいのですが。お願いします。
823>822:2000/10/11(水) 01:27
FTPだったら「リネーム(名前変更)」、
シェルだったら「mv」、
perlだったら「rename」
で可能。
824大阪の初心者:2000/10/11(水) 01:53
>perlだったら「rename」
823さん ありがとうございます。
ディレクトリ名の変更も「rename」で良いんですね。
さっそく試してみます。
825むぎ茶:2000/10/11(水) 03:37


そのくらい自分で調べろよ。

826名無しさん:2000/10/11(水) 16:16
同感。
827名無しさん:2000/10/11(水) 19:20
@hogeの要素は@hoge[1]と$hoge[1]のどっちが正しいのでしょう。
どう違うのかがわからなくて悩んでます。
828名無しさん:2000/10/11(水) 19:49
リストとスカラ。
829名無しさん:2000/10/11(水) 19:57
@hoge = ("a"@`"b"@`"c");
という配列があったときに、
@hoge[1]も$hoge[1]も"b"ですよね。両者の違いがわからないのです。
スカラとして解釈すると(?)$hoge[1]と書くという
ことなのでしょうか?

830名無しさん:2000/10/11(水) 20:19
@hoge[1] は配列 ( "b" )
$hoge[1] はスカラー "b"

ほとんどの操作で違いはありませんけど、例えば

$new = $hoge[1]; # "b" が入る
$new = @hoge[1]; # "b" ではなく "1" が入る

などの違いはあります。
831名無しさん:2000/10/11(水) 20:26
あ、肝心の「どっちが正しいか」というと、$hoge[1] です。
@hoge[1] なんて使っちゃだめです。Perlのコンパイラにも怒られます。
832名無しさん:2000/10/11(水) 20:29
>@hoge[1] は配列 ( "b" )
>$hoge[1] はスカラー "b"
なるほど! ありがとうございます。

>$new = @hoge[1]; # "b" ではなく "1" が入る
むむむ。こっちはよくわからないです。涙。
@hoge = ("a"@`"b"@`"c");
$new = @hoge[1];
print $new;
だと b と表示されるけど試し方が間違ってるのかな。

833830:2000/10/11(水) 20:45
ああ、ごめん。勉強不足でした。

@hoge[1] の最後の要素(つまり、$hoge[1] そのもの)がスカラー
$new に入るので、間違ってませんです。
834829:2000/10/11(水) 21:05
なるほど。ありがとうございます。嬉しいです。
835名無しさん:2000/10/11(水) 22:29
>829@`830
おれも上の読んで勉強になったよ。
perldocで確認したことをまとめておくよ。
(1) $scalar = @array; の場合は配列の要素数を代入。
(2) $scalar = (リスト); の場合はリストの最終要素を代入。
(3) @hoge[1] のような配列スライスは、リスト表記の一種
  というか略記法であり、この場合は ($hoge[1]) に等しいため
  上記(2)が適用される。
836名無し:2000/10/11(水) 23:18
(1.5) ($scalar) = @array の場合は @arrayの最初の要素を代入。
(2)は初めて知りました。
837835:2000/10/11(水) 23:34
>836
フォローありがと。ちなみに835の(2)の出典は、
perldoc perldata の "List value Constructors"のとこっす。
838あっくん:2000/10/11(水) 23:53
$script_name = pop(split(/\//@`__FILE__);
のsplit()の戻り値がスカラーではなく配列になってほしいのですが、
いちいち@tmpとかに代入することなく実現することはできますか?
839>838:2000/10/12(木) 00:15
split の戻り値は元々配列だけど…。何がやりたいのかわからん。
840名無しさんぽい:2000/10/12(木) 00:22
お。(2)は俺も始めて知った。便利あげ。
841japu:2000/10/12(木) 00:39
もしかして、
$script_name = (split /\//@` __FILE__)[-1];
とやりたいのかな。

コードを示すのも良いけど、何をやりたいかまで示しましょう。
842あっくん:2000/10/12(木) 00:43
split()の戻り値はスカラーと配列の両方があり、
スカラーの場合は分割された個数を返します。で、
$script_name = pop(split(/\//@`__FILE__);
だと、実行したときに、スカラーはpopできないというエラーメッセージが出ます。
843あっくん:2000/10/12(木) 00:50
>>841さん、まさにそれでした。すみません。
欲しいのはフルパスのファイル名から
ふつーのファイル名を得るスクリプトです。
844関係ないけど:2000/10/12(木) 00:55
なんか今日は書き込み多いね。ちょと嬉しい。
845>842:2000/10/12(木) 01:01
リストと配列の違いなんだけど…説明が難しい (°Д °)
@array = ( 'a'@` 'b'@` 'c' );
とあったとき、右の ( 'a'@` 'b'@` 'c' ) という「リスト」は、まだ
pop 等の操作ができない。
@array という「配列」に代入して、初めて操作可能になる、という…。
う〜ん。

つーか、それをやるなら split は遅いので
( $script_name ) = __FILE__ =~ /([^\/]*)$/;
の方が良いと思うけど。
846名無しさん:2000/10/12(木) 01:03
驚きっぱなしも間抜けなので新テクを一つ。
同じく perldata からです。

@x = qw(a b c d e f g);
@y = @x[-1@`5];
print "@y\n";

g a b c d e f
847846:2000/10/12(木) 01:07
>@y = @x[-1@`5];
-> @y = @x[-1..5];
の間違いです。

あと新テクというには(藁
848名無しさん:2000/10/12(木) 01:11
>>847
5の所に$#とか使うと結構使えるかもね
849名無しさん:2000/10/12(木) 02:03
>845
正規表現よりsplitの方が早いと思ってたんだけど
反対なの?
850AQ:2000/10/12(木) 03:37
なんか827からの話題ってすべてEffectivePerlに書いてあることばっかり。
この本Perlをある程度書けるようになってから読むとすごく勉強になるので
お勧めです。

ちなみに正規表現のほうが早いです。>>849
でも読みやすさを優先させればsplit。個人的には好みで好きなほう使えば良いと思う。


851名無しさん:2000/10/12(木) 04:22
なんか1からの話題ってすべてman perlに書いてあることばっかり。
852名無し:2000/10/12(木) 04:52
理解に苦しみます。

perl -e '@x=qw(a b c d e f g); $y = [@x[1..3]]; print "@$y\n";'

b c d

perl -e '@x=qw(a b c d e f g); $y = \@x[1..3]; print "$$y\n";'

d

853名無し:2000/10/12(木) 08:23
極当り前でした。
854名無しさん:2000/10/12(木) 16:42
ファイルAの後に
ファイルBを連結する
エレガントなやり方は?
OS依存しない場合は?
855名無しさん:2000/10/12(木) 18:00
open(B@` "$fileb");
open(A@` ">>$filea");

while(<B>) {
print A $_;
}
856便乗:2000/10/12(木) 18:21
exec 'cp a b';
exec 'cat c >> b';
とやると、同期とれてない感じに動いて
bにcが足されてない。なじぇ?
(v5.6.0 built for MSWin32-x86-multi-thread)

857名無しさん:2000/10/12(木) 18:58
system 使え。exec だと制御が戻ってこない。
858名無しさん:2000/10/13(金) 01:47
ミリ秒単位で時間を得るにはどうすればよいでしょうか?
859名無しさん:2000/10/13(金) 02:02
>858
select(undef@`undef@`undef@`0.1);
で0.1秒待つよ。これ利用してみては?
860名無しさん:2000/10/13(金) 02:22
説明不足ですみません。
$start = time;
(何らかの処理)
$end = time;
$cost = $end - $start;
というふうに、処理時間のコストを出したいんです。
上のようにすると、
$start = 971370103.1@` $end = 971370103.9 -> $cost = 0
$start = 971370103.9@` $end = 971370104.1 -> $cost = 1
のようになる気がするんですけど。
小数点以下は説明のためにつけました。
伝わりますでしょうか?実際には time で得られる値が整数なので
結果が違ってくるんだと思うんです。
861名無しさん:2000/10/13(金) 02:23
時間を測る方なら Time::HiRes death.

862名無しさん:2000/10/13(金) 02:29
http://search.cpan.org/doc/DEWEG/Time-HiRes-01.20/HiRes.pm
まさにこれです、どうもありがとう!
863名無しさん:2000/10/13(金) 10:17
Time::Hiresはperldoc -q secondで出てくるよ。

プログラム全体のどこが一番時間を食ってるか知りたければ
perldoc -q profileを見てDevel::DProfを知るよろし。

いろんな方法を比べるならBenchmark(これもperldoc -q profile)。
864名無しさん:2000/10/13(金) 10:52
perldoc ってどうやって読むんですか?
perldoc -q profile | pod2text | more
でいいのでしょうか?
865名無しさん:2000/10/13(金) 11:03
既存のエクセルファイルを開いて、中身の値を修正して保存したいです。
KbExcelで読み込んでSpreadsheet::WriteExcelで書き出そうと
考えましたが、罫線やマクロまで取り込めません。
何か良い方法無いでしょうか?
866名無しさん:2000/10/13(金) 11:20
my $hoge;
my $hoge=undef;
my $hoge='';
変数の宣言としてはどれがいいですか?
867名無しさん:2000/10/13(金) 11:32
初めて使うときの直前に my で宣言するとあとから見やすいような。。
my $hoge=undef; <- これ、意味あんの?
868名無しさん:2000/10/13(金) 12:37
>>864
テキスト形式がよければperldoc -t -q profileかな。
より詳しくはperldoc perldocを見よ。

perldoc -fとかperldoc -qでtext形式に整形しない
(POD形式でそのまま出る)のは
わざとなのかバグなのかはよくわかんない。
869名無しさん:2000/10/13(金) 19:19
別のホストからhtmlや、cgiの出力するhtmlを
読むにはどうすればいいのでしょうか?
870>869:2000/10/13(金) 19:52
激しくがいしゅつ。
過去ログ読みあされ。
871名無しさんぽい:2000/10/13(金) 19:54
どっかにソケット使って読むソース見た気がするが…気のせいだったかな。
872名無しさん:2000/10/13(金) 20:20
873名無しさん:2000/10/13(金) 20:50
DNS の逆引きができないIPアドレスでも、whoisすればネットワークアドレスがわかる場合がありますよね?
whoisサーバをJPNIC->InterNIC->その他という順番で検索してくれるwhoisモジュールってありますか?
http://search.cpan.org/doc/DHUDES/Net-Whois-1.9/Whois.pm
これはInterNIC用のようです。ソケットを使って一からというのは、、
874869:2000/10/13(金) 22:17
ども、872さんの見ました。
これの、HTTP::Requestというのは標準で入っているものなのでしょうか?
環境はjperl5.005_03-990822なのですが、使えませんでした。
動かしたいところが勝手にいじられないので、
モジュール以外のソケット等の他の方法はないでしょうか?
875>874:2000/10/13(金) 23:06
http://x68000.startshop.co.jp/~68user/net/

ここ見て勉強。解らなきゃ、んなことやろうとする資格なし。
876>875:2000/10/14(土) 01:20
ありがとうございます。
おかげさまでできました。
フリーサーバーではSocket使えませんでしたが...
877名無しさん:2000/10/14(土) 02:38
IRCにスクリプトを組み込みたいんですが、
どこか良い解説サイトありませんか?
878xxx:2000/10/14(土) 02:38
初投稿です。よろしくです。
perlをwindowsに入れて、
ローカルサーバでcgiを動かせる様にしたいのですが
perlの頭に書くパス(#!…)の書き方が分かりません..

DOS/Vでcドライブに入れたときは分かるのですが、
例えばd:\perl/bin/perl/に入れた場合は
パスの書き方はどうなるんでしょう???

よろしくお願いします。
879名無しさん:2000/10/14(土) 02:43
根本的な質問をさせて下さい…
接続元のホストって、偽装できるのですか?
880名無しさん:2000/10/14(土) 03:03
>878
そのままd:\perl/bin/perlと書けばいいはずだけど・・・。
881名無しさん:2000/10/14(土) 03:12
ローカルでテストする時はそれでいいんけど、
アップロードする時には忘れずに /usr/bin/perl とか に戻しておこうね。
882名無しさん:2000/10/14(土) 04:13
書きかえるのが面倒だからc:\usr\bin\にインストールするのが1番早い
883名無しさん:2000/10/14(土) 07:39
win2kでローカルのWEBサーバーを作ってCGIのテストをしようと思ったのですが、
いざやってみると、CGIをダウンロードしてしまいます。

本を見ると、そういう場合は「ファイルタイプの設定」で
「MS-DOSパッチファイル」の内容の種類を「text/plain」にしろということらしいのですが
「MS-DOSパッチファイル」というファイルタイプが見つかりません。
如何すればいいんでしょうか?
884あげ:2000/10/14(土) 08:51
根本的な質問をさせて下さい…
接続元のホストって、偽装できるのですか?
885名無しさん:2000/10/14(土) 09:51
初歩的な質問ですが……。
スカラー変数の小数点以下を切り落とすのには、どうすればいいのでしょう?
886名無しさんとも言える:2000/10/14(土) 10:10
>>885
$int = int($float);
887885:2000/10/14(土) 10:20
>>886
ありがとうございました。
早速試してみます。
888名無しさん:2000/10/14(土) 11:44
>>883
WEBサーバーは何ですか?
ApacheかAN-HTTPdならCGIを動作させるのも簡単だよ。
IISは、よくわからない・・・。
889名無しさん:2000/10/14(土) 15:24
AddHandler cgi-script .cgi???
っていうかサーバーソフトだね。
890名無しさん:2000/10/15(日) 00:17
しつもんです。
クッキーを無効にしてるユーザーを検出するにはどうすればいいんでしょう?

$oldcookie = $ENV{'HTTP_COOKIE'};
print "Set-Cookie: 〜 \n\n";
if ( $oldcookie eq $ENV{'HTTP_COOKIE'} ){
  # クッキーが更新されてない (=無効?)
}

こんなことやってみましたが、if文はいつでも真になっちゃいました。
891名無しさん:2000/10/15(日) 01:04
>>890
サンプルは、print文までとif(〜)はセッションが別ですか?
cookieを設定したあと、ブラウザがCGIを呼び直さないと、
$ENV{HTTP_COOKIE}は更新されていません。

JavaScriptでcookieの有効・無効を検出した方が楽なのでは?
document.cookieになんか設定してすぐ読み出してみたら?
892xxx:2000/10/15(日) 01:05
>880〜882

ありがとうございます!
しかし、やっぱりCGIが動きません..
パスの問題ではないのかなあ。
893名無しさん:2000/10/15(日) 01:18
クッキーの扱いはよく分らないけど、
>>890 だとどう考えてもif文は真になるよ。よく見てみな。

if($ENV{'HTTP_COOKIE'}){
  #クッキーが検出できたときは
  #クッキーOKの場合の処理
 }else{
  #クッキーが検出できない(空の)場合は
  #クッキーを一度渡してもう一度検出
print "クッキーを渡す";
if($ENV{'HTTP_COOKIE'}){
  #クッキーOKな場合の処理
  }else{
  #クッキー無効な場合の処理
  }
 }


よくわかんないけどこんな感じではいかが?
間違ってたらごめん。。。
894890:2000/10/15(日) 02:31
>>891
なるほど、別セッションにしなきゃだめなんですね。了解です。
JavaScriptと併用でどうにかしてみます。

>>893
すいません、よくわかんなかったです…。890のソースを
 $a = $b;
 $b = "test";
 if ( $a eq $b ){ # $b(cookie)の更新に失敗 }
と考えれば、いちおう「常に真」にはならないのでは?
もっとも891さんによれば、実行中に@ENVは変わらないとのことなので
無駄な話になっちゃいますけど。
895通りす狩り:2000/10/15(日) 03:13
%ENVだよ。
それと、891が言ってるのは$ENV{HTTP_COOKIE}の値が変わらないのではなく
クッキーそのものが更新されてないって事だと思うよ。
896エクステンションを.shtmlに変更して、、、:2000/10/15(日) 07:39

エクステンションって何だがや? 教えてちょ
897名無しさん:2000/10/15(日) 09:41
>>896
拡張子のことだろ?
.htmlとか.plみたいに、ファイル名の後ろにくっついてるヤツ。
この場合、ファイルを"file.shtml"にすればいいんじゃねーの?
っつーか、このスレで聞く質問か?
898>896:2000/10/15(日) 12:57
ホームページ板かパソコン初心者板で修行してきなさい。
899名無しさん:2000/10/15(日) 21:27
表示部がHTMLの掲示板を作ってるんですが、
javascriptを使ってcookieを取得して、
選択フォーム にクッキーの値を入れたいのですが出来ません。
↓みたいにしました。アドバイスお願いします。

<SCRIPT LANGUAGE="JavaScript">
&lt;!--
document.form1.SELECT1.value = No2;
// --&gt;

<FORM name=form1>
<SELECT NAME="SELECT1">
<OPTION VALUE="No1" >選択肢その1
<OPTION VALUE="No2" >選択肢その2
<OPTION VALUE="No3" >選択肢その3
</SELECT>
</form>
900名無しさん:2000/10/15(日) 23:10

ValueOfCookie = 0; // 「選択は何番目か」をクッキーに保存
document.form1.SELECT1.options[ValueOfCookie] = true;

順序が変わっても良いようにしたいなら、<OPTION name="No2"> とし

ValueOfCookie = "No2"; // 「何という名前のオプションが選択されていたか」をクッキーに保存
901名無しさん:2000/10/16(月) 00:25
age
902↓これが動きません:2000/10/16(月) 00:53
&lt;!--#exec cgi="/cgi-bin/accesslog.cgi"--&gt;
ダイレクトにaccesslog.cgiを開くと動くんですが…教えてちょ
903名無しさん:2000/10/16(月) 01:10
>>902
エラーメッセージ出てないのかな。
パスは http://www.NANTOKA.ne.jp/cgi-bin/accesslog.cgi で開くわけだよね?
904902@初心者:2000/10/16(月) 01:57
The server encountered an internal error or misconfiguration
and was unable to complete your request.
です。… .shtmlでやってもダメなんです。
905名無しさん:2000/10/16(月) 02:35
実はトップが
http://www.NANTOKA.ne.jp/~kantoka/
だったりして。
906名無しさん:2000/10/17(火) 09:09
public_html 以下に存在する全てのファイル一覧を取るには?

今は
opendir(DIR@`".");
@dir = readdir(DIR);

として@`@dir全てに-dのファイルテスト演算子をためしてディレクトリがあったらまたopendirって非効率な事してんだけど…
誰か助けてプリーズ
907名無しさん:2000/10/17(火) 09:24
>>906 そのほうが色々と安心だよ。<*>
まあ俺だったら grep(-d $_ && $_ ne '.' && $ne '..'@` readdir(DIR)); ってやるかな。
closedirが抜けてるのは省略してるだけだと思うけど良く忘れるので注意。
908907:2000/10/17(火) 09:25
書き損なった・
<*> だと見落とすことがあるし。って書こうとしていた。
909名無しさん:2000/10/17(火) 09:30
find が入ってれば
$pid = open FILES@` "find /path/to/publc_html -type f -print|";
@files = <FILES>;
close FILES;
みたいなことすれば少し速くなると思う。
ただそれほど変わらないんじゃないかな。
910名無しさん:2000/10/17(火) 10:58
これ面白いよ
http://k-basser.com/dorama/dorama.cgi
掲示板でドラマ作るらしい
ソースも公開されてるから挑戦してみたら
911名無しさん:2000/10/17(火) 11:08
おもろない…。宣伝か?
912名無しさん:2000/10/17(火) 11:39
>>906
標準モジュールFile::Findを使ってみよう。
perldoc File::Find参照。
913906:2000/10/17(火) 13:20
>>907 >>909 >>912
あんな駄質問に答えてくれるとは、ホントいい人だ。ありがとありがと。

ひとまずperldoc読んでみるです。
標準ならラクダ本にもあるかな…
914へたれ:2000/10/17(火) 13:55
gzipのパスってどうやって調べるのですか?
教えてくだされ。
勿論うちはtelnet使えます
へたれな質問ですまんす
915名無しさん:2000/10/17(火) 14:37
which gzip
916名無しさん:2000/10/17(火) 14:41
ややウケ >>914-915
って言うかPerlに関係ねーだろ >>914
917名無しさん:2000/10/17(火) 16:20
$ whereis gzip
918名無しさん:2000/10/17(火) 17:55
$ mail webmaster
Subject: 教えろや、ゴラァ!
gzipのパスわからん
教えろや、ボケ
^D
Cc:
919へたれ:2000/10/17(火) 18:53
ありがとごじゃります>みなさま

http://members3.cool.ne.jp/~cool_online/index.html
ここに書いてあることを試したかったのです

920名無しさん:2000/10/17(火) 19:25
それを先に言えシリーズ >>919
日本シリーズ
921名無しさん:2000/10/17(火) 21:34
+<などでファイルをopenしたとして
現在のファイルポインタ以降をファイルから削除することはできますか?
922名無阿弥陀仏:2000/10/17(火) 23:33
そろそろ移る準備はじめよう。
923名無しさん:2000/10/17(火) 23:34
>921
truncateでし。
924名無しさん:2000/10/18(水) 00:04
>918
この板で始めてウケた(藁
925921:2000/10/18(水) 00:18
ありがとうございます。調べてみます。>923
926名無しさん:2000/10/18(水) 01:14
読み書き両用のファイルオープンなんですが、書き込む時は追加で行う場合、

open(LOG@` "+>>./log.dat");

で良いんでしょうか?
927名無しさん:2000/10/18(水) 06:13
>>926
OKです。


ついで。
> 上書き(元ファイルがあっても内容を破棄)
>> 追加書き
< 読み
(未指定) 読み

上記の頭に + を付けると元のモードが読み書き兼用になる。
当然ながら +> で開くと元ファイルがあっても強制的に内容が消される。
+> 上書き(読み書き兼用)
+>> 追加書き(読み書き兼用)
+< 読み(読み書き兼用)
ちなみに
|$cmd だとコマンド $cmd へのパイプ書き込み
$cmd| だとコマンド $cmd からのパイプ読み込み


あと、900越えたので新スレ立てました。
ぼちぼち移動お願いします。
http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087&ls=100
928名無しさん:2000/12/14(木) 23:00
guest
929厨房です。:2000/12/15(金) 01:53
PerlでXML::DOMを使ってファイルをパースするときは、

my $doc = $parser->parsefile ("sample.xml");

でいいんだけど、CGIで同様のことをやる場合どうすればいいのでしょうか?
(ちなみにsample.xmlはスクリプトと同じディレクトリにあるとします。)
930厨房です。:2000/12/15(金) 01:54
あ・・書くとこ間違えた・・。
931名無しさん:2000/12/16(土) 23:46
初めてこの板来たんだけど、レス総数が1桁のスレッドばかりだね…
932名無しさん:2000/12/17(日) 11:32
ペールって何が面白いの?
933名無しさん:2000/12/17(日) 19:12
local @val;

この使い方は合ってますか?
934名無しさん:2000/12/17(日) 22:14
あってますけど。何か疑問な点でも?
935名無しさん:2000/12/17(日) 22:19
>931 先生のお越しをお待ちしてました。
  わかりやすくレスしてくださいね!                 (氏ね
936名無しさん:2000/12/18(月) 00:21
あえていうなら、なぜ local。
localが必要な局面は、あんまりないでしょ。
myつかおう。
937名無しさん:2000/12/18(月) 01:38
938933の名無しさん:2000/12/20(水) 03:16
localって使わない?
myを使う場合って?
ご教授よろしく。
939japu:2000/12/20(水) 03:42
localを使う場合。
1. $_ などの特殊変数に対して。
2. ファイルハンドルを局所したい場合。local *HOGE;

2. は use FileHandle; して my $fh = new FileHandle; とかする方が良いけどね。
940936:2000/12/20(水) 06:52
japuさん サンクス。
941933の名無しさん:2000/12/20(水) 11:08
今、本を読んだらmyの方がイイね。
ありがとう。
942Dest:2000/12/23(土) 15:37
AnHTTPD を使ってるんすけど, AnHTTPD から CGI を実行させても CGI 内
に記述した SSI を実行してくれないんですよね.

.htaccess ファイルもダメで,どうにかならないものですか.
レジストリもいろいろやってみましたがダメでちた
943名無しさん:2000/12/23(土) 17:23
942はマルチ野郎。
相手にする必要なし。
どうしてもってやつは、下のスレでやってくれ。

http://tako.2ch.net/test/read.cgi?bbs=perl&key=977553926
944名無しさん:2000/12/24(日) 04:11
$| = 1;
てバッファをフラッシュさせるって良く聞けど
どういう意味なの?

またどんな時に使うと宜しいの?
945944:2000/12/24(日) 05:18
http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087
このスレの492〜を見て。

というより、初心者コーナーは上記スレに引越してるので
このスレは使わないように。
946945:2000/12/24(日) 06:52
945は944に向けた発言でした。
スマソ。
947ぶくぶく:2001/02/23(金) 22:39
掲示板に、外部の画像を張りたいんですけど、
どうすればよろしいのですか
やさしい方教えてください。
948名無しさん:2001/02/23(金) 23:03
>>947
氏ねて。
949ぶくぶく:2001/02/23(金) 23:47
おしえてくださいよ
950名無しさん
>>949
このスレ終了してるんだって。