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

Perl 初心者コーナー Part21

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

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

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


CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0369nobodyさん03/03/31 22:42ID:rFaVLjrq
>>368
う〜ん見れません
0370nobodyさん03/03/31 22:43ID:???
>>368
失礼しましたrootだから見れませんでした。
見てみます。 ありがとうございました。
0371nobodyさん03/04/01 00:15ID:???
4月1日になりました。
これから24時間嘘が飛び交います。
0372nobodyさん03/04/01 00:21ID:???
perlは僕が作りました
0373nobodyさん03/04/01 00:29ID:???
>>372を作ったのは俺です。
0374nobodyさん03/04/01 00:31ID:???
>>373を作ったのは私です。
037537203/04/01 00:34ID:???
PHPも僕が作りました。
実を言うとTCP/IPプロトコルを作ったのも僕です。
もちろんFTPもですよ
0376nobodyさん03/04/01 00:47ID:???
ごめん。RFCね、アレ、全部嘘。
見なかった事にしといて。
0377nobodyさん03/04/01 01:40ID:???
つーか、ひろゆき嘘が一番すげーなw
トップページに閉鎖しますだってよw
0378nobodyさん03/04/01 01:50ID:???
今時閉鎖ネタは無いよねーと言われる中、
やるとはさすが・・・
0379nobodyさん03/04/01 02:19ID:???
Apr 1ネタも出ないほど人いないのかこの板は、
と思ってたら発見

age
0380nobodyさん03/04/01 03:06ID:???
あのぉ2chのidってどうやって作ってるんですかねぇ?
cryptとかpack関数とか関係あるのかなと思って調べてみたんですけど、
cryptはともかくpackって私には理解不能で・・・
2chのIDもどきの作り方、どなたか教えていただけないでしょうか?
0381nobodyさん03/04/01 03:09ID:???
age忘れ
0382nobodyさん03/04/01 03:51ID:???
>>380
http://pc2.2ch.net/test/read.cgi/php/1040777088/469
0383nobodyさん03/04/01 05:18ID:???
>>382
thxです
0384nobodyさん03/04/01 09:18ID:???
if ($chars[$config{'char'}]{"points_$arg1"} > $chars[$config{'char'}]{'points_free'})
って言うソースの一部で悩んでいるのですが
$chars[$config{'char'}]{"points_$arg1"}
って何だ?・・理解できない。
何というか配列の構造(変数)?が理解できません。
脳内処理では
@chars = (%config,%etc....
%config = ('char'=>points_$arg1
のように考えてしまったのですがコレは明らかに違う様な気がします。
そもそも連想配列のkeyに連想配列を使えるのか・・?とか言う疑問が
頭の中で反乱してグチャグチャになっとります。
多分こんな説明では教える方もわからないと思いますが
配列の構成みたいなものをビシっと言って頂けるととても助かります。
4/1日ですけどマジ質問です。
0385nobodyさん03/04/01 09:50ID:???
>>384
>@chars = (%config,%etc....
>%config = ('char'=>points_$arg1
とか
>連想配列のkeyに連想配列
とか、言ってることがさっぱりんこだが、
$chars[$config{'char'}]{"points_$arg1"}
これは、
$chars[$config{char}]->{"points_$arg1"}
としたほうがわかりいいんか?

use strict;
my %config = (char => 0);
my $arg1 = 123;
my @chars = ({ points_123 => 'hage' });
print $chars[$config{char}]->{"points_$arg1"};
# or
# print $chars[$config{'char'}]{"points_$arg1"};
# same as
# print $chars[0]->{points_123};

わかた?
0386nobodyさん03/04/01 10:08ID:???
use strict;
my %config = (char => 0);
my $arg1 = 123;
my @chars = ({ points_123 => 'hage' });
print $chars[$config{char}]->{"points_$arg1"};
# or
# print $chars[$config{'char'}]{"points_$arg1"};
# same as
# print $chars[0]->{points_123};
グホッ、やばいです、インダス文字に見えてきました。
しかも->の意味がわかってないし・・
教えて貰った情報を元にもう一回解説サイト回って消化できるようにしてきまつ。
わけわからんこと書いてるのにアドバイスありがとうございます。
0387nobodyさん03/04/01 10:16ID:???
日付の99/01/22といった形式から
1970年1月1日からの秒数に変換してくれるツールありませんか?
0388nobodyさん03/04/01 10:44ID:???
>>387
Time::Localだね

use strict;
use Time::Local;
# Usage:
# $time = timelocal($sec,$min,$hours,$mday,$mon,$year);

my $date = '99/01/22';
my @date = reverse split m|/|, $date;
$date[1]--;
my $time = timelocal(0, 0, 0, @date);
print $time;

038924603/04/01 13:54ID:2CNQXE4J
遅レスですが、どうして、「%%HOGE%%」%二つで囲むのでしょうか。
別に他の文字とかでもいいんですか?
慣習上の問題ってやつですか?
0390nobodyさん03/04/01 14:14ID:???
CGI.pmを使ってファイルをアップロードするスクリプトを書いてみたのですけども
カレントディレクトリに CGItemp28729 など
一時ファイルが残ってしまい消えません
#アップロードするごとに増えていく

環境はWinXP+ActivePerl v5.8.0 built for MSWin32-x86-multi-thread
です。

初歩的なところでつまずいてると思いますが
一時ファイルを残さない方法教えてください。
039125103/04/01 15:08ID:???
>>390
関数はunlinkでできるけど安易に使うと全部消去しかねない諸刃の剣
そもそも、自分でスクリプトを書いてて何故ソースが理解出来とらんのだろうかと・・・
039225103/04/01 15:11ID:???
>>389
<!-- HOGE -->
で自分は括っとるけど、そんなものは作った人の勝手でしかない
039339003/04/01 15:16ID:???
>>391
いや実はUnixではきれいに消えてるんですが
知り合いにソース頂戴と言われて
あげたら環境がWindowsXPで
テンポラリファイルが消えないと文句言われました。

で自分でその環境を作ったらやはり消えない・・・
039439003/04/01 15:19ID:???
テンポラリディレクトリを指定して
スクリプト起動するごとにそこのディレクトリを
掃除するってことも考えたんですが
なぜ消えないのかの方が疑問になったんです。

んー なんででしょう・・・
039525103/04/01 15:22ID:???
>>394
ソースで問題無い(Cgiなんちゃらを出力してない)のならばwindows版apachの処理の問題じゃないですか?
039625103/04/01 15:23ID:???
>>395
もとい、httpdの問題
039739003/04/01 15:55ID:???
>>395
一応ANHTTPd Apache BJD試してみましたがどれも同じ結果に・・・
ついでに自分の書き方が悪いのかとおもって
他の方が配布しているスクリプトを使ってみても同じでした・・

うーん 気持ち悪い
0398nobodyさん03/04/01 16:02ID:???
>>390
うだうだ言ってないで、テンポラリファイルを消している部分の
ソースコードをここに示してください。

また、余計な部分は示さないでください。
039939003/04/01 16:06ID:???
>>398
CGI.pm参照してください。
0400nobodyさん03/04/01 16:23ID:???
同じく前CGI.pmでアップロードさせたらTempファイルが残っちゃったよ。
結局、僕は解決できなかったので諦めました。
04014 ◆6ykHaReEM2 03/04/01 16:28ID:2ihQy5Oo
opendir(DIR, './');
foreach (readdir(DIR)) {
/^CGItmp/ && unlink;
}
closedir(DIR);

これでだめだろうか?
04024 ◆6ykHaReEM2 03/04/01 16:32ID:2ihQy5Oo
あ、CGItempか,,
Upload終わって、プログラム終了前に↑してもだめなのですか?
04034 ◆6ykHaReEM2 03/04/01 16:34ID:2ihQy5Oo
実は、CGI.pm使ったUpLader作っているので気になる。
暇あればWindowsで試してみます。
040439003/04/01 16:34ID:???
>>402
それがいちばんよさそうですね
UPしたやつはロックかかってるのかわかりませんが消えません
以前にUPしたやつは消えました。

これって激しく既出の問題だったんでしょうか?
0405nobodyさん03/04/01 16:40ID:???
同じくCGI.pmのアップロード機能でつまずいてるものなんですけど
一時ファイルって作成する場所って自分で指定できないんでしょうか?
0406nobodyさん03/04/01 16:44ID:???
ホットメールでのメンバー登録を防止したいのですが
これだと特定のアドレスは阻止できてもhotmail全部は無理みたいです
どうすればいいんでしょうか?

if ($FORM{'EMAIL'} eq "****\@hotmail.com"){ push @err,'・このメールアドレスは使えません'; }
040739003/04/01 16:44ID:???
解決しました。すみません。

原因はファイルハンドルを閉じて無かったことでした。
$filename = $query->param('File');
この状態で <$filename>が存在してしまうので
close($filename);
の一行入れるだけで問題なく一時ファイルは消えるようになりました
くだらん質問してスマソ!!
0408nobodyさん03/04/01 16:48ID:???
>>406
パターンマッチ
0409nobodyさん03/04/01 16:49ID:zxB6PEfR
すげ〜よ
http://homepage3.nifty.com/digikei/
041040603/04/01 16:51ID:???
>>408
なんですか?
0411nobodyさん03/04/01 16:55ID:???
if ($FORM{'EMAIL'} =~ /hotmail/){ push @err,'・このメールアドレスは使えません'; }
でいいかな?
0412nobodyさん03/04/01 17:07ID:???
>>407
な、なんだってー(AA略
041340603/04/01 17:25ID:???
>>411
サンクスできました。
0414nobodyさん03/04/01 17:48ID:???
ttp://www.age.jp/~lunar/index.cgi?read=./package/web_ftp_3_5_0.lzh
の中の ftpcontrol.pl を解読中なのですが、300行目付近の
($boundary) = $content_type =~ /boundary="([^"]+)"/; #";
の行がよくわかりません。左端の括弧が必要な理由と、
右端の #"; が何かよくわかりません。どなたかわかりますか?
0415nobodyさん03/04/01 18:18ID:???
リストコンテキストを作り出すために、カッコをつけているんじゃないかな。

0416nobodyさん03/04/01 18:30ID:???
#";
てのは、なんだかわからん。
普通に考えれば、# 以降は行末までコメントだけど・・・。
041741403/04/01 18:40ID:???
ありがとうございます。左端の括弧はリストコンテキストですね。
調べが足りませんでした。
しかし、右端の #"; は謎ですね。コメントにしか見えないんだけど、
何の意味をこめてコメントにしたのかわからないし、
タイプミスだとしても、タイプミスで「"」を入力するヤシがいるのかと問いたい。
0418nobodyさん03/04/01 18:58ID:???
世の中には対応する括弧やクォートを強調表示したり、
そこへ飛んだりできるエディタが多く存在するのだよ。

そういうエディタで /boundary="([^"]+)"/ なんて行が
あると、クォートの数が揃わんで難儀するのだよ。
0419nobodyさん03/04/01 19:08ID:???
>>418 なるほど!
042041403/04/01 19:10ID:???
>>418
なるほど!!

では、#"; のセミコロンも意味があるのだろうか・・・
0421nobodyさん03/04/01 19:11ID:???
気分?
0422bloom03/04/01 19:13ID:xVxahWvN
http://www.agemasukudasai.com/bloom/
0423nobodyさん03/04/01 23:05ID:jYJDEp5A
@template = ("aaa","bbb","ccc");

foreach $line (@template){
 $line =~ s/aaa/AAA/;
 $hoge = $hoge . $line;
}

print "@template : $hoge";

こうすると、$template[0]自体がAAAになってしまいます。
違うのです。配列の要素は変わらないで欲しいんです。
っていうか、配列の要素に対して置き換えしてるわけじゃないのに
どうして配列の要素の$template[0]が置き換えされちゃうんでしょうか。
$lineに対して処理をしてるのに。
042442303/04/01 23:09ID:???
例えば、@templateを何度か使い回しする時、
配列の要素が変更されてると困っちゃうんです。
0425nobodyさん03/04/01 23:23ID:???
>>423
思いっきり配列の要素を変更しようとしています。

) foreach $line (@template){
)  $line =~ s/aaa/AAA/;
)  $hoge = $hoge . $line;
) }

foreach ループ内では、$line は配列@templateの各要素にセットされます。
$line を変更すると、配列の要素が変更できる、ということです。
変更したくない場合は、一旦別な変数にコピーしてから、扱いましょう。

「コピーする」「セットする」という用語がみそです。
0426nobodyさん03/04/01 23:34ID:???
久々に初心者らしい質問だったな
0427nobodyさん03/04/01 23:51ID:???
ここまで全部嘘でした。
0428nobodyさん03/04/01 23:55ID:wgIEAtF8
#!/usr/bin/perl

@arr = ('aaa', 'bbb', 'ccc');
$str = 'zzz';

foreach $str (@arr) {
  print $str . "\n";
}

print $str . "\n";


最後に表示される1行は、zzz だよ。
今日は4月1日だな。(笑)
0429nobodyさん03/04/02 00:46ID:???
>>428
何を訳わかんないこと一人で納得してんの?
0430nobodyさん03/04/02 01:09ID:???
foreach の横に書いた変数はlocalが付いているものとして解釈される、ということ。
でも今の、foreachの中で$strが@arrの各要素のエイリアスになる、ということには関係ない。
0431 03/04/02 01:20ID:???
モジュールを使わないでmailを送る方法って無いでしょうか?
0432nobodyさん03/04/02 01:22ID:???
がんばれ
0433nobodyさん03/04/02 03:38ID:???
>>431
モジュールって意味わかって言ってんのかなぁ?
0434nobodyさん03/04/02 04:29ID:???
申し訳ないです、"->"の意味を教えて頂けないでしょうか?関数等なら検索すれば
直ぐに出てくるのですが記号等は検索しても何故か引っかからないのでお手上げ状態に
なってしまいます。
0435nobodyさん03/04/02 05:15ID:???
矢印演算子 Perl で検索すれば出てくると思う
0436nobodyさん03/04/02 05:16ID:???
>>434
「Perl 矢印演算子」でぐぐれ

0437nobodyさん03/04/02 08:30ID:???
アロー演算子だろ。
0438 03/04/02 14:38ID:sWPLndkw
質問です。

投票CGIの多重投票防止をクライアントのNICのMACアドレスを取得
することで実現できないかと考えたのですが、実現可能でしょうか?
また実現可能な場合、どのようなコードを書けばいいのでしょうか?

ご教授ください。
0439nobodyさん03/04/02 14:53ID:???
すごいな。
0440nobodyさん03/04/02 14:57ID:???
>>438
MACも偽装できるけどそれでもイィ?
044143803/04/02 15:06ID:sWPLndkw
>>440
それでもIPやクッキーよりもましだと思うので、方法があるのでしたら
ご教授ください。
0442nobodyさん03/04/02 15:09ID:???
偽装の前に、そもそもMACアドレスって、どこまで知れ渡るの?
同じネットワーク内だけじゃ?
0443nobodyさん03/04/02 15:28ID:???
春だなぁ〜(´∀`
0444nobodyさん03/04/02 15:35ID:???
Net::PcapかNet::PcapUtilsでパケットつかまえて
NetPacket::ARPとか使えば出来そうだけど、
敷居が高すぎてやったことないね。

それよりもネットワーク系超ニガテだけどさ、
442さんの言うとおりイーサネットまででしょ。
多分つかまえられるのはてめーんとこのルータのMACアドレスまでだね。
他はIP+ポートのソケット単位でルーティングされてるんだろうから。
リモートのIPじゃだめなの?

よって、クッキーたべさせなさい。
0445 03/04/02 15:35ID:sWPLndkw
>>442
クライアント側でipconfig実行してその値を取得できればいいんですけど
そのやり方がどうも分からなくて、Win32::OLE使えば出来そうなんですけど。

http://member.nifty.ne.jp/hippo2000/perltips/Win32/OLE.htm
0446nobodyさん03/04/02 15:37ID:???
>>445
掲示板に書き込もうとした人に無理矢理ipconfigを実行させるのか?
0447nobodyさん03/04/02 15:39ID:???
そんなことができるなら、とっくにみんなやっていると思うけど。
0448 03/04/02 15:39ID:sWPLndkw
>>444
IPだと再ダイアルアップしたらだめだし、クッキーもその都度消されちゃったら
だめなんでMACアドレスならいいかなと。それにルーターまででも桔梗いいん
じゃないかと・・・
044944603/04/02 15:39ID:???
掲示板じゃなくて投票か。どうでもいいけど
0450nobodyさん03/04/02 15:43ID:???
>>448
だから、てめーんとこのルータまでだって。
ルータ製品を変えない限り何万回でも何億回でも
同じMACアドレスしかつかまえられないでしょ。
そんなクッキーよりIPより無用なものがよかったら
NetPacket::ARP使いなさいってこった。
0451nobodyさん03/04/02 15:45ID:???
それにipconfigをクライアントで実行させた値を取ってこれたら、
果てしなくガクブル系セキュリティホールだな。
しかも、OLEなんて全然関係ないし。
0452nobodyさん03/04/02 18:04ID:4v5aHOPP
外部に作成したHTMLファイルから読み込んで
<!--here-->
みたいなコメントの部分をCGIで置き換えて出力する部分を作成しています(Perl)。

この、HTMLファイルを、CGIのディレクトリと違うディレクトリにいれたんですが、
これだと、HTMLが画像のリンクなどを含んでいた場合、困ったことになります。
HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。

ホームページの編集ソフトなどで作成したHTMLを、指定フォルダにアップする形にしたいので、
すべての画像パスを絶対パスにするとかそういう解決策は無しで、何かいい方法はないでしょうか?

一般的な解決策などがあるのでしょうか?
0453nobodyさん03/04/02 18:09ID:???
>>452
まったく Perl と関係ねー
0454nobodyさん03/04/02 18:12ID:???
君みたいな人はお金で買ったほうが早いよ
0455nobodyさん03/04/02 18:21ID:???
> HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。

その相対パスの指定が間違っているだけではありませんか。
結果的に正しい相対パスになるように、書いておくしかないのではないでしょうか。
0456nobodyさん03/04/02 19:13ID:???
正規表現で自動で置き換えるようにするとかさぁ

なんで<!--here-->は置き換えられてIMGタグは置き換えられないのかと・・・ry
0457nobodyさん03/04/02 20:21ID:???
$iptext = "ip.txt";
##################################
$openimg = "svropen.gif";
$closeimg = "svrclose.gif";

open IN, "<$iptext" or die "ERROR:ipファイルが開けません!";
$ipdata = <IN>;
close IN;

if ($ipdata == "close") {
$dispimg = $closeimg;
&dispimage;
} else {
$dispimg = $openimg;
&dispimage;
}

sub dispimage{
print "Content-type: image/gif\n\n";
open IMG, "$dispimg" or die "ERROR:imgファイルが開けません!";
binmode IMG;
binmode STDOUT;
while (<IMG>){
print STDOUT $_;
}
close IMG;
}
__END__

これのopenimgとcloseimg両方を文字で表したいのですがどうすればいいですか?
0458nobodyさん03/04/02 20:31ID:???
説明下手が多いよな、手助けしたくても理解できんよ。
0459nobodyさん03/04/02 20:40ID:???
>>458
ハゲドゥー
046045703/04/02 20:43ID:???
#!/usr/bin/perl

##############ファイル設定#################
$iptext = "ip.txt";
$open = "あ";
$close = "い";
###########################################

if ($ipdata == "close") {
print "$open\n";
}
else {
print "$close\n";
}

これでは表示されないのかなぁ?
0461nobodyさん03/04/02 21:04ID:???
何を言ってるのかやりたいのか、さっぱりわからん??? 
0462nobodyさん03/04/02 21:08ID:???
なんで

open IN, "<$iptext" or die "ERROR:ipファイルが開けません!";
$ipdata = <IN>;
close IN;

を消してんだよ。
046345703/04/02 21:10ID:???
あれ〜〜〜。。
これさ、imgタグで表示させるから、文字にしても意味ないか、、、
0464nobodyさん03/04/02 21:15ID:???
独り言は脳内でやってくれや
0465nobodyさん03/04/02 21:19ID:???
聞く前に一番最初に気づけ。
046645703/04/02 22:19ID:???
重ね重ねすいませんが、
今やろうとしているのは、

まずip.txtを読みにいって、IPがあれば、「公開」、空白だと「非公開」
(ip.txtの更新はNoDNSというフリーソフトでやってます)
というふうにして、HTMLに表示するCGIを作りたいのですが、どうでしょうか?
0467nobodyさん03/04/02 22:31ID:???
>>466
うるさい
046845703/04/02 22:38ID:yhPO3ktu
#/usr/bin/perl
$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "content-type: text/html\n\n";
print "<html><head><title>公開</title></head>\n";
print "<body><h1>公開</h1></body>\n";
print "</html>\n";
exit;
}
sub unsettion
{
print "content-type: text/html\n\n";
print "<html><head><title>非公開</title></head>\n";
print "<body><h1>非公開</h1></body>\n";
print "</html>\n";
exit;
}
■ このスレッドは過去ログ倉庫に格納されています