トップページ⇒php
1001コメント350KB

【Perl 】初心者コーナーPart7

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい01/09/12 13:04ID:???
いらっしゃーい、perlのコーディングで困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://corn.2ch.net/test/read.cgi?bbs=php&key=988809842&ls=50
CGIの質問はこちら【CGIだけど、なんか質問ある?part3】
http://corn.2ch.net/test/read.cgi?bbs=php&key=988727833&ls=50

過去ログ、その他の役立ち情報は>>2-5を見よう。
0482 01/10/02 10:22ID:80rCzk0o
### location
sub location{
print "Location: $url\n";
exit;
}#location END

こんな感じで飛ばすと、表示したブラウザの下に
Location: ero.cgi?zap
と表示されます。表示しないようにする方法はありますか?
宜しくおねがいします
0483名無しさん@お腹いっぱい。01/10/02 10:27ID:???
下ってどこよ?
048448201/10/02 10:32ID:80rCzk0o
>>483
ブラウザの一番下(ページ内)です
urlが出たりする所じゃないです
048548201/10/02 10:37ID:80rCzk0o
>>483
あっと、解決しました
すまんですたぃ
0486名無しさん@お腹いっぱい。01/10/02 10:41ID:???
そりゃただのスクリプトのバグ。
必要ないのにlocationサブルーチンを呼び出してる。
どこだか分からなかったら、適当なところにアプすれば見るよ。
0487名無しさん@お腹いっぱい。01/10/02 10:41ID:???
あ、かぶった。鬱。
0488101/10/02 15:21ID:LK1d/L0I
その画像ならココ
http://www.h2.dion.ne.jp/~goldman/
0489バイトコードの取得方法について01/10/02 15:36ID:ZBXcT.qc
バイナリファイルを「変数」に読み込んで
一バイトずつループ処理をする方法はありますか?

「ファイルハンドル」を用いて指定位置のキャラクタコードを
取得する方法はありますか?
(getcだと位置を指定できません)

正に初心者のなのでよろしくお願いします。
0490名無しさん@お腹いっぱい。01/10/02 15:47ID:???
CGIで、渡されたフォームデータをデコードする際に、
$value =~ tr/+/ /;
で躓いています。
実データの「+」をそのまま「+」で表示し、
半角スペースのみを変換するにはどうしたらいいのでしょう?
049149001/10/02 15:59ID:???
すみません。解決しました。
デコードの順番が逆でした。
逝ってきます。

$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$value =~ tr/+/ /;
↓
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
0492JAPU01/10/02 17:36ID:???
>>489
seek と getc の組合わせで解決?

seek FH, 100, 0;
$c = getc FH;

# seek の使い方は perldoc -f seek を参照。
# または "プログラミングPerl 第2版" or "Programming Perl 3rd Ed." を買う。
0493名無しさん@お腹いっぱい。01/10/02 17:50ID:RaZaDOV6
すみません、>>479をもう一度教えてもらえないでしょうか?
049448901/10/02 18:51ID:???
>492
レス有難うございます。帰宅してから試してみます。
0495名無しさん@お腹いっぱい。01/10/02 20:05ID:???
正規表現でどうしても解らないのですが
http://で始まる文字列を抽出したいのですが

http://www.gc-inside.com/news/20010927am2.html
のようなURLは正常に処理されるのですが
http://choco.2ch.net/test/read.cgi?bbs=tvd&key=998696750
のような=?!&が混入したURLがマッチしません
よそのサイトのを参考にしてしまったので
正規表現部分の内容を余り理解して無くて困ってます

ちなみに下がソースです

#正規表現により配列に展開される
@http = $text =~ /s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g;

http://choco.2ch.net/test/read.cgi?bbs=tvd&key=998696750
のようなURLでもマッチするようにしたいのですが
できればアドバイス下さい
よろしくおねがいします。
0496JAPU01/10/02 20:28ID:???
& -> & に変換した後だったとかいうオチ?
0497101/10/02 20:29ID:LK1d/L0I
http://www.nt.sakura.ne.jp/~rose/
0498名無しさん@お腹いっぱい。01/10/02 20:37ID:W6pnxjhI
&
0499名無しさん@お腹いっぱい。01/10/02 20:38ID:W6pnxjhI
&
0500名無しさん@お腹いっぱい。01/10/02 20:52ID:6OIJd9Gg
拡張子を一括変換するのってどうやるんでしたっけ。
(たとえば全ての拡張子を.tmpに変更する)
なんかやりかたがあったような…
0501名無しさん@お腹いっぱい。01/10/02 20:54ID:gYYU4i1s
Linuxのコマンドを実行する
system("command par");
で、ユーザーの追加をperlでやろうと思うんだけど

$username = 'hogehoge';
system("useradd $username");
system("passwd $username");

とすれば確かにユーザ追加されるが、パスワードは何か?と聞かれる(当然だけど)
そこでパスワードをパラメータとして入力するにはどう記述すれば良いんですか?
$userpass = 'xxxxx';
って感じで変数にしてやりたいんですが。
0502JAPU01/10/02 22:39ID:???
>>500
foreach (<*.moe>) {
($x = $_) =~ s/\.moe/.tmp/;
rename $_, $x
}
とか?

csh 系なら、
foreach f (*.moe)
mv $f ${f:r}.tmp
end

bsh系なら、for .. done で。


>>501
chpass -p CRYPTEDPASSWD userなんてのはどう?

http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.sbin/adduser/adduser.perl?rev=.
とかも参考になるかも。
0503名無しさん@お腹いっぱい。01/10/03 01:59ID:VWQvA4GE
>>500
DOSなら ren *.moe *.hoe
0504FREAKES01/10/03 02:32ID:iOlT3Zgg
http://www.freakes.dyn.to/
うまく掲示板のCGIが動作しません
どうしてでしょう、自分では、みれるのに
0505名無しさん@お腹いっぱい。01/10/03 02:38ID:???
http://127.0.0.1/aska.cgi
0506名無しさん@お腹いっぱい。01/10/03 03:42ID:???
>>504
マルチポストうざい。
0507名無しさん@お腹いっぱい。01/10/03 05:39ID:xNIE/jvQ
アクセスカウンタを作ろうとしています。

しかし以下のようなスクリプトだとどうもうまく行きません。
$counterlogのファイルを作成して一度目、二度目は1、2とカウントされ、表示
もされるのですが、三回目はいきなり13となります。4回目は1214、5回目は
12131215という具合です。

sub counter {

open(COUNTER, "+<$counterlog");
$counter = <COUNTER>;

++$counter;
print COUNTER $counter;
close(COUNTER);
}

どこがおかしいのか分かりません。

よろしくお願いします。
0508名無しさん01/10/03 05:52ID:xwMhor1s
printのまえにseek COUNTER, 0, 0;かな?
0509名無しさん@お腹いっぱい。01/10/03 06:27ID:7VPeoMkk
gzipを使ってみたいのですが、Windowsでテストできますか?
0510名無しさん@お腹いっぱい。01/10/03 07:00ID:???
>>508
投稿したあとで検索エンジンで調べてみるとtruncate(COUNTER, 0);と
seek(COUNTER, 0, 0);との組合せを発見しました。

seek(COUNTER, 0, 0);だけでもいいのか・・・。

いろいろ試してみます。

ありがとうございます。
0511名無しさん@お腹いっぱい。01/10/03 07:03ID:1Z0sNt2w
>>509
Windows用のgzipをGETせよ → http://www.gzip.org/
0512名無しさん@お腹いっぱい。01/10/03 07:12ID:???
>>509
『出来る』と答えりゃ良いのか?

えすぱってみると、mod_gzipかCygwin辺り?
何をしたいのか書いとらんから、さぱ〜り分らん。

> 良い回答は良い質問から
>>1 を良く読んでくれ。
051350901/10/03 07:32ID:7VPeoMkk
すいません。mod_gzipでHTML出力をしたいのです。
051450901/10/03 08:46ID:???
環境はWin2000 + Perl + ANHTTPDです。
apache for win32を入れないと駄目なのでしょうか?
0515名無しさん@お腹いっぱい。01/10/03 09:20ID:???
>>514
ANHTTPDは触ったことないんですけど、
Win2000 + Apache for Win32 ならmod_gzip入れるのは簡単ですよ。

ていうか513を読んで、試しに↓からダウンロードしてみたら
あんまり簡単に動いてびっくりした。
http://www.remotecommunications.com/apache/mod_gzip/
0516ファイルの新規作成01/10/03 12:36ID:???
新規でファイルを作成するにはどうすればよいですか?
まだ存在しないので open ができずファイルハンドルが
取得できません。
051751601/10/03 12:41ID:???
すみません。うまくいきました。openできないと思っていたのは
他のエラーが原因でした。
0518えび01/10/03 12:41ID:tut8CQIE
>>510
seek(COUNTER, 0, 0);で良いと思います。
seek(COUNTER, 0, 0);はファイルポインタを先頭までまき戻す。
truncate(COUNTER, 0);はファイルを0バイトまで切り詰める。
という処理ですが、
カウンターファイルに新しく数値を記入する場合であれば
seekで先頭にまき戻して新しいカウントの数を上書きすれば良いと
思います。
カウンターは桁が増えても桁が減るという事はないので
以前のデータから上書きしても以前のデータの切れ端とかが
残る事はないのでseekだけで問題はないでしょう。
0519初心者だけど検索くらいは出来る人01/10/03 12:49ID:???
http://www.harukaze.net/~mishima/perl/faq/newbiefaq.html#4
052051901/10/03 12:50ID:???
>>519は>>516宛。
しかも解決してるし。
逝ってきます。
0521名無しさん@お腹いっぱい。01/10/03 12:54ID:???
かわいそうなので逝ってらっしゃいのキスして あ・げ・る(はぁと

ブチュゥ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
0522名無しさん@お腹いっぱい。01/10/03 13:34ID:6LJeEkqs
>>521
まじで背筋がゾッとしたからやめてくれ
0523 01/10/03 14:13ID:???
数段階の仲介を経てからでしかその知識を得られないなんて。
理想ならその業界の技術書を熟読するのが一番なの。
サバ構築だって然り。ネットとは何か?と言うこと。
書店にあるものを読んでるうちは中級どまり。
高校の微積分を学ぶときは決してニュートンやライプニッツの原書を読まないのは単に難易度の問題。
機会があれば読むべき。
0524名無しさん@お腹いっぱい。01/10/03 14:20ID:???
523 は何が言いたいのか要点を纏められたし。
0525 01/10/03 14:36ID:???
サラサーテ、著者の飯代の為に使い物にならない偽専門書を買うな!
業界が発行してる物を無料で入手できそうなんだから!
0526 01/10/03 14:37ID:???
まぁ、C/C++ならJIS X 3010やANSIから入手したらいいんだよ
厨房を偽装して買いあさるな!
0527 01/10/03 14:40ID:???
オレはソフトにはカネは使わん!(エンターテイメントは除外)
ハードにはしぶしぶ使う。
けどアキバで部品単位でBSテレビが作れるなら
それに超したことはない
故障のたんびに悪対応の窓口は死ね!
0528名無しさん@お腹いっぱい。01/10/03 14:43ID:???
スレ違い。カエレ!!
0529名無しさん@お腹いっぱい。01/10/03 15:01ID:HFewZhw6
とほほさんのwwwsrchを使っているのですが
これってcgiファイルの文字は検索対象に入らないのでしょうか?
掲示板の書き込みとかもトップページから検索できるようにしたいので。

どなたかご存じの方は教えて下さい。
0530101/10/03 15:11ID:1nsRDm4c
http://www5.justnet.ne.jp/~ttp/
0531名無しさん@お腹いっぱい。01/10/03 15:57ID:???
>>529
スレ違い。つかマルチポスト死ね。
0532名無しさん@お腹いっぱい。01/10/03 16:41ID:???
そんなことより腹減らねぇ?
0533丸出し01/10/03 17:23ID:eJHCCMAc
最近一日一食だ…。
ところで話を戻しますが、
なんかナイスタイミングで529と似てるんですけど
文字列検索する時って正規表現じゃなくて
index使う利点ってあるんですか?
これだと大文字小文字区別しない風にできないと
今の知識だと思うんですけども…?あほな事いってます?
0534a'x01/10/03 17:35ID:???
正規表現よりindexの方が速い。
0535名無しさん@お腹いっぱい。01/10/03 17:40ID:???
↑本に書いてあること真に受ける馬鹿
0536a'x01/10/03 17:43ID:???
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
ら辺読め。
0537名無しさん@お腹いっぱい。01/10/03 17:44ID:???
アホな質問かもしれませんが while ループでは
カウンタは自前で用意する必要がありますか?
$xxx みたいにあらかじめ使える変数が用意されているとか
ないですか?持っている本には出ていないのですが
あればいいなと。
0538名無しさん@お腹いっぱい。01/10/03 17:46ID:???
↑Webページに書いてあることを検証もせずに受け売りをする馬鹿
0539名無しさん@お腹いっぱい。 01/10/03 17:46ID:???
$xxxって何? そんなの有るのか???
0540名無しさん@お腹いっぱい。01/10/03 17:46ID:???
>>537
ないよん。
0541名無しさん@お腹いっぱい。01/10/03 17:47ID:???
>>538
Benchmarkやindexの使い方分からない猿  ププ
0542名無しさん@お腹いっぱい。01/10/03 17:48ID:???
低レベルな争いはよせ。
>>541
そんな奴いない。
0543名無しさん@お腹いっぱい。01/10/03 17:51ID:???
下らないことには盛り上がるね。
0544名無しさん@お腹いっぱい。01/10/03 18:02ID:???
PCとi-mode共用の掲示板を作っているのですが、
半角カナで入力された場合、全角カナに自動的に直して
表示する環境変数を教えて下さい。バイト数をチェックすれば
いいんでしょうか?
0545名無しさん@お腹いっぱい。01/10/03 18:02ID:???
#! /usr/local/bin/perl
use Benchmark;
open FH, "./seek.dat";
@lines = <FH>;
close FH;
timethese(16, {
'REGEXP ' => \&find_by_regexp,
'INDEX ' => \&find_by_index,
} );
sub find_by_regexp {
my $count = 0;
foreach (@lines) {
if (/an/) {
$count++;
}
}
}
sub find_by_index {
my $count = 0;
foreach (@lines) {
if (index($_, "an") >= 0) {
$count++;
}
}
}

Benchmark: timing 16 iterations of INDEX , REGEXP ...
INDEX : 3 wallclock secs ( 3.31 usr + 0.00 sys = 3.31 CPU) @ 4.83/s (n=16)
REGEXP : 4 wallclock secs ( 4.02 usr + 0.00 sys = 4.02 CPU) @ 3.98/s (n=16)

2万行のデータで検証。
0546名無しさん@お腹いっぱい。01/10/03 18:03ID:???
結論 535 538 はただの煽り。
0547名無しさん@お腹いっぱい。01/10/03 18:05ID:???
$ENV{'ZENKAKU_TO_HANKAKU'}の事ですか?
これを使えばいいですよ?
検索して頑張って下さい?
0548名無しさん@お腹いっぱい。01/10/03 18:05ID:???
当たり前の常識を検証して大得意の545萌え
054953801/10/03 18:06ID:???
で、どっちが速いんだよ?
0550名無しさん@お腹いっぱい。01/10/03 18:09ID:???
あほらし。このネタ終わり。
-------------仕切り直し----------------
0551名無しさん@お腹いっぱい。01/10/03 18:11ID:???
>>548
まさか本当に検証されるとは思わず嘘ついて荒らそうとしていた
548=538萎え。
0552名無しさん@お腹いっぱい。01/10/03 18:18ID:???
indexネタはもう終わりにしてね。
それより>>547を問い詰め(以下略
055354401/10/03 18:27ID:6STEKkdE
す、すみません。聞き方がまちがってました。
環境変数じゃなくて、置き換え演算子の事です。
よろしくお願い致します。
055451201/10/03 18:34ID:???
>>514 509
515さんが言ってるとおり、Apache入れた方が凄まじく楽なのは事実。
ただ、mod_gzip使わなくてもCGIの出力ならGZIPと併用して出来なくも
無い筈。AnHttpdは使ってないから分らんけど。
ここ見てくれ。
http//www.ibport.co.jp/~yui/cgiwork/tech/index.html
これやるなら、たぶんCygwin入れると厄介しなくてすむと思う。
つか、Apache(Win32)入れた方が早いかなぁ(苦笑

どっちかと言うと、『CGIだけど、なんか質問ある?』スレ向きな
気もしてきた…。
0555名無しさん@お腹いっぱい。01/10/03 19:09ID:1VC1FzQw
>>544
Perl自体には半角全角変換の機能は(まだ)ないから、
自分でコードを書くか、出来合いのライブラリを使います。
たとえばjcode.plを使って$FORM{TEXT}を変換するなら下のとおり。

require 'jcode.pl';
jcode::h2z_sjis(\$FORM{TEXT});
055654401/10/03 19:22ID:???
>>555
ありがとうございました。
演算子を使えばできるかもと思っていたんですが、
勉強不足でした。精進します・・・
055755501/10/03 20:07ID:???
>>556
ついでに自力でコードを書く例も。

%han2zen = ( #一部のみ抜粋
'ニ'=>'ニ', 'ク'=>'ク', 'コ'=>'コ', 'ッ'=>'ッ', 'プ'=>'プ',
'ン'=>'ン', 'マ'=>'マ', 'ズ'=>'ズ', 'ー'=>'ー',
);

$s = "ニクコップン(-д-)マズー";
$s =~ s/([。-゚][゙゚]?)/$han2zen{$1}/ge; # ←ここで変換
print "$s\n";

これで大丈夫かな?? 実際には%han2zenに、
すべての半角カナ→全角カナの対応を入れてください。
055855501/10/03 20:12ID:???
>>557 は間違い。s///ge; じゃなくて s///g; でした。
055954401/10/03 20:12ID:???
>>555
重ねてありがとうございます。
早速、参考にさせていただきます。
まだまだ勉強せねばです・・
0560丸出し01/10/03 20:34ID:???
なるへそ〜〜〜。
indexのが早いんですか!
ある配布cgiで検索機能があったんですけど
半角全角を一緒にして検索できる便利さを捨てて
鯖の負荷を減らす方をとったのか。
なるへそ〜〜。ありがとです。
0561名無しさん@お腹いっぱい。01/10/03 20:50ID:VH/5AUng
ローカルでANHTTPとActivePerlで色々やっている者ですが
REMOTE_HOSTをgethostbyaddrでIPからアドレスに変換したのですが
変換するとpop3.norton.antivirusと表示されます。
これって何でしょう?間違ってはないと思うのですが…
識者の方でご存知のかたおられましたらお願いします。
0562名無しさん@お腹いっぱい。 01/10/03 20:59ID:???
悩豚のローカルプロクシだろ、
気にスンな
気になるならセキ板でもいって「ハックされていますっ!!!!」
ってスレ立てて死んでこい  w
0563名無しさん@お腹いっぱい。01/10/03 22:33ID:???
$xxx はPerlで幾つか用意されているグローバル変数と
言う意味で書いています($で始まるの色々ありますよね)。
0564名無しさん@お腹いっぱい。01/10/03 22:43ID:???
だから無いって。
0565名無しさん@お腹いっぱい。01/10/03 22:53ID:???
素直にfor使えば?
そのためのやつでしょ。
0566名無しさん@お腹いっぱい。01/10/03 23:37ID:CQyY2Ec6
全くの初心者で、初心者ならPerlと薦められてきた者ですが、
Perlで定期的に送信フォームを押すみたいなことはできますか?
つか、初心者はその前にこれ覚えれみたいなことありましたら指摘お願いします。
0567名無しさん@お腹いっぱい。 01/10/03 23:38ID:???
答え:
まず日本語を勉強してね &heart
056856601/10/03 23:43ID:???
>>567
意地悪しないでお願いします。
どこかおかしな日本語があったでしょうか?
0569not 56701/10/03 23:49ID:???
>>566
> 初心者はその前にこれ覚えれみたいなことありましたら指摘お願いします。

質問の仕方
0570名無しさん@お腹いっぱい。01/10/03 23:50ID:???
>566
>>1周辺を見ろ。
方言使うな。
057156601/10/03 23:54ID:???
>>569
勉強して出直してきます・・・
0572名無しさん@お腹いっぱい。01/10/03 23:59ID:???
厳しいなぁ(笑
ちょっと漠然としすぎてて答えようが無いよ
この板に良書スレが有るから、そこを良く読んで自分に合った
本を一冊買って下さい。
で、それを読みながらWEBなんかも活用して勉強すればいいよ。
それといきなりCGIは薦めないな、、少しはPERL書けるようになって
HTMLも書けるようになれば自然と書ける様になるから
057356601/10/04 00:21ID:???
>>572
ありがとうございます。
全然右も左もわからないもので・・・
以前age荒らしをスクリプト組んでやってる、というのを見て、
プログラミングに興味を持ったのですが、(荒らしをしたい訳じゃないんです。断じて)
例えは悪いですが、そういうことはできるのか知りたかったんですが、
これでもまだ漠然としているんでしょうかね・・・
とりあえず、勉強して出直してきます。有り難う御座いました。
0574名無しさん@お腹いっぱい。01/10/04 00:24ID:???
おう、頑張れよー
0575名無しさん@お腹いっぱい。01/10/04 00:30ID:???
ま、あれだな。ゲーム作りたくなってプログラミングに興味もったけど、案外難しくて挫折な厨房もいるしな。
関係ないけどね。頑張ってね。
057651001/10/04 02:08ID:f1gid5yY
>>518
えびさん
遅くなりましたが、詳しいお答えありがとうございました。

・・・精進します・・・。
0577名無しさん@お腹いっぱい。01/10/04 08:23ID:9Z2wk3j2
向上心のない善人よりも、
明確な目標を持った厨房のほうが好きだね。俺は。
つーわけで>>566みたいな奴には期待したい。

(1)ローカルマシンにPerlとWebサーバを入れる。
(2)全環境変数表示CGIを自作し、Webサーバで動かす。
(3)GETメソッドで(2)のCGIにアクセスしてみる(LWP::Simpleモジュールが便利)
(4)POSTメソッドで同じく(2)にアクセス(LWP::UserAgentモジュール)
とりあえ、以上の実験を試してみることをすすめる。
0578名無しさん@お腹いっぱい。01/10/04 08:41ID:???
>>537,>>563
残念賞として"$."(現在の行番号)をあげよう。

while (<DATA>) { print "$. $_"; }
__DATA__
mona
giko
057950901/10/04 09:10ID:???
>>515,554
有難うございます。Apache for win32入れてやってみます。
0580名無しさん@お腹いっぱい。01/10/04 11:35ID:nOAoqb9A
CGIで、呼び出し元のURLを知りたいのですが。
HTMLA → CGI の、HTMLAのURLです
0581名無しさん01/10/04 11:37ID:???
リファラを読む
■ このスレッドは過去ログ倉庫に格納されています