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

【Perl 】初心者コーナーPart8

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

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

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

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://ebi.2ch.net/test/read.cgi/php/988809842/l50
CGIの質問はこちら【CGIだけど、なんか質問ある?part4】
http://ebi.2ch.net/test/read.cgi/php/1000804655/l50

過去ログ、その他の役立ち情報は>>2-10を見よう。
0268名無しさん@お腹いっぱい。01/11/13 21:50ID:???
>>267
それもまた暴走と言える気がしなくもないが。
026926001/11/13 22:22ID:yD0vdlkp
>>261が回答なんでしょうか?
すいません、厨房にもわかるよう誰か教えて下さい。
0270名無しさん@お腹いっぱい。01/11/13 22:28ID:???
>269
>261さんじゃないですけど。
opendir DIR,"./poyo"; #ログのあるディレクトリを開く
@files = readdir DIR; #ディレクトリ内のファイルを配列に入れる
foreach (@files){ #配列の中身全てに対して
 open IN,"./poyo/$_" if(-T "./poyo/$_"); #そのファイルがテキストファイルならファイルを開いて
   。 #処理をする
   。 #処理をする
}

ただ、ここまで教えてもらったら、自分でも調べてみた方がいいですよ?
0271名無しさん@お腹いっぱい。01/11/13 23:21ID:???
>269
>これをdata1.txtだけでなくdata2.txt、data3.txtからも
>読み込んで検索したいのです
なら単純に3回コピペを繰り返せばいい。それでも動くし全然問題無い
その聞き方じゃ、その分繰り返せとしか答えられないだろ?

多分配列操作が出来ないと仮定して書く
for $datafile (("data1.txt","data2.txt","data3.txt")){
print $datafile,"\n";
}
0272名無しさん@お腹いっぱい。01/11/14 00:38ID:???
ファイルの一番最後の行だけ読み出すことは出来ませんか?
やはり先頭から順に読んでいかなければなりませんかね。
0273名無しさん@お腹いっぱい。01/11/14 00:49ID:???
$ tail -1
ってそういう意味じゃない?
0274名無しさん@お腹いっぱい。01/11/14 00:56ID:???
>272
readで取って,\n以後を取る。
\r出てくるまで取り続ける。

http://pc.2ch.net/test/read.cgi/php/1000804655/394-443
で422氏がtailもどきというのを作ってたので参考にするといいかも。
027527401/11/14 00:58ID:???
環境で\nやら他の字やらになるか。
0276名無しさん@お腹いっぱい。01/11/14 01:09ID:???
素直にDB_RECNO使っとけ。
0277名無しさん@お腹いっぱい。01/11/14 01:11ID:???
>>273
「$tail」というのは、Perlの標準の関数なんですか?
今まで存在すら知りませんでした。

>>274
ありがとうございます。そのスレ読んでみます。
027827301/11/14 01:17ID:???
違う違う、シェルです(^^;; > $
0279名無しさん@お腹いっぱい。01/11/14 01:17ID:???
すみません、オートリンクで
http://www.****.com/redirection.cgi?target=http://www.yahoo.co.jp
の様に、cgiを一回咬ませたいのですが、どの様にしたらいいでしょうか?
本当に初心者の質問ですみません・・・
0280名無しさん@お腹いっぱい。01/11/14 01:21ID:???
s#($uri)#<A href="$1">$1</A>#g;
みたいのを
s#($uri)#<A href="$cgi?$1">$1</A>#g;
とかやるだけと思うが。
028127901/11/14 01:51ID:???
>>280
お答え有り難う御座います。
ですが、何だか巧く行かなかったので、もうチョイ詳しく書いてみようと思います。
ーーーーソースーーーー
sub autolink{
$_[0] =~ s/(https?|ftp|gopher|telnet|whois|news):\/\/([\w|\!\#\$\%\&\'(下の行と繋がってます)
\(\)\=\-\^\`\\\|\@\~\[\{\]\}\;\+\:\*\,\.\?\/]+)/<A HREF=\"$1:\/\/$2\" TARGET=\"_blank\">$1:\/\/$2<\/A>/g;
}
ーーーーソースーーーー
元のスクリプトはこの様に書いてるのですが、>>280さんの言う通り(当然、変数とかはちゃんと設定して)
やったのですが、エラーが出てしまいました・・・
どうしたら良いでしょうか?
0282名無しさん@お腹いっぱい。01/11/14 02:07ID:???
>>281
出来ないから正解教えてくれっていうのは
改造スレ行った方が良くないかい?

せめて自分で何かしらのヒントをつかむ努力をして
勉強する気があるんだなって思われるようにしないと
教える方々も教え甲斐が無いと思うけど。
028327901/11/14 02:15ID:???
>>282
はい、すみません、未熟者でした。
redirectionのCGI作成から始めて、
今のトコで詰まって数時間調べても余り判らず、聞いてしまいました。
もっと、勉強し直してきます。失礼致しました。
028428201/11/14 02:19ID:???
なんだろう、この後味の悪さ…。
0285名無しさん@お腹いっぱい。01/11/14 02:20ID:???
TARGET=\"_blank\">$1:\/\/$2<\/A>/g;
の行を。。
TARGET=\"_blank\">$cgiurl$1:\/\/$2<\/A>/g;
でどう? $cgiurl = 'http://hogehoge/foo.cgi?';
とかにしとく
エラーが出ますはちょっと勘弁 (w
0286名無しさん@お腹いっぱい。01/11/14 02:25ID:???
理解しないまま使うな。絶対後で問題起きる。
正規表現勉強して,自分で書いたほうがいい。
028728501/11/14 02:26ID:???
もう居ないかな、CGIでそんなのするなって、どうやってチャージすんのさ
捨てファイル一枚開けといて、疑問に思ったり解らん事が有ったら
そこにちょこっと書いて、コマンドラインから実行してみ
PODでコメントにしながら貯めていけば後から見たり出来るから
多分1000行くらい溜まる頃には普通に使える様になるよ
0288名無しさん@お腹いっぱい。 01/11/14 02:34ID:???
使ってれば理解出来るってのも有るぞ、C++とか馬鹿デカ過ぎて厨な俺は半分位なんで
動いてるのか分かって無いよ :−(
ROMってる人に役立つかも知れんからマッタリいこーや
エラーが出ます、は困ったもんだが・・・
0289超初心者01/11/14 02:36ID:???
>>281
281だと1が返るのかな。
sub autolink{
 my $url = shift;
 $url処理・・・
 return $url;
}
>エラーが出てしまいました・・・
エラーの内容書いた方が良いよ。
0290名無しさん@お腹いっぱい。01/11/14 02:40ID:???
BBSのREFFER辿られたくないからPERLProxy置いて、そいつにリクエスト
投げたいからBBSを弄ってるんだろ?
なんだかなあ。。。。
0291名無しさん@お腹いっぱい。01/11/14 02:45ID:???
@_を変えるとオリジナルも変わる。
0292名無しさん@お腹いっぱい。01/11/14 02:46ID:???
>>290
なるほど。そういうことか。

ていうか、HTTP_REFERERって
標準化するときの単なるスペルミスなんだってね。w
0293名無しさん@お腹いっぱい。01/11/14 02:48ID:???
>>263>>264
ああ、連装配列で委員っすね ^^;
なるほど、中々慣れないもんで・・・ ありがとっす ^^
029425701/11/14 02:51ID:???
>>259
ありがとうございます。
うまくいきました。

お恥ずかしい限りで・・・。
029527901/11/14 03:05ID:???
>>285さんの言われたのを
<A HREF=\"$1:\/\/$2\" を
<A HREF=\"$cgiurl $1:\/\/$2\"
に変えたら無事に出来ました、沢山の方に御迷惑お掛けしました。
本当に有り難う御座いました。
>>290さん
おっしゃる通り、REFFER辿られたくないので弄っていました。
PERLProxyって言うのが良く判りませんでしたが、
最近、私のサイトの掲示板で質の悪い書き込みを沢山する人が居たので
REFFERから来たんじゃない?と言われてやってみたのです。
本当に、有り難う御座いました。
0296名無しさん@お腹いっぱい。 01/11/14 03:14ID:???
>>291 あぅ…そうですね。トホホ
0297285 01/11/14 03:17ID:???
すまんすまんちょっと間違えた、
まあ正規表現はけっこう便利だからこれに懲りずにてきとーに本でも読んでみて
0298名無しさん@お腹いっぱい。01/11/14 13:33ID:nPGI7kkt
Perl5.6で日本語使いたい
s/表/票/みたいな置き換えしたい
鈴木さんのjperlって5.005用ですよね?

ためしにインストールしたらPerlCRT.dllがないって怒られちゃいました

perl5.6用のjperl欲しいっす
使いたいときって限られてるのでperl5.6と5.005用のjperlの共存でも
いいです
どうしたらいいっすか
0299名無しさん@お腹いっぱい。01/11/14 14:24ID:???
unicode使え。
0300RA・イール01/11/14 14:44ID:h/x7Yxzr
概出でしたら申し訳ありませんが質問です。
初心者なので質問の至らない点はご容赦してください。
Web画面上で文字列を取得し、その文字列を用いてサーバー(UNIX)上で
grepをかけてその結果を表示するCGIを作成しているのですが、
半角英数及び"-_."の記号は認識するのですが、2バイト文字や
上記3つの記号以外を入力しても認識してくれません。
入力した文字がgrepの前にどうなっているのかを調べたところ
半角「#」であれば「%23」等のようにどうやら文字コードになっているようです。
"-_."や半角英数はちゃんと表示されるのですが・・・・・・
どうすればよいのかアドバイスしていただけないでしょうか?
よろしくお願いします。
長文になって申し訳ありません。
0301名無しさん@お腹いっぱい。01/11/14 15:21ID:???
>300
>>2-8 全部見ろとまでは言わんが,とほほくらいは目を通しとくといい。
http://tohoho.wakusei.ne.jp/www.htm

そのままそういう文字を送信すると,不都合が起きるのでエンコードされる。
URI::Escape.pmとかを使おう。
http://www.bekknet.ad.jp/~bero/docj/module/15/URI_Escape.html

どうしても自力でやるならここ見れ。
http://tohoho.wakusei.ne.jp/wwwcgi3.htm#CgiEncode
http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape
0302名無しさん@お腹いっぱい。01/11/14 15:26ID:???
それはブラウザがエンコードしてるからです。
文字コードに戻すには、perlなら、
s/%(.{2})/pack("C", hex($1))/eg;
Cなら
c = (x[0] >= 'A' ? ((x[0] & 0xdf) - 'A') + 10 : (x[0] - '0'));
c *= 16;
c += (x[1] >= 'A' ? ((x[1] & 0xdf) - 'A') + 10 : (x[1] - '0'));
みたいな感じです、半角スペースは + になってるのでそれも変換して下さい。
0303名無しさん@お腹いっぱい。01/11/14 15:27ID:???
Perlスレだった、、 鬱だ
0304RA・イール01/11/14 17:10ID:h/x7Yxzr
>>301さん
>>302さん
ありがとうございます。
無事解決いたしました。
030529801/11/14 20:08ID:???
>>299
スクリプトをunicodeにするだけじゃダメですよね?(ダメでした)
処理したい対象のテキストがシフトJISなんです…

あ。読み込んでunicodeに変換して、それから必要な処理を
すればいいのか…な?
0306名無しさん@お腹いっぱい。01/11/15 20:57ID:???
>>262-264 構造体の型?を宣言しておくことはできないんですか?
いちいち新しく宣言しなければならないのでしょうか?
0307名無しさん@お腹いっぱい。01/11/15 21:41ID:2NOZWJEm
>306 Class::Structとかは?
0308名無しさん@お腹いっぱい。01/11/15 23:31ID:u8RJIxtX
はーい、先生しつもーん!
perlってプログラム言語だから、てっきりプログラム板だと思ったのに、なんでWebProgなんですか?
WebProg専用って訳じゃないですよね?
しかも、あっちでは冷遇されてるみたいだし‥‥
なんでプログラム板ではperlちゃんは虐められるんですか?
0309名無しさん@お腹いっぱい。 01/11/15 23:32ID:???
>306 どこの星の人か知らないけどPerl使ったこと有る??
0310名無しさん@お腹いっぱい。01/11/15 23:56ID:???
何で虐められてるの
あなたの発言内容が冷遇されてるのでは? (笑
0311名無しさん@お腹いっぱい。01/11/16 00:30ID:ecg87As1
>>310

おいらじゃないけど、あっちでperlの質問スレ立てた人が、「板違いだ」と言われてました。
0312名無しさん@お腹いっぱい。01/11/16 00:41ID:???
言語っていうよりCGI作成スクリプトってかんじだからかなぁ。
設置するだけの厨も多いし。
0313名無しさん@お腹いっぱい。01/11/16 01:07ID:???
shige虫がウザイからです  w
0314名無しさん@お腹いっぱい。01/11/16 05:11ID:???
>>308 むかしはCGI/Perl板だったから、こっちでやれってことじゃない?今でも。
>>312 それはただ単に世間が狭いからでは? Autoconfの一部, tmake(Qt), fmlとか幾らでもあるでしょ。
0315名無しさん@お腹いっぱい。01/11/16 05:27ID:???
Perlしか出来ないCGI厨も多いのも事実だな(w
0316名無しさん@お腹いっぱい。01/11/16 07:11ID:???
Perlしか出来ないCGI厨は氏ね。
0317名無しさん@お腹いっぱい。01/11/16 10:40ID:???
Perlすら満足に出来ないCGI厨も居るがな。
0318名無しさん@お腹いっぱい。01/11/16 13:40ID:???
>>315はまだいい。ってか折れだし。
>>317はマジ迷惑。
0319名無しさん@お腹いっぱい。01/11/16 14:08ID:???
どこまで出来れば「満足に出来る」ことになるんだろう・・・(ぼそっ)
perl理解して無いより、CGI理解してない方が迷惑だけど、それはまぁいいや。
0320名無しさん@お腹いっぱい。01/11/16 22:12ID:eZwp685j
$ENV{'HTTP_HOST'}$ENV{'SERVER_NAME'}$ENV{'SERVER_ADDR'}
って全部同じ?
0321名無しさん@お腹いっぱい。01/11/16 22:17ID:???
>320
LANを組んだローカルサーバーで試してみそ。
0322名無しさん@お腹いっぱい。01/11/16 23:49ID:WbULnsbP
>>321

どんな環境で試すと。。。3つ同じになるのかよく考えてみよう
032332101/11/17 00:24ID:???
>322
俺はこれで違うものが出るからこう言ってるんだけど?
>320はそれが全部同じ物と思ってるんでしょ?
反例出せばいいのかと思ったんだけど違ったならスマソ。
0324名無しさん@お腹いっぱい。01/11/17 10:00ID:caH7oXws
2つの変数($HOGEと$SAGE)の値を交換する方法を教えてください

今現在、
$TEMP = $HOGE ;
$HOGE = $SAGE ;
$SAGE = $TEMP ;
にしてるわけですが非効率ですよねぇ
0325名無しさん@お腹いっぱい。01/11/17 10:06ID:???
($hoge, $sage) = ($sage, $hoge)
032652101/11/17 10:10ID:FtGVdyVD
そのやり方で良いよ、仮に「2つの変数を入れ替える関数」が有ったとしても(無いけど)
どちらかをtempの領域にコピーして入れ替えた後復帰してる事に変わりない
メモリを使わずに空中で交換なんて出来ないんだから。
もしHOGEとSAGEが大きな変数ならリファレンスを使おう
0327名無しさん@お腹いっぱい。 01/11/17 10:11ID:???
ぐはっ、HNが
0328名無しさん@お腹いっぱい。01/11/17 15:58ID:???
> メモリを使わずに空中で交換なんて出来ないんだから。
xorしてxorしてxorすればテンポラリ領域なしで交換できるよ。
でも、素直にテンポラリ使った方が速い、安全、わかりやすい。
0329名無しさん@お腹いっぱい。01/11/17 16:29ID:???
本当だ。数値なら、
$b+=($a=($b+=$a)-$a);
で入れ替わる。
0330名無しさん@お腹いっぱい。01/11/17 18:51ID:???
$b -= ($a = ($b += $a) - $a);
じゃないか?
033132901/11/17 19:21ID:???
>>330 本当だ。どこでコピペをミスったのだろう。。。(鬱
0332 01/11/17 21:16ID:hnjwBqTf
Windows2000、ActivePerlです。
ActiveState Perl Dev Kitをインストールして使っていて、

C:\>perl -d hoge.perl
で自動的にGUIベースのデバッガが自動で起動しますが、CUIでデバッグ
したいときだけCUIデバッグを開始する方法ありますか?
0333名無しさん@お腹いっぱい。01/11/17 23:34ID:JGfA8W5O
スゲー
$b ^= $a ^= $b ^= $a;
で入れ替わるんだ。 これだと文字列でもできるんですね。
0334名無しさん@お腹いっぱい。01/11/17 23:58ID:???
>>333
長いほうにあわせてzerofill(?)されるので問題ありとか。
033533301/11/18 00:05ID:???
本当だ。整数同士、文字列同士なら問題なさそうだけど、
少数が混ざったり、整数と文字列を交換しようとしたらダメなんですね。
確かにリスクが多そうだ。
0336名無しさん@お腹いっぱい。01/11/18 00:34ID:???
アクセス解析で訪問者のドメインを取得しようとしたんですが、
下の書き方だとCGIを置いてるサーバーのドメインが取得されて
しまいます。どこが間違ってるのでしょうか?

$a1 = $ENV{'HTTP_HOST'};

open (ANSWER, ">>data.txt");
flock (ANSWER, 2);
print ANSWER "$a1\n";
flock (ANSWER, 8);
close (ANSWER);
0337名無しさん@お腹いっぱい。01/11/18 00:57ID:???
ファイルを1ビットずつコピーするっていうやつを何処かで見かけて、
使ってみようと探してみたら見つかりません。(Perlメモだったと思ったけど、見つからない・・・)
ご存知の方教えてください。 よろしくお願いします。

>>336 $ENV{REMOTE_ADDR}でいけるはず
0338名無しさん@お腹いっぱい。01/11/18 01:00ID:???
HTTPリクエストヘッダについて学んで下さい。
0339名無しさん@お腹いっぱい。01/11/18 01:05ID:???
>>336
普通は $ENV{REMOTE_HOST}だとおもう。
034033601/11/18 01:29ID:jf4mdJsf
>>337
$ENV{REMOTE_ADDR}だとIPが取得されてしまいます。
>>339
$ENV{REMOTE_HOST}だと何も取得出来ないのですが・・
0341名無しさん@お腹いっぱい。01/11/18 01:37ID:GYkHI9xF
>>339
サーバの設定によってはいちいち逆びきしないのも
あるんじゃなかったけ?
034234001/11/18 01:40ID:GYkHI9xF
おお、かぶった。
>>341
gethostbyaddr を使うことになると思う。
CPAN突っ込めるならもう少し楽になる。
0343340!=341=34201/11/18 01:48ID:GYkHI9xF
342>340だった。
CPAN使わんでも標準モジュール(perl-5.6.1では)で
Net::hostent というのがあった。
0344 01/11/18 07:40ID:ec8bnEpU
locationやredirectを使わず、CGIから直接ファイルをダウンロードさせる事って出来ますか?

print "Content-type: application/download\n";
print "Content-disposition: filename=\"test.lzh\"\n\n"; だと駄目みたいです
0345 01/11/18 07:43ID:???
あれ?これは全然違ったかな
やっぱりブラウザからGET送られないと無理ですかね・・・
0346名無しさん@お腹いっぱい。01/11/18 10:02ID:???
>>344
FAQかな?ここに書いてあったよ。
http://web11.freecom.ne.jp/~chaichan/qanda/qa414.htm
034733601/11/18 14:08ID:HApvi2Od
>>336
誰か教えて〜
0348名無しさん@お腹いっぱい。01/11/18 14:25ID:???
>>347
>>342に答えあるだろうが…。
034934801/11/18 14:26ID:???
それで分からなきゃ検索しなさい。
検索して分からないようなら
自治体主催のIT講習会でも行って来なさい。
0350名無しさん@お腹いっぱい。01/11/18 14:43ID:???
>>349
ここは初心者用スレだというのがわからんのか?
0351名無しさん@お腹いっぱい。01/11/18 14:53ID:???
>>350
だから何か?
0352名無しさん@お腹いっぱい。01/11/18 14:58ID:???
・初心者向け結論・
サーバーの設定によってはリモートホストは取得できない。
IPで我慢すれ。
035334401/11/18 18:07ID:???
>>346さんので成功したんですが、
Perlを通して吐き出す際、壊れてしまうみたいです。(Windows+ActivePerlで.zipを出力)

foreach $_ (@temp) {
  $_ =~ s/\n//g;
  print $_;
}
とりあえずこれで\nは消してみたんですが、後ろの方がさっぱり消えてしまいます。
(.rarに関してはRar!としか出ません・・・)
何をどう置き換えればいいんでしょうか?
0354名無しさん@お腹いっぱい。01/11/18 18:36ID:???
binmode()
035535301/11/18 21:14ID:???
>354 出来ました! もっと調べるべきでした。すいません
0356RA・イール01/11/19 15:45ID:jO7Jmwt3
300で質問している者です。度々申し訳ありません。
grepの部分で
1. $command .= '"/usr/bin/grep ' . "\'$string\' " . "$filepath " . "| head -n $linenum \"|";
1のようにした場合、2バイト文字や記号等も拾ってくれるのですが
2. $command .= '"/usr/bin/grep -h "' . "^$day_string" . '" ' . "$filepath " . "| grep " . "\'$string\' | head -n $linenum \"|";
上記の場合、2バイト文字や記号等を認識してくれないのですがどうしてでしょうか?
どうすればよいのかアドバイスしていただけないでしょうか?
よろしくお願いします。
0357名無しさん@お腹いっぱい。 01/11/19 16:05ID:???
良く解らんけど、2回目のgrepの手前でnkf通すとどうなる?
2バイトはさっぱりだけど&%$とかは2回通ったけどなぁ・・・
Unix板のハッカーに聞けばどしどし答えてくれそう (^^;
0358名無しさん@お腹いっぱい。01/11/19 16:06ID:???
あ、違った。パイプから返ってくる時におかしくなってるのか?
だったら解んないっす
0359名無しさん@お腹いっぱい。01/11/19 19:04ID:pdb1llN8
>>を見つけたら置換したいんですが上手くいきません

$test =~ s/>>/aa/g;

>>の指定はどのようにしたらいいのでしょうか
0360名無しさん@お腹いっぱい。01/11/19 19:21ID:???
んなこたあ無い
0361名無しさん@お腹いっぱい。01/11/19 20:48ID:f2JzrPLI
掲示板の改造してたんですが
>じゃなくて>に中で変換されていました・・・
0362名無しさん@お腹いっぱい。01/11/19 20:49ID:f2JzrPLI
↑&gtに変換されていました
(半角で書くと変換されちゃうんですね)
0363名無しさん@お腹いっぱい。01/11/19 21:32ID:j7n2AWkf
デザイン的に良くないので、petitboardの著作権表示を修正したら動かなくなったんですけど、何故でしょうか?
冬厨ですみません。
0364名無しさん@お腹いっぱい。01/11/19 21:48ID:???
>363
http://pc.2ch.net/test/read.cgi/php/988808396/
どうぞこちらへ。
0365名無しさん@お腹いっぱい。01/11/19 21:53ID:j7n2AWkf
>>364

flock(OUT, 8);
close (OUT);

を、

exit;

に変えればよろしいのですか?
0366名無しさん@お腹いっぱい。01/11/19 22:19ID:???
そのとおりです!!
凄いですね (^v^
0367名無しさん@お腹いっぱい。01/11/19 22:29ID:WFMClysi
data.txtに
1・・
2・・
3・・
・
・
と並んでいるのを読み込み、上から「10件まで」と件数を決めて
別のファイルに書き込みたいのです。
openやprintの使い方はわかるのですが、件数の決め方がわから
ないので教えて下さい。
■ このスレッドは過去ログ倉庫に格納されています