Perl 初心者コーナー Part21
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/03/18 18:47ID:Dujz7IUF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
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
0414nobodyさん
03/04/01 17:48ID:???の中の ftpcontrol.pl を解読中なのですが、300行目付近の
($boundary) = $content_type =~ /boundary="([^"]+)"/; #";
の行がよくわかりません。左端の括弧が必要な理由と、
右端の #"; が何かよくわかりません。どなたかわかりますか?
0415nobodyさん
03/04/01 18:18ID:???0416nobodyさん
03/04/01 18:30ID:???てのは、なんだかわからん。
普通に考えれば、# 以降は行末までコメントだけど・・・。
0417414
03/04/01 18:40ID:???調べが足りませんでした。
しかし、右端の #"; は謎ですね。コメントにしか見えないんだけど、
何の意味をこめてコメントにしたのかわからないし、
タイプミスだとしても、タイプミスで「"」を入力するヤシがいるのかと問いたい。
0418nobodyさん
03/04/01 18:58ID:???そこへ飛んだりできるエディタが多く存在するのだよ。
そういうエディタで /boundary="([^"]+)"/ なんて行が
あると、クォートの数が揃わんで難儀するのだよ。
0421nobodyさん
03/04/01 19:11ID:???0422bloom
03/04/01 19:13ID:xVxahWvN0423nobodyさん
03/04/01 23:05ID:jYJDEp5Aforeach $line (@template){
$line =~ s/aaa/AAA/;
$hoge = $hoge . $line;
}
print "@template : $hoge";
こうすると、$template[0]自体がAAAになってしまいます。
違うのです。配列の要素は変わらないで欲しいんです。
っていうか、配列の要素に対して置き換えしてるわけじゃないのに
どうして配列の要素の$template[0]が置き換えされちゃうんでしょうか。
$lineに対して処理をしてるのに。
0424423
03/04/01 23:09ID:???配列の要素が変更されてると困っちゃうんです。
0425nobodyさん
03/04/01 23:23ID:???思いっきり配列の要素を変更しようとしています。
) 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@arr = ('aaa', 'bbb', 'ccc');
$str = 'zzz';
foreach $str (@arr) {
print $str . "\n";
}
print $str . "\n";
最後に表示される1行は、zzz だよ。
今日は4月1日だな。(笑)
0430nobodyさん
03/04/02 01:09ID:???でも今の、foreachの中で$strが@arrの各要素のエイリアスになる、ということには関係ない。
0432nobodyさん
03/04/02 01:22ID:???0434nobodyさん
03/04/02 04:29ID:???直ぐに出てくるのですが記号等は検索しても何故か引っかからないのでお手上げ状態に
なってしまいます。
0435nobodyさん
03/04/02 05:15ID:???0437nobodyさん
03/04/02 08:30ID:???0438
03/04/02 14:38ID:sWPLndkw投票CGIの多重投票防止をクライアントのNICのMACアドレスを取得
することで実現できないかと考えたのですが、実現可能でしょうか?
また実現可能な場合、どのようなコードを書けばいいのでしょうか?
ご教授ください。
0439nobodyさん
03/04/02 14:53ID:???0441438
03/04/02 15:06ID:sWPLndkwそれでもIPやクッキーよりもましだと思うので、方法があるのでしたら
ご教授ください。
0442nobodyさん
03/04/02 15:09ID:???同じネットワーク内だけじゃ?
0443nobodyさん
03/04/02 15:28ID:???0444nobodyさん
03/04/02 15:35ID:???NetPacket::ARPとか使えば出来そうだけど、
敷居が高すぎてやったことないね。
それよりもネットワーク系超ニガテだけどさ、
442さんの言うとおりイーサネットまででしょ。
多分つかまえられるのはてめーんとこのルータのMACアドレスまでだね。
他はIP+ポートのソケット単位でルーティングされてるんだろうから。
リモートのIPじゃだめなの?
よって、クッキーたべさせなさい。
0445
03/04/02 15:35ID:sWPLndkwクライアント側でipconfig実行してその値を取得できればいいんですけど
そのやり方がどうも分からなくて、Win32::OLE使えば出来そうなんですけど。
http://member.nifty.ne.jp/hippo2000/perltips/Win32/OLE.htm
0447nobodyさん
03/04/02 15:39ID:???0448
03/04/02 15:39ID:sWPLndkwIPだと再ダイアルアップしたらだめだし、クッキーもその都度消されちゃったら
だめなんでMACアドレスならいいかなと。それにルーターまででも桔梗いいん
じゃないかと・・・
0449446
03/04/02 15:39ID:???0450nobodyさん
03/04/02 15:43ID:???だから、てめーんとこのルータまでだって。
ルータ製品を変えない限り何万回でも何億回でも
同じMACアドレスしかつかまえられないでしょ。
そんなクッキーよりIPより無用なものがよかったら
NetPacket::ARP使いなさいってこった。
0451nobodyさん
03/04/02 15:45ID:???果てしなくガクブル系セキュリティホールだな。
しかも、OLEなんて全然関係ないし。
0452nobodyさん
03/04/02 18:04ID:4v5aHOPP<!--here-->
みたいなコメントの部分をCGIで置き換えて出力する部分を作成しています(Perl)。
この、HTMLファイルを、CGIのディレクトリと違うディレクトリにいれたんですが、
これだと、HTMLが画像のリンクなどを含んでいた場合、困ったことになります。
HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。
ホームページの編集ソフトなどで作成したHTMLを、指定フォルダにアップする形にしたいので、
すべての画像パスを絶対パスにするとかそういう解決策は無しで、何かいい方法はないでしょうか?
一般的な解決策などがあるのでしょうか?
0454nobodyさん
03/04/02 18:12ID:???0455nobodyさん
03/04/02 18:21ID:???その相対パスの指定が間違っているだけではありませんか。
結果的に正しい相対パスになるように、書いておくしかないのではないでしょうか。
0456nobodyさん
03/04/02 19:13ID:???なんで<!--here-->は置き換えられてIMGタグは置き換えられないのかと・・・ry
0457nobodyさん
03/04/02 20:21ID:???##################################
$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:???0460457
03/04/02 20:43ID:???##############ファイル設定#################
$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;
を消してんだよ。
0463457
03/04/02 21:10ID:???これさ、imgタグで表示させるから、文字にしても意味ないか、、、
0464nobodyさん
03/04/02 21:15ID:???0465nobodyさん
03/04/02 21:19ID:???0466457
03/04/02 22:19ID:???今やろうとしているのは、
まずip.txtを読みにいって、IPがあれば、「公開」、空白だと「非公開」
(ip.txtの更新はNoDNSというフリーソフトでやってます)
というふうにして、HTMLに表示するCGIを作りたいのですが、どうでしょうか?
0468457
03/04/02 22:38ID:yhPO3ktu$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;
}
0469457
03/04/02 22:51ID:???わざわざこんなに書いていただいたのに申し訳ありませぬが、
あらかじめいろいろ書いているindex.htmlに付け加える形にしたいのですが、、、
なんどもすいません
0470nobodyさん
03/04/02 23:01ID:yhPO3ktu0472nobodyさん
03/04/02 23:09ID:yhPO3ktuSSIでやるには、読み込みたい部分に<!--#exec cgi="よみこむCGIファイル" -->
でいいとおもいます。
CGIでは・・・やりかたがいまいちおもいつきません。index.htmlのフレームを
わければなんとかなりそうですが・・・
0474nobodyさん
03/04/02 23:19ID:yhPO3ktu0476nobodyさん
03/04/02 23:35ID:yhPO3ktu$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){
$ex++;
}
}
close(FILE);
open(FILE2,"+>index.html");
while(<FILE2>){
if(s/<\/body>(.*)<\/html>/\1/ig){
print FILE2 "$_";
}else{
print FILE2 "$_";
}
}
close(FILE2);
if($ex){
&settion;
}else{
&unsettion;
}
0477つづき
03/04/02 23:36ID:yhPO3ktu{
open(FILE3,">>index.html");
print "<h1>公開</h1></body>\n";
print "</html>\n";
close(FILE3);
exit;
}
sub unsettion
{
open(FILE3,">>index.html");
print "<h1>非公開</h1></body>\n";
print "</html>\n";
close(FILE3);
exit;
}
0478nobodyさん
03/04/02 23:46ID:???0479名無しさんパーフェクト
03/04/02 23:50ID:RgSUli0Eそれならまた違うhtmlを編集して最後にそちらに飛ばした方が
0480名無しさんパーフェクト
03/04/02 23:51ID:RgSUli0E0481名無しさんパーフェクト
03/04/02 23:53ID:???0482457
03/04/02 23:56ID:???自宅鯖は<!--#exec cgi="よみこむCGIファイル" -->です。
ってして、あとどうすればいいですか?
CGIファイルはどれにすればいいんですか?
ほんと何も知らないですいません。。
0483nobodyさん
03/04/02 23:57ID:yhPO3ktu0484nobodyさん
03/04/03 00:06ID:os6gOz9aのファイル名をserchip.cgiだとして
それをSSIでindex.htmlに組み込むとすると
組み込みたい場所に
<!--#exec cgi="serchip.cgi"-->
てなかんじでいいとおもいます。
0485457
03/04/03 00:20ID:???0487457
03/04/03 00:49ID:???#!/usr/bin/perl
$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/close/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "閉鎖中\n";
exit;
}
sub unsettion
{
print "公開中\n";
exit;
}
これでSSI使ったらできました。
>>468の
(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
が違ってるとしかおもえないんですが、、どうでしょう?
0490457
03/04/03 01:05ID:???#!/usr/bin/perl
$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/close/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "content-type: text/html\n\n";
print "閉鎖中\n";
exit;
}
sub unsettion
{
print "content-type: text/html\n\n";
print "公開中\n";
exit;
}
直接cgi実行するとちゃんと変わるんですが、SSIにするとうまくいきません。
自宅鯖は<!--#exec cgi="ip.cgi" -->です。って書いたのに、
自宅鯖はです。
になってしまいます。SSIの文まちがってますかね?
0491nobodyさん
03/04/03 01:07ID:???百合親切だな
0492nobodyさん
03/04/03 01:10ID:???ちゃんと設定方法とか読んだのかよ、
つか漏れ的には if(/close/){ が非常に気になるわけだが・・・。
0493457
03/04/03 01:16ID:???#!/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;
}
これで直接実行したらできました。あとは、SSIです。。。
0494457
03/04/03 01:25ID:???.htaccess もトクトクでは動作しませんのでこれは変更不可能です。
また、トップページは index.htm , index.html の形式しか許されていませんので、トップページにSSIを利用することはできません。
( ゚Д゚)ポカーン・・・・・
逝ってきまつ
0497nobodyさん
03/04/03 01:33ID:???whileが最後まで回る所とかな。
0498nobodyさん
03/04/03 01:33ID:???「うまくいきません」の定義はなんだよ?
「自宅鯖はです。」って、HTMLソースレベルでみてそれ言ってるの?
SSIコケたら[an error occurred while processing this directive]が出るだろ普通。
ソース見てみ。多分SSIの構文が丸裸かもしれんぞ。サーバが何かわからんけどよ。
あと、ちゃんとエラーを捕捉しろって。
リファクタリングしてやる。
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw#fatalsToBrowser#;
my $ex = 0;
open(FILE, "ip.txt") || die $!;
while (<FILE>) {
if(/close/){
$ex++;
last;
}
}
close(FILE) || die $!;
print "content-type: text/html\n\n";
print $ex ? "閉鎖" : "公開";
print "中\n";
共通化できる所はまとめなさい。
0500nobodyさん
03/04/03 01:44ID:???>>466の「まずip.txtを読みにいって、IPがあれば、」って、
ファイルにはどれだけのデータがあるのか?
IPある無しの答えは1個なのか複数かもはっきりしてないし
0501nobodyさん
03/04/03 01:46ID:???0502nobodyさん
03/04/03 02:20ID:???perl色々勉強してて、「->」につまづいて、もう全然わけわからなくて、
http://www.rfs.jp/sitebuilder/perl/04/06.html
↑ここが一番詳しいかなとおもうんですけど、ここ見ても意味不明で・・・
だんだんやる気なくしてたんですけど、ちょっと教えていただけませんか?
まず、「矢印演算子を使わなければならない理由」、
あるいは、別に使わなければならないわけでもないなら、
「矢印演算子を使うことでどのようなメリットがあるのか」を
できれば、例をだして、「こういう風なことをしたいときにこうする」
または、「こういう風にするときにこうした方がこういうメリットがある」
という感じで教えていただけないでしょうか?
次に
http://www.rfs.jp/sitebuilder/perl/04/06.html
こことかで出てくる、「無名の配列」「無名のハッシュ」・・・
の「無名」ってのはどういう状態を指してるんでしょうか?
あと、そんなことよりこのサイトで勉強しろよってのがあれば、
貼っていただけると自分で勉強してきます
0503nobodyさん
03/04/03 03:19ID:???@arr = (1,2,3,4,5);
ってときは、arr っていう名前が、この配列についてる。
0504nobodyさん
03/04/03 03:53ID:???http://www.namazu.org/~tsuchiya/perl/info/perl-ja_20.html
どうしてもアローを使わなければならないケースは少ないだろう。
0505nobodyさん
03/04/03 05:20ID:???>無名の名ってのは、変数名のことじゃないかなぁ。
そういうことだと思うんですけど、じゃあ、これが無名ってのは、どういう状態なんでしょう?
まだ、宣言されてない変数ってことなんでしょうかねぇ?
>どうしてもアローを使わなければならないケースは少ないだろう。
でも人のソースを解読したいときに激しく不便、ってかできないんです
教えていただいたurl・・・難しい。明日改めて勉強しに行ってきます
0506nobodyさん
03/04/03 07:32ID:Nji/7HYX無名配列、無名ハッシュってのは、多次元のそれらを作るときできる。
@ar=([baka, aho, manuke], 'kuso', 'manko');
ここで($ar[0], 'kuso', 'manko')は、arって名前の配列だな。
だけど(baka, aho, manuke)ってのは、名前のない配列や。
上のは、print $ar[2], "\n";で表示できるが、下のは、
print $ar[0][1], "\n";または、print $ar[0]->[1], "\n";だ。
ハッシュのときは、矢印演算子使うた方が分かりやすいからよく使われる。
0507nobodyさん
03/04/03 07:52ID:Nji/7HYX%hash=('baka' => 'kuso', 'aho' => {'manuke' => 'manko', 'boke' => 'shikko'});
print $hash{'baka'}, "\n";
print $hash{'aho'}->{'manuke'}, "\n";
0508nobodyさん
03/04/03 08:06ID:Nji/7HYX(...)ってのはリスト構造だ。[...]ってのは配列だ。{...}ってのは
ハッシュだ。いいか?だから、
$ar=['baka', 'aho', 'bokenasu'];
$hash={'baka', 'kuso', 'aho', 'manko', 'bokenasu', 'shikko'};
って書くと直接無名配列、無名ハッシュができる。
$ar->[1]とか$hash->{'baka'}ってアクセスするっきゃ内。
0509nobodyさん
03/04/03 08:09ID:Nji/7HYXもう出かけるぞ。
0510nobodyさん
03/04/03 10:14ID:???$hash = {a => 1, b => {c => 3, d => 4};
$$hash{a}
これはちょっと格好悪いから、矢印を導入。
$hash->{a}
$$hash{b}->{d}
$hash->{b}->{d}
#{..}の間の矢印は省略できる。一気にデリファレンスする感じ。
$$hash{b}{d}
$hash->{b}{d}
無名ハッシュに対してスライスを使いたいとき、矢印は使えない。
@$hash{b}{'c', 'd'} # (3, 4)
普通のハッシュに戻す事もできる。
%hash = %$hash;
このとき、
$hash{b}->{d}は、さっきのルールが適用されて、
$hash{b}{d}でアクセスできる。
0511nobodyさん
03/04/03 10:24ID:???%hash = (a => 1, b => 2);
$hash = {a => 1, b => 2};
この2つの状態を比べると、データは同じでも、上の方は、%hashっていう名前が
付いているのに対して、下は、データのアドレスが$hashに入ってる。
つまり、1つの変数にメモリ上のデータが対応している状態を、普通の状態。
変数に対応していないデータの事を、無名だ。という。
■ このスレッドは過去ログ倉庫に格納されています