【Perl】初心者コーナーPart10
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。
02/02/24 22:18ID:zOj6Yq/31:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0902nobodyさん
02/03/22 23:37ID:???画像置き場とかに使ってくれるな機能があったんじゃない?>ジオ
その関係とかはどうなの?
0903839
02/03/22 23:40ID:???agent・・・REQUEST-HEADER・・・・すみません、どちらもわかりません。
ただ、901さんの言い方からすると、なにか解決法があるということですね。
探してみます! ヒントありがとうございます!
0904ヤクザ
02/03/22 23:51ID:???ひぃぃぃ・・・・すいませんでした。面倒でも普通に書きます (笑い
いや、自分は本を買わず web で勉強していますので、
入門サイトには中々紹介されない $file |= 'hoge'; みたいな
独特の方法なんかあるのかなぁ・・・とか思ったのですよ。
記述&凡ミスを避ける為の出力に振り回されるのも情けないですね。
飽く迄デバッグ用のメッセージと割り切って -w と付き合う事にします。
有難う御座いますた。
0905839
02/03/23 01:02ID:???とりあえずなんとか上辺だけでもそれっぽくなるように
いろいろ探してます。
もし間違ってたら、申し訳ありませんが、教えてください。
別のソレっぽいのを探しに行きますから。
0906IKeJI
02/03/23 05:56ID:5i8LX5eBPerlで、$aに'ー'という文字を含むSJIS文字列が入っているときに、
$a =~ /$b/
という文を実行すると落ちるのですがなぜでしょう?
0907nobodyさん
02/03/23 06:14ID:???エラーメッセージとかは無いの?
あと環境も書いて。
0908nobodyさん
02/03/23 06:43ID:???$bに'ー'が入っている場合だよね?
SJISの2byte文字の2バイト目は'@'から'~'まで使われてしまうので、
'['などが問題を起こしがち。
応急処置としては\Qと\Eで囲むことかな。(詳しくはPerlメモを参照)
[\Q]これ以降に続くすべての非英数文字の前に逆スラッシュを挿入
[\E]\Q,\U,\Lの効果を終了する
0909nobodyさん
02/03/23 06:53ID:???geocitiesは User-Agent見てないみたい。
use LWP::Simple;
getprint 'http://www.geocities.co.jp/';
だけでできたのでなにか別の所に問題があるんじゃないかな?
プロクシ通さないとインターネットにアクセスできない環境からやってるとか。
0910IKeJI
02/03/23 08:19ID:iMj9R1avCGIで使っています、FreeBSDなど色々なサーバーで同じような症状が出ています。
>>908
ありがとうございました。
解決しました。
0911nobodyさん
02/03/23 08:57ID:???すまん、中身間違えた。
no warnings;
my $file = $user::file || 'bbs.cgi';
....
use warnings;
これで逝けるだろ。
0912nobodyさん
02/03/23 10:18ID:???0914nobodyさん
02/03/23 10:23ID:???http://zurubon.strange-x.com/uploader/
自作するならモジュールとか公開ライブラリ使え。
0915nobodyさん
02/03/23 11:43ID:???埋め込みしてあるshtmlの所に戻したいんだけど、どうやるの?
0916nobodyさん
02/03/23 12:17ID:???ひらがな、カタカナ、半角英字、全角英字は
[ぁ-ん]みたいな感じで、使用できると参考書に書いてあったんですが、
半角数字や全角数字も
[0-9]みたいな感じで使用できるのでしょうか?
0917nobodyさん
02/03/23 13:17ID:???print "Location: http://ほげほげ.shtml\n\n";
>>916
質問の答え
まず自分で試せ。
いちいち人に聞かなきゃ判らない内容か?
俺の質問
ところでどんな参考書を読んだのですか?
0918839
02/03/23 15:35ID:???特にプロキシが必要な環境ではありません。
use LWP::Simple;
getprint 'http://www.geocities.co.jp/';
で内容は表示されます。
でも私の欲しいのは最終更新日でして、0が返されてしまうのです・・・。
0919nobodyさん
02/03/23 17:47ID:???telnet www.geocities.co.jp 80
GET / HTTP/1.0
すると、
HTTP/1.1 200 OK
Date: Sat, 23 Mar 2002 08:41:52 GMT
Server: Y.G.Apache-SSLv3/1.3.9
Set-Cookie: Geoche=DX8gxX6cO000tucZycfSdO00ScRoAB; domain=.geocities.co.jp; path=/; expires=Mon, 22-Mar-04 08:41:52 GMT
Connection: close
Content-Type: text/html
<html>(以下略)
と返ってくるので、最終更新日は返さないみたいだね>geocities
0920nobodyさん
02/03/23 19:12ID:aOzStk5lperlを通して綺麗に整形したHTMLとして出力しようとしています。
入力用のhtmlを整形用スクリプトはできたのですが、その間のデータの受け渡しがうまくいきません。
サーバに自作cgiをアップロードして使用した経験はあるので、同じように
<form method="post" action="c:/zisaku.cgi">
<input type="submit" value="出力">
でデータを渡して、
print <<END
....
END
で表示できるだろうと思っていたのですが、submitボタンを押すとcgiのソースが表示されてしまいます。
無い頭をひねって cgi の一行目に「#!/perl」を付け加えたり、拡張子をcgiではなくplにしてみましたが
うまくいきません。
ActivePerlはインストール済みです。
どなたか解決方法が判る方、ご教授願います。
0921839
02/03/23 19:14ID:???どうも、ありがとうございます。
てことは、最終更新日を得るのは不可能ということですか?
方法としては、前回内容を保存しておいて、今回内容と比較して
更新されているかどうかを得る、という方法が現実なんですかね???
0922839
02/03/23 19:18ID:???自作CGIはローカルにあるんですよね?
私は、httpdを入れてつかってます。
ActivePerlだけでは、920さんと同じくCGIソースが表示されました。
素人なので原因も解決法もわかりませんが、
ムリなことなんだろうな、とおもいます。
0923nobodyさん
02/03/23 19:21ID:???サーバーソフトウェア入れないとCGIは機能しませんよ。
http://www.st.rim.or.jp/~nakata/
http://www.apache.org/
それと
print <<END;
にしましょう。
0924nobodyさん
02/03/23 20:39ID:???Anhttpedを導入した所うまくいきました。
ありがとうございました。
父親兼社長に、
「某システム社に頼んだら30万で見積もられたって?そんなの簡単だから一万円でやってやるyo!」
って大口叩いていたので、うまくいってほっとしております。
0925nobodyさん
02/03/23 21:29ID:bh9fdkhx0927nobodyさん
02/03/23 21:45ID:???LAN内では、問題無く動くのだけど、
外から、だと繋がらない、
思い当たる事無いですか
動いてる環境は、Linuxっす。
0930nobodyさん
02/03/23 21:55ID:???0933nobodyさん
02/03/23 22:40ID:???オマエのその価値のないソースを見ないとなんとも言えないZE!
オマエの説明不足からして接続できないのは納得できるZE!
0934nobodyさん
02/03/23 23:03ID:???CGIでHTMLを出力するとして
容量80KBのCGIファイル1つで出力するのと
requireで10KBのファイルを呼び出して20KBのCGIファイル(合計すると30KB)で
出力するのとではサーバーの負荷はどちらが軽いのでしょうか??
perlの勉強をはじめたばかりなんですがどうしてもわからなくて・・。
申し訳ないですがどなたか教えて頂けないでしょうか?
0935839
02/03/23 23:34ID:???取れない場合は、改行およびタグを外した本文を保存しておき、
次回アクセス時に今回のものと前回のものを比べて更新日を推測する、という
方式を取ることにしました。
>>862でLWPで更新日を取得できなかった場合は、
$doc = get URL;
$doc =~ s/\r\n//g;
$doc =~ s/\n//g;
$doc =~ s/<[^>]+>//g;
としています。
ところが、ジオではないあるページにて、前回と今回の$docが同じにも関わらず、
if(前回$doc ne 今回$doc)
に引っかかってしまうのです。他のサイト(ジオ)では問題ありませんでした。
if(前回$doc ne 今回$doc)という表現に問題があるのでしょうか???
0936nobodyさん
02/03/23 23:51ID:???なぜ改行とタグ削って保存するのか疑問。
0937839
02/03/23 23:56ID:???カウンタ画像を読みこまないためにタグを削除しました。
ローカルに落として目で確認しましたが、前回$docと今回$docの
内容は同じでした。
ログファイルの中身ですが、サイトごとに<>で区切り、サイトのURLや
最終更新日等を,で区切って保存しています。
open(IN,ログファイル); $log = <IN>; close(IN);
@log = split(/<>/,$log);
foreach $x (@log){・・・・
という感じですが、改行を外すさないとうまく動かないからです。
すみません、たぶん技術がない所為です。
0938nobodyさん
02/03/23 23:59ID:???便器マークとったら?
0939839
02/03/24 00:02ID:???すみません、2回のアクセスに1度の割合で、
順番に前回と今回の$docが同じでも
if(前回$doc ne 今回$doc)
に反応しているようです。
1アクセス目:反応なし
2アクセス目:LWPで取得できなかったAサイトが反応
3アクセス目:反応なし
4アクセス目:LWPで取得できなかったBサイトが反応(ジオ)
・
・
・
という感じでした。
もしif(前回$doc ne 今回$doc)が悪いのだとしたら、他に良い方法の
ヒントをなんとかよろしくお願いします。
0940nobodyさん
02/03/24 00:10ID:???#!/usr/local/bin/perl -Tw
use strict;
exit &func(STDOUT);
sub func {
my $fh = shift;
print $fh 'hello world.'."\n";
return 0;
}
% ./sample.pl
Bareword "STDOUT" not allowed while "strict subs" in use at ./sample.pl line 3.
Execution of ./sample.pl aborted due to compilation errors.
なんとなく FAQ っぽいのですが、"use strict;" STDOUT で
ググってもそれらしいのが見つけられませんでした。
しかしこれ系のファイルハンドルは実行時に自動的に発生する筈ですし、
性質上初期化なんてできませんよね?
0941nobodyさん
02/03/24 00:17ID:???0942nobodyさん
02/03/24 00:18ID:+OOAM91Zこれはどういう意味なのでしょうか?
本を数冊読んだのですが説明がありませんでした…。
sort_file(...);
というふうに関数を使用しているのですが。
0943nobodyさん
02/03/24 00:37ID:???0944940
02/03/24 00:39ID:???速攻レス有難う御座います。*STDOUT で上手く行きました。
しかし、それって型グロブってやつですよね?
そうなると、なんか意味として回りくどくなってしまうような
気がしますが、こういう使い方はごく普通なのでしょうか・・・???
0945942
02/03/24 01:40ID:+OOAM91Zレスありがとうございます^^
そうすることでメモリ消費を抑えたりするのでしょうか…。
0946nobodyさん
02/03/24 01:42ID:???それは、トータルのスクリプト量が小さいほうがDISKアクセス負荷、
CPU負荷、共に軽いんじゃない?つまり、requireしたほうが軽そう。
どうしても知りたいなら、>>938の言うように、なんらかのベンチマーク
を取って、結果報告キボン。
でも、perl自体が起動する負荷に比べれば、
その程度の違いは無いのと同じだと思う。
0947nobodyさん
02/03/24 01:45ID:???1.そのスクリプトを動かしたマシンにグローバルアドレスがついてない
2.ついてるんだけど、ファイヤーウォールの設定で遮断されてる
3.上記の問題はないんだけど、127.0.0.1 のみをlistenしている。
0949839
02/03/24 02:00ID:???そうですか・・・・
それにしても if(前回$doc ne 今回$doc) に問題がないと
いうことがわかり、前進です! ありがとうございます。
とりあえずEUC(?)にして試してみます!
0950nobodyさん
02/03/24 02:20ID:???実際に検証したわけではないので伝聞ですが読み込みが早いそうです。
今思いつくものでは
use Symbol 'gensym';
use Fcntl qw(:flock);
のようなケース。
0951nobodyさん
02/03/24 22:03ID:???0952nana.cgi
02/03/26 11:46ID:???no strict;
use Asian::Pussy qw/:sexy :healthy/;
0953nobodyさん
02/03/26 12:00ID:pm1MjUopナゼなのでしょうか。
1.NNの場合、Perlが出力したソースが表示されます。
2.Operaの場合はファイルダウンロードのダイアログが起動します。
IEでは問題ないんですけど
私がアフォだからっていう以外の理由を知りたいです。
お願いします。
0954nobodyさん
02/03/26 12:01ID:???ってやってるあたりがおかしいから。
0957953
02/03/26 12:48ID:???その「あたり」でいいですか?
print<<END;
Content-type: text/html\n\n
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
0958nobodyさん
02/03/26 12:52ID:???それ以前にprintをしている可能性は?
0959953
02/03/26 13:02ID:???なさそうです。敢えて言えばサブルーチン名にPrintPageっていうのを使ってます。これは問題ないですよね。
0960nobodyさん
02/03/26 13:09ID:???とりあえずCGIファイルの先頭あたりで
print "Content-type: text/html\n\n";
して様子を見てみるとよいかと。
0961nobodyさん
02/03/26 13:13ID:???ヒアドキュメントでも
print <<'END';
ってやったら解釈されないから注意。
シングルクォーテーションだと解釈されないのは同じだから。
でも、覚えておくと逆に便利な事もある。
メアドをプリントする時とか\入れなくて済むし。
0962953
02/03/26 13:20ID:???>とりあえずCGIファイルの先頭あたりでprint "Content-type: text/html\n\n";
これで正常になりました。
やはり以前のステップに問題があるんだろうと思いますが
現象が解消したので、じっくりゆっくり調べます。
本当にありがとうございました。
0964超・超初心者
02/03/26 14:40ID:6InRaAYk全然わかりません。
任意の10億までの数を入力して、
その素因数分解して、その結果を出力
するプログラムをPERLを使って作成
してください。
ファイル名と文字列を入力すると、
その文字列がそのファイルに含まれるか
どうかを検査し、含まれていた場合は、
ファイルの何行目に含まれているかを
出力するプログラムをPERLを使って
作成してください。
どうか、宜しくお願いいたします。
0965nobodyさん
02/03/26 14:50ID:???宿題は自分でやりましょうね。
はい次の方。
0966nobodyさん
02/03/26 14:51ID:???ぉぃぉぃ
宿題?
素因数分解は遅くていいなら簡単だけど。
速くするのは数論の知識も必要になってくる。
grepみたいなのはものすごく簡単だけど。
教えない。
0967のび太
02/03/26 16:00ID:Kul7lxpG元ファイルの作成と転送そのものは問題なく動作してるのですが、
コピーしたファイルが元のファイルと比べて内容が変わってしまいます。
※内容が変わるというのは、ファイルが最後までコピーされない感じです(100行あったら90行までしか)
テーブルを使用してるのでレイアウトがグチャグチャに。。。
これはどのような原因が考えられるでしょうか?
ちなみに出力したファイルが全て書き込まれる前に転送しちゃってるのかな?と思い
転送の前にスリープとかやってみても結果は変わりませんでした。
0969ほげ
02/03/26 16:09ID:gjNyJjgtモールス信号で伝送してください
0972nobodyさん
02/03/26 18:27ID:???$x = ファイル名
$y = 文字列
$cnt = 1;
open(IN,$x);
while(<IN>){
if($_ =~ /$y/){ print "$cnt行目\n"; }
$cnt++;
}
close(IN);
0973nobodyさん
02/03/26 20:07ID:???$i = $in = $ARGV[0];
for($prime=2;$prime <= $in && $prime<1000000000;$prime++) {
if ( ($i % $prime) == 0 ) {
$power{$prime}++;
$i = $i / $prime;
$prime = 2;
}
}
foreach(sort {$a<=>$b} keys %power) {
$n = $power{$_};
if ($n == 1) {
$term = $_;
} else {
$term = "$_^".$n;
}
push(@result,$term);
}
print "$in = ",join(" * ",@result),"\n";
0977nobodyさん
02/03/26 22:34ID:7ingtp1lprint "a-1=$b";
というのを$bを使わないで
print join("", "a-1=", $a-1);
って書くのは普通ですか?もっと良い方法ありますか?
join使うとhtml出力するときとか、めちゃめちゃ分かりづらくなるんですが。
0978nobodyさん
02/03/26 22:53ID:???printf "a-1=%f", $a - 1;
# or
print "a-1=${ \do{ $a - 1} }";
print "a-1=@{[ $a - 1]}"
好きな方法を試されよ。
0980nobodyさん
02/03/26 22:57ID:???なんで join でくっつけるの? つっくける意味がわからん。
print '$a-1= ',($a-1),"\n";
または
print "\$a-1= ${\( $a - 1 )}\n";
0982977
02/03/26 23:03ID:7ingtp1l979さんと980さんのはピリオドじゃなくてカンマでいいんですか?
なんかdoってのが一番しっくりきそうなので使ってみます。
てか、今までずっとjoinでやってた..。人に見せなくてよかった。
ありがとうございます!
0983nobodyさん
02/03/27 04:56ID:???Error installing package 'Net-SMTP': Could not locate a PPD file for package Net-SMTP
ってエラーが出るんだけど、なにこれ?
プロキシ使ってないのに・・・
http://www.activestate.com/packages/
に Net-SMTP が見当たらないのと関係ある?
0984983
02/03/27 05:02ID:LXoBMXboppm install Net-Ping
は成功しました。回線不調ともちがうようです。う〜ん・・・
0986983
02/03/27 05:34ID:???ppm install libnetでインストールできました。
その後、
ttp://member.nifty.ne.jp/hippo2000/perltips/net/smtp.htm
>なおこのドキュメントではlibnetモジュールをインストールしたときに
>作成されるC:\Perl\html\lib\site\Net\SMTP.htmlを、
なんてのも見つけました。注意不足でしたか
0987帝国 ◆9qoWuqvA
02/03/27 11:30ID:BFIdDUdC$folderで指定したフォルダ内に
フォームで受け取ったファイル名($filename)とパーミッション($permission)で、
空ファイルを生成する方法を教えてほしいんですが・・
もしかしてcgi-lib.plとか使いますか??
0988nobodyさん
02/03/27 11:35ID:???フォルダのパーミッションがきちんと設定されてればopen(MAKE,">$filename");でできる。
パーミッションはchmodで変えれ。
0989帝国 ◆9qoWuqvA
02/03/27 11:58ID:BFIdDUdCファイルの生成はうまく行きました。
でもパーミッションが設定されないんです。。
chmod($permission,"$folder/$filename");
でダメなんでしょうか?
0990nobodyさん
02/03/27 12:09ID:???パーミッションの数字はなににしてる?
0991製作板で誘導した人
02/03/27 12:14ID:???てかパーミッション設定するのに変数使う必要あるんだろうか・・・・
$file="\.\/$folder\/$filename";
chmod 666,$file;
とかじゃダメ?
0992nobodyさん
02/03/27 12:26ID:???0993帝国 ◆9qoWuqvA
02/03/27 12:39ID:BFIdDUdCだから変数に格納する必要が。。
0994nobodyさん
02/03/27 12:44ID:???立たぬなら 立つまでまとう Perlスレ
0995nobodyさん
02/03/27 12:56ID:???次スレ作りましたー
【Perl】初心者コーナーPart11
http://pc.2ch.net/test/read.cgi/php/1017201229/l50
0996nobodyさん
02/03/27 16:20ID:Uw889VO50997nobodyさん
02/03/27 16:21ID:???0998nobodyさん
02/03/27 16:21ID:???レス数が950を超えています。1000を超えると書き込みができなくなります。