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

【Perl】初心者コーナー Part15

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/08/08 23:19ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
032031102/08/22 01:32ID:???
>>319
>>315が出てこなければ問題は解決する。
0321nobodyさん02/08/22 01:41ID:lGXorje/
>>320
糞頭じゃ足りない事が、人間には沢山有るんでね
0322nobodyさん02/08/22 09:04ID:???
>>299
処理する順番を変える。
log が eof に達したら「次のページへ」を非表示にする。
0323nobodyさん02/08/22 12:42ID:C0K12Syt
初心者の質問です。
KENT WEBの宅鯖計画を見ながらソフトのインストールを試みたんだけど
Active Perlのインストール中に警告ダイアログが出て
どうしてもうまくいきません。
うまくやる方法をうまく教えてください。
0324nobodyさん02/08/22 12:43ID:???
どんな警告が出たのかを書かないと誰も答えられない。
032532302/08/22 14:34ID:C0K12Syt
>>324 そうですね、すいませんでした。

警告文は
"There is a problem with this Windows Installer package.
A script required for this install to complete could not be run.
Contact your support personal package vender."
です。
0326nobodyさん02/08/22 14:41ID:???
MSIのバージョンをあげてみろ、といってみる。
032732302/08/22 16:01ID:C0K12Syt
MSIのバージョンのあげ方もわからない・・・

出直してきます。
お手数をお掛けして申し訳ありませんでした(逝)
0328nobodyさん02/08/22 16:28ID:???
英語を読めない人間はプログラムをする資格がありません。

Windows Installer 2.0 for Windows 2000 and Windows NT 4.0
http://www.microsoft.com/downloads/release.asp?ReleaseID=32832
http://download.microsoft.com/download/WindowsInstaller/Install/2.0/NT45/EN-US/InstMsiW.exe

Windows Installer 2.0 for Windows ME, Windows 98 Second Edition, Windows 98, and Windows 95
http://www.microsoft.com/downloads/release.asp?ReleaseID=32831
http://download.microsoft.com/download/WindowsInstaller/Install/2.0/W9XMe/EN-US/InstMsiA.exe
0329nobodyさん02/08/22 21:37ID:???
>>328
やさしいな。
0330初必者02/08/22 21:52ID:???
いきなりスイマセン
↓これおかしいですか?動かんようになったんです。

##############################################

#リピート部分プログラム
sub output {

#mail入力の有無
if ($email eq '') {
print "$name : ";
}
else {
print "<A href="mailto:$email">$name</A> : ";
}

#メッセージの表示
print "$msg";
}

###############################################

コレだけやったら「ワケワカラン」ですかねぇ・・・
0331nobodyさん02/08/22 21:56ID:???
#mail入力の有無
if ($email eq ''") { <=(。∀゜)「"じゃなくて""じゃないの?」
print "$name : ";
}
else {
0332nobodyさん02/08/22 21:57ID:???
print "<A href="mailto:$email">$name</A> : ";

print "<A href=\"mailto:$email\">$name<\/A> : ";
0333初必者02/08/22 22:00ID:???
えっと、、、
「"」じゃなくて、「'」2つなんで、okかと・・・
一応ダブルに変えたんですけど、ダメでした。

>>332
やってみます。
0334初必者02/08/22 22:03ID:???
いけました!
超初歩的でしたね(スイマセン・・・)
1時間悩んだのが、5分ほどでいけました。
何やってたんだろ・・・
どもでした!
0335nobodyさん02/08/22 23:05ID:???
>>334
""のなかに"が入る場合は\でエスケープするよりも、

print "<A href=\"mailto:$email\">$name<\/A> : ";
↓
print qq(<A href="mailto:$email">$name<\/A> : );

で書くほうがすっきりするよ。
0336初必者02/08/23 00:25ID:???
>>335
おっ!そんな方法もあるんですね。
参考になります。

なんせ、実質昨日から始めたみたいなモンなんで・・・
もう、お世話にならなくて済むようにガンバリマス。
ありが�dでした。
0337nobodyさん02/08/23 05:01ID:???
ちょっと疑問

ファイルの各行を配列の要素として読み込ませるコードって

open(FP,"+<$file");
@xx = <FP>;
foreach $yy (@xx) {
print $yy;
}
close(IN);

って書くらしいんだけど、
foreach $yy (@xx) {
print $yy;
}
これって意味あんの?
033833702/08/23 05:09ID:???
closeのほうのファイルハンドルまちがいた・・・鬱死・・・
0339nobodyさん02/08/23 06:17ID:???
意味ないっていうか、読み込んだ奴を表示してる。
読み込むなら
open(FP,"< $file"); #または open(FP,$file);
@xx = <FP>;
close(FP);
でいいと思う。
漏れも初心者だからあってるかわからん。
0340nobodyさん02/08/23 07:26ID:???
>>337

それくらいわかるだろヴぉけ
つかサンプルまるうつししてるようなうんこはしね
0341nobodyさん02/08/23 09:26ID:???
>>340
マァマァ、ここは初心者スレですから・・・
0342初必者02/08/23 14:45ID:???
昨日の今日で恐縮です・・・
かなりシンプルな掲示板を色々いじって勉強してるんですが、

テンポラリーファイルが、勝手に消えるんです。
全く分かんなかったんで、何度も何度も自分で作るんですけど、
プログラム実行するたび消えたんです。

で、検索したら、
「プログラムが動いているとき、一時的に作られる作業用ファイル」
って書いてあったんですけど、、、

つまり、実行後消えるって言うのは正常なんでしょうか?
0343nobodyさん02/08/23 14:56ID:???
>>342に必要と思われるもの

英語の辞書 temporary
0344初必者02/08/23 15:06ID:???
>>343
「一時的な」でしょ?
それは分かってます・・・
正常なのかが聞きたかっただけなんですけど、
煽られそうなんで、もぉやめときます。。。
0345nobodyさん02/08/23 15:23ID:???
>>344
分かっているのに聞くと言うことは 極めて日本語が不自由な在日ですか?
0346nobodyさん02/08/23 15:40ID:???
>>343
一時的というのは永続的に続く事なのですか?あなたが言っているのはそういうことになりますが。
0347nobodyさん02/08/23 15:48ID:???
>>335
qq(\/);
としているのは意味あるの?
0348nobodyさん02/08/23 16:13ID:???
>>347
ミスだろイイじゃん動くダロ
0349nobodyさん02/08/23 20:05ID:BD+5XVCe
sendmailを利用したプログラムを書いていて
つまづいてしまったのですが、アドバイスいただけますでしょうか。

CGI設置サーバ:aaa.com
メーラーのSMTPサーバ:mail.ccc.or.jp
Mail-1:[email protected]
Mail-2:[email protected]
Mail-3:[email protected]
Mail-4:[email protected]

以上の環境で、Mail-1・Mail-2・Mail-3にはCGIからもメーラーからも
数秒〜数分でメールが届くのですが、
Mail-4にはメーラーからは数秒で届くものの、
CGIからは2時間ちょっと経過した今現在、まだメールが届きません。

sendmailでは、こんなにタイムラグってあるものなんでしょうか?
それともCGIプログラム自体に問題がある可能性がありますか?
原因のマトが絞れず悩んでいるのですが、よろしくお願いいたします。
0350nobodyさん02/08/23 23:27ID:???
厨質でもうしわけないんですが、
ファイルの指定の行の内容をさしかえることってできますか?

open(CNT,"+<$cnt");
flock(CNT,2);
@cnt = <CNT>;
@cnt[$n] ++;  #n行目の数値をインクリメント
truncate(CNT,0);
seek(CNT,0,0);
foreach $a (@cnt)
{ print CNT "$a\n";}
close(CNT)

今は↑のような感じでやってるんですが、
これだと毎回ファイルをまるごと書き換えてるんで、効率悪いですよね・・・
0351nobodyさん02/08/23 23:57ID:???
>>350
これじゃいかんかの?

open(SAQ,"unittest.pl");
@fasx=<SAQ>;
$fasx[2]="-_-";#替えたい行
print @fasx;
035235002/08/24 01:55ID:???
>>351
書きこむ時には結局

open(SAQ,">unittest.pl");
foreach(@cnt)
{ print SAQ "$_\n";}

ってやらないとだめなんですか?
0353nobodyさん02/08/24 04:07ID:???
>>349です。
CGI設置サーバをddd.co.jpに変更したら送信先4件ともメール届きました。
前のaaa.comに設置した方からは、今だに[email protected]宛には
10時間経過した今現在も届きませんが、
とりあえずメールの受け取りができたので解決といった感じです。
ほんとはSSLが使えるaaa.comに設置したかったんですが、
は〜〜どうしよう・・・。
こんなことあるんでしょうか・・・sendmail。
もしかしてスレ違いだったかな。スミマセン。
0354nobodyさん02/08/24 04:41ID:???
あぶらあげ
0355nobodyさん02/08/24 05:33ID:???
スレ違いかもですが、クッキーについて少し質問させてください。

インラインフレームを使用したページで、-�@
クッキーに対応したページをフレーム内に表示させると、-�A
効かなくなったんですが、
当然のことなんでしょうか?

で、これが当然のことなら、
JavaScriptで、�@のページにクッキーのスクリプトを埋め込もうと思うのですが、
それで、果たして、�Aのページまで対応できるのか、不安になりまして・・・

どなたか分かる方お願いします。

全然、見当違いなこと言ってるのかも知れませんが、
そのときはお許しを・・・
0356nobodyさん02/08/24 05:49ID:???
>>355
スレ違い以前に板違い。

JavaScript、VBScript等クライアントサイドの話題はWeb製作板へ
http://pc3.2ch.net/hp/
0357nobodyさん02/08/24 06:00ID:???
そうですよね。
いや、�Aのページが、
必死でクッキー処理を追加した掲示板だったもんで・・・
「製作板」逝ってきます。
0358kusokote ◆4XfSMGTg 02/08/24 13:22ID:???
ばーぁ
0359nobodyさん02/08/24 15:47ID:???
2つ前までのリンク元って取得できないものでせうか?
0360nobodyさん02/08/24 16:58ID:???
>>359
マルチは鬱陶しいね。
0361nobodyさん02/08/24 17:37ID:???
「CGIに依存しない・・・」が読めなくなったな...。
悲惨な終わり方だな。
0362nobodyさん02/08/24 19:42ID:???
if ($str =~ /xxx/) {
print "含んでいる\n";
}

の/xxx/の部分て文字列じゃなく、変数にしてもできるんですか?

if ($str =~ /$str2/) {
print "含んでいる\n";
}

みたいに
0363 ◆..DRYi.. 02/08/24 19:45ID:???
>>362
結論からいうとできるけど、試せよ
0364nobodyさん02/08/24 19:53ID:???
というか、 if($xx =~ /xxx/) で含むなら、と覚えてたら正規表現なんてわからないよな
0365nobodyさん02/08/24 20:10ID:???
>>344
コードの先に、unlink("***") でファイルを消しているんじゃ無いのか??
0366nobodyさん02/08/24 20:27ID:???
糞コテ死ね
0367nobodyさん02/08/24 22:19ID:???
@listに123,456,789が代入されているとき
@listから456を取り除いて、

print "@list";
で123,789にするにはどうすれば良いのでしょうか。
0368nobodyさん02/08/24 22:27ID:???
>>367
@po=(123,345,234);
@po=($po[0],$po[2]);
print @po;
0369 ◆JAPH9PWA 02/08/24 22:38ID:???
>>367
配列のindex Nの要素を取り除きたいのか、
値Xを持つ要素を取り除きたいのかで全然違うよ

# 前者
my $N = 1;
splice @list, $N, 1;

# 後者
$X = 456;
@list = grep { $X != $_ } @list;
037036702/08/24 22:52ID:???
すみません。初心者なんで良く分からないんですが、
変数に入っている文字列から指定した文字列を消去したいんです。
正直、@でも$でも構いません。
0371nobodyさん02/08/24 23:02ID:zQgcBRyf
文字をバイナリでファイルに書き出したいのですが
方法を教えて頂けないでしょうか?
例えば

$val="65";

の場合 $val をファイル、もしくは標準出力に書き出すと
文字の 65(バイナリでは 0x36 と 0x35) がファイルに書かれますが
バイナリで 65(0x41) を書き出したいのです。
pack,unpack も試しましたが文字のままでした。(;´Д`)

先ほど始めて使ったので調べていない点が
あるかもしれませんが宜しくお願いいたします。
0372ん?02/08/24 23:02ID:???
$hoge = '123456789';
$hoge =~ s/456//;

本買えよー
037336702/08/24 23:04ID:???
>>372
激しくありがとうございました...
0374こんなのしか思いつかん02/08/24 23:05ID:???
$hoge = '65';
$hoge =~ s/(.)/sprintf("\\x%02X",ord $1)/eg;

unpackは使いづらいから嫌い
0375nobodyさん02/08/24 23:28ID:zQgcBRyf
>>374
即レスありがとうございます。早速試してみましたところ

\x36\x35

と表示されました。
実はこの出力が欲しかったのではなく
バイナリエディタで見た場合に 0x41 と表示される
出力が欲しかったのです。

入力ファイル内容 が ABC の場合に
出力ファイル内容が 16 進バイナリで 41 42 43 であって欲しいのです。
エディタで開くと謎の文字が表示されるアレです。

私の説明が悪く申し訳ありません。

何に使うかと言いますと
ジャンクハードの FlashROM 内容をダンプした物を
文字列整形後バイナリデータに変換し逆アセンブルしたいのです。

他に方法がありましたら宜しくお願い致します。
0376nobodyさん02/08/24 23:57ID:Us3nZQzg
文字列の中から指定した文字の個数を調べるにはどうすればいいのでしょうか?
0377nobodyさん02/08/25 00:12ID:EOslaqTi
>>376
$count++ while($hoge =~ /$page/g);
0378nobodyさん02/08/25 00:15ID:???
>>375
chr
0379nobodyさん02/08/25 00:20ID:???
>>371
print chr(65);
0380nobodyさん02/08/25 00:24ID:???
>>378

(・∀・)ソレダ!!
どうも一般的な関数みたいですね。
大変助かりました。
ありがとうございます。
0381nobodyさん02/08/25 00:26ID:???
>>379
書込みタイミングがずれてしまいました。
どうもありがとうございます。
これから実装してみます。
0382 ◆JAPH9PWA 02/08/25 09:13ID:???
いや、普通はpack/unpackを使うと思うんだけど
print pack "C*", 65, 66, 67;
0383nobodyさん02/08/25 10:13ID:???
おぼえとけよ。お前らのIPは全部保存してあるからな。
いまさら泣いて許しを請うても遅いからな(w
0384nobodyさん02/08/25 10:16ID:???
CGIに依存しない〜は残念だったな(ppp
糞固定どもと成れあっとけや糞虫。
0385nobodyさん02/08/25 11:28ID:???
何か言えよ!
038629902/08/25 16:49ID:???
>>322
返信遅くなってすみません
今から試行錯誤してみます。
アリガトゴザマスタ
0387nobodyさん02/08/26 11:06ID:kuaIpm20
アクセス制限のやり方教えてください。
0388nobodyさん02/08/26 11:27ID:???
>>387
if($ENV{REMOTE_USER}){if($ENV{REMOTE_USER} eq $dqn_user){print "Location: $url"}}
elsif($ENV{REMOTE_HOST} eq $dqn_host){print "Location: $url"}
でいいの?
0389nobodyさん02/08/26 11:32ID:???
proxyかけてるやつの制限ってどうやるの?
教えてー
0390他にも方法はあるだろうけど…02/08/26 12:26ID:???
>>389
] あなたは Proxy を利用していますか?
]
]   はい、利用しています (→Yahoo! へのリンク)
]   いいえ、利用していません (→トップページへのリンク)

こんな感じのページを置いておく。
0391nobodyさん02/08/26 12:40ID:???
>>388
ダメだ
0392nobodyさん02/08/26 13:09ID:???
>>388
?
0393nobodyさん02/08/26 13:36ID:???
>>391
じゃぁ .htaccess でも池
http://pc.2ch.net/test/read.cgi/php/1019888234/l50
0394nobodyさん02/08/26 13:58ID:???
>>387
同時アクセス数とか、転送バイトとかか?>>389か?
039539102/08/26 14:21ID:???
>>393
オレじゃねーよ、ボケ!
0396nobodyさん02/08/26 15:38ID:IyYWB8TD
kent-webのアップロード式掲示板のやつで
着メロをうpできるようにするにはどうすればいいんですか?
0397nobodyさん02/08/26 17:40ID:AuEFFmIZ
perlの勉強始めたばかりの超初心者です。

色々な人のソースを参考に本を片手にCGIスクリプトを書いているのだけど、
http://www.kent-web.com/utility/index.htmlのPerl Checkerで
自分の書いたスクリプトをチェックすると、

Missing right bracket at regist.cgi line 270, at end of line
syntax error at regist.cgi line 270, at EOF
regist.cgi had compilation errors.

って、エラーがでます。

実際の270行目って、スクリプトの終わりで何も書いてないし、
直前の269行目にはexit;

どこが悪いのかわからないんですけど、わかる人いますか?

おねがいいします。
0398nobodyさん02/08/26 17:50ID:???
>Missing right bracket
右ブラケットが欠けている。
0399nobodyさん02/08/26 18:01ID:???
たいがい、エラー行の前に原因がある。
040029902/08/26 20:06ID:???
>>299ですが
open(LOG,$log);
while(<LOG>){print $table;}
close(LOG);
は
open(LOG,$log);
($date,$no,$sub,$text) = split(/\,/,$_);
$table = join('',@table);
$table =~ s/<text>/$text/g; #$sub等も置き換え
print $table;
close(LOG);
でした

もうだめぽ・・・
0401nobodyさん02/08/26 21:08ID:???
負荷状況を調べたくて
use Benchmark;
を試したいのですが、

Benchmark.pmを同じフォルダーに置いて、コマンドから実行させてみたりしましたが
ダメでした。ご教授して頂けないでしょうか?
040229902/08/26 22:43ID:4fIS3YbU
@header;
@footer;
の中にNEXTがあるので、
print $table; をpush (@txt,$table);
にして

{ここで置き換え処理}
@header;
@txt;
@footer;
にしたのですが、@txtが大きくなると負荷が掛からないかと心配です

ログのサイズは大きくても200kくらいです
0403nobodyさん02/08/26 22:55ID:???
>>401
頼むから、一度くらい検索かけてくれ。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlfaq3.html

>299
質問内容が解りません。ここは日記ではありません。
自分で試せることは試して下さい。
0404nobodyさん02/08/26 23:09ID:???
ファイルのデータを配列にいれるのはどちらの方がいいでしょうか?
他にいい方法はありますか?
1、
@DATA = <DATA>;

2、
while(<DATA>){
push(@DATA, $_);
}
0405nobodyさん02/08/26 23:13ID:???
>>404
1 短くて簡潔な方がイイ。
2 だと @DATA が空である必要があるし、よけいな while を呼び出さなければならないから。
040675702/08/26 23:21ID:???
>>404
データを加工しない限り1以外の方法は使わなくていいんじゃないか。
0407nobodyさん02/08/26 23:22ID:???
757は余計だったな(藁
0408nobodyさん02/08/26 23:29ID:???
ファイルサイズが大きいと1はまずいんでないかい?
0409nobodyさん02/08/26 23:31ID:???
>>408
ファイルサイズがでかけりゃ、1も2もまずいだろうよ・・・
041040402/08/26 23:34ID:???
ありがとうございます。1のほうを使う事にします
0411nobodyさん02/08/27 00:56ID:???
ま、1か2のどちらかしか考えないのじゃなくって
本当にファイルの中身を配列に入れる必要があるのかと
0412nobodyさん02/08/27 02:38ID:???
windows上でjperl使ってて、
Runtime Exceptionって出てperl自体がこけるんだけど、
対処方法がわからない。なんとなく正規表現に負担をかける
処理を多用するとまずい感じ(64k制約の話を聞いたことがあるけど、
漏れの場合、扱ってる個々の文字列の長さはせいぜい2k程度)

だれか教えてちょ。
こける場所は不定。デバッガかませると動作完了したりする
ときもある。
0413nobodyさん02/08/27 06:55ID:???
>>299
そのソースどっかで見たことあるなー
引用してるなら、元サイトのスクリプト見てみたら?

299=404?
0414nobodyさん02/08/27 12:08ID:???
>>412
日本語のページからwindows runtime Exceptionを検索しました。
http://www.google.com/search?hl=ja&inlang=ja&ie=Shift_JIS&q=windows+runtime+Exception&btnG=Google+%8C%9F%8D%F5&lr=lang_ja

Perl じゃなくて Windows じゃないかしら。マ板かWin板へ。
0415nobodyさん02/08/27 13:09ID:???
ここの掲示板みたいに、プロクシ規制の方法を教えてください。
0416nobodyさん02/08/27 13:56ID:???
Perlの「コーディング」で困ってる人のスレです。
0417nobodyさん02/08/27 15:55ID:???
PNGカウンタを作ってるのですが

<img src="pngcount.cgi?4">
<img src="pngcount.cgi?3">
<img src="pngcount.cgi?2">
<img src="pngcount.cgi?1">

とやると4回も起動することになるので1回にまとめたいのですが

@listにそれぞれの画像のパスが格納されている場合

例:@list = ("./image/0.png","./image/1.png","./image/0.png");

上の場合だと010と表示させたいのですが

foreach $number(@list)

{
open(IMG,"$number") || exit; print "content-type: image/x-png\n\n";
binmode(IMG); binmode(STDOUT); print <IMG>; close(IMG); exit;
}

上のようにやっても1つしか画像が表示されません。
いくつも画像を表示できないのでしょうか?
0418nobodyさん02/08/27 15:59ID:???
猫
0419nobodyさん02/08/27 17:12ID:dvEqdJRZ
i-mode絵文字対応フォームメールを設置したいのですが、
文字化け対策がうまく行きません。
(文字化けする絵文字としない絵文字がある。)
処理をうまくしてる人はどうやってやってます?
■ このスレッドは過去ログ倉庫に格納されています