【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を見よう。
0857nobodyさん
02/03/21 23:58ID:CC60PDt40858nobodyおっさん
02/03/22 00:00ID:???ヒットするんじゃないの?
>>1- は >>1 と同じとみなすんじゃダメかい?
0860nobodyさん
02/03/22 00:27ID:???ファイルハンドルで索引を見たら書いてあった。
0862839
02/03/22 02:05ID:???テストではうまく動いてる気もするんですが、これでよろしいのでしょうか。
use LWP::Simple;
($content_type, $document_length, $modified_time, $expires, $server) = head "http://www.aaa.ne.jp/test.html";
($sec, $min, $hour, $day, $mon, $year) = localtime($modified_time);
$year += 1900;
$mon ++;
print "$year/$mon/$day/$hour";
0864839
02/03/22 03:18ID:???はい、その通りでした・・・・。
更新時刻が取得できないサイトがいくつかありました。
私のLWPの使い方が間違ってるのでしょうか。
それとももっと良い方法があるのでしょうか。今一度、探してみます。
またヒントを与えてもらえれば幸いです。
0865nobodyさん
02/03/22 03:32ID:???(貴方のマシンがWinなら)WWCとかWWDとかのメジャーな更新チェッカ落として
みると参考になると思うよ。ヘッダも表示されるし。
0866nobodyおっさん
02/03/22 08:23ID:???こんな感じかい?
$_= '>>1-100';
if ( />>(\d+)((-)(\d*))?/ ){
if ( $4 ){ print "$1$2"; } # >>n-n
elsif ( $3 ){ print "$1$3"; } # >>n-
else { print "$1" ; } # >>n
}
0867nobodyさん
02/03/22 08:35ID:???見られないようにする方法ってどうするんですか?
0868nobodyさん
02/03/22 08:38ID:???相手サーバの問題。
更新時刻がとれなかったら長さや内容を前回チェックのと比べるとか。
いくつかのサーバは更新時刻いいかげんに返すので
そのあたりは試行錯誤で。
>867
それらのファイルにアクセス制限をかける。
近ごろの apacheは標準でそういう設定になってる。
0870出来の悪い子
02/03/22 08:54ID:???申し訳ありません m(_ _)m
とりあえず実験してみて
>>774さんのやり方で大丈夫でした
= じゃなくて! ってことですね
もっと頭を解して考えるようにします。
ありがとうございました。
0871nobodyさん
02/03/22 09:49ID:???なぜprintするのかわからないのだけれど,それは効率悪いんじゃないか?
↓こうできるよ.
/>>(\d+(?:-\d*)?)/ and print $1;
0872nobodyおっさん
02/03/22 10:28ID:???print してるのは、だた結果が正しいかを確認するため。
確かに、後読みだとコンパクトにまとめて書けるのでよりいいと思います。
ただし、やりたいコーディングが
>>n
>>n-
>>n-n
の3パターンへのリンクを張るだけならいいのですが、もしかしたら
>n- の場合など、nが1なら100までとかに制御する余地を残す意味で敢えて
わけているだけです。
0873nobodyおっさん
02/03/22 10:48ID:???1つにまとめるなら以下のようによりコンパクトにも書けます。
/>>(\d+(-\d*)?)/
0874縞栗鼠(シマリス)の親方
02/03/22 10:54ID:pJ6rZ2itここは、完全に狂ってる。
授業料は一年分一括前払いなので、
金が入れば、生徒は要らない
金を振り込んだら、何とかその生徒を辞めさせようと
講師どもが、あの手、この手でイヤガラセをしてきますね。
セクハラはもちろん、脈絡の無い罵倒は日常茶飯だね。
酒臭い講師もいるし・・・ 人生の最果て中央高等学院
学歴詐称、経歴詐称、合格実績詐称、デタラメ授業、
http://www.chuo-school.ac/
http://chs-f.com/index.html 中央高等学院福岡校
司法浪人の田中校長は ↑ また司法試験に落ちましたが
HP上では下らない見栄を張っています
0875839
02/03/22 12:08ID:???長さっていうのはファイルサイズのことでしょうか。
そんなこともできるんですか・・・。
LWPモジュールについてもう少し勉強してみます。
0876nobodyさん
02/03/22 12:22ID:???おっさんおっさん、いくらコンパクトでも効率的には>871のほうが上だぞ。
つーか(?:regexp)はNon-capturing groupingsだろ。何でここで後読みなんだよ(w
学生はperldocでも読んで勉強しとけ。
0877nobodyさん
02/03/22 12:26ID:???長さってのは、
use LWP::Simple;
$content = get ("http://www.2ch.net/");
$length = length($content);
と言うことだと思う。868じゃないから知らんけど。
0878nobodyさん
02/03/22 17:23ID:2hKQObXwいま、仕事で掲示板の修正をやってるんですが、
特殊文字を削れってんで、メッセージに対して、
$value =~ s/&/&/g;
$value =~ s/\"/"/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\|/¦/g;
$value =~ s/\[/[/g;
$value =~ s/\]/]/g;
$value =~ s/\\/¥/g;
みたいなことをやってます。
そしたら、
「申し込み」が「・yen;し込み」みたいな感じで思いっきり化けちゃいます。
どうすれば文字化けしないで、特殊文字の変換ができますか?
0879nobodyさん
02/03/22 17:26ID:2hKQObXw$value =~ s/&/&amp;/g;
$value =~ s/\"/&quot;/g;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
$value =~ s/\|/&#166;/g;
$value =~ s/\[/&#91;/g;
$value =~ s/\]/&#93;/g;
$value =~ s/\\/&yen;/g;
こっちが正しいです。
ちなみに「&」は実際は半角文字です。
0880nobodyさん
02/03/22 17:31ID:???Shift-JISだったらモロ化けるね。
上の4つだけで十分。
どうしても変換したいならEUCにすれば?
0881nobodyさん
02/03/22 17:35ID:2hKQObXwえ?意味ないんですか?
某雑誌にこれらの特殊文字は削るか置換しろ!
って書いてあるんですよ。
で、その通りにしてほしいってことで、修正依頼が来たんですよ・・・。
0882868
02/03/22 17:36ID:???ごめんレス番間違えてたね。
>>862で $document_lengthに長さが入ってるみたいなので
それも見たらどうかってこと。
0883nobodyさん
02/03/22 17:37ID:???変換結果に「yen」って出てるので分かるかと思うけど、
「申」のSJIS2バイト目が「\」なのです。
なので、2バイト文字をうまく扱ってくれる jperl を使うってのが、
とりあえずよいのではないかと。
0884nobodyさん
02/03/22 17:38ID:???(もしShift-JISだったら)漢字の一部が変換されてることになる。
わかりますか?
0885nobodyさん
02/03/22 17:39ID:???0886nobodyさん
02/03/22 17:42ID:2hKQObXw環境を変えるのはきびしいです。
>>884
意味はわかります。
それでは、文字コードがSJISならばどうしようもないってことですかね?
880さんが言ってるみたいに、とりあえずEUCに変換しとけってことですか?
0887nobodyさん
02/03/22 17:45ID:???制御文字?
0x0〜0x19 ぐらいのやつ?
特殊文字の変換とかって、どのくらいのことやるのが普通なんですか?
ここ見ろ! ってとことかあります?
0888nobodyさん
02/03/22 17:46ID:???0889878
02/03/22 17:53ID:???0891878
02/03/22 18:03ID:???0893nobodyさん
02/03/22 19:10ID:???決めて貰い後で参照しますが、その際「定義されていない or
空か無効」と「正常」を区別するスマートなやり方ありませんか?
# ユーザの設定
package user;
$file = 'bbs.cgi';
# プログラム
package main;
my $file = (defined($user::file) && $user::file)
? $user::file : 'bbs.cgi';
これだと何度も $user::file をタイプしないといけないので
なんか無駄に文が長くなってしまうような気がします。
なんとなく perl -w で文句を言われるのも嫌なので
my $file = $user::file || 'bbs.cgi';
のような記述も避けたいのですが・・・・。
0894nobodyさん
02/03/22 19:18ID:???話し終わってしまったみたいですが、エスケープする文字は
キチンと用途別に考えた方が良い場合もあると思いますよ。
そのまま or HTML として出力する場合や、コマンドの引数 or
ファイル名として使用する場合などです。
釈迦に説法ならすんまそん。
0895nobodyさん
02/03/22 22:18ID:???何度もタイプするのが嫌なのと perl -w で文句言われるのが嫌なのは相反する
ことなのでどちらかにせざるを得ないのでは?
それとも以下のようにしてみる?恐らくよけい嫌だとは思うが・・・・
my $user_file='user::file';
my $file = $$user_file || 'bbs.cgi';
0896895
02/03/22 22:45ID:???変数 $file をいっそのこと使わないで
my $user_file= 'user::file';
$$user_file ||= 'bbs.cgi';
0897nobodyさん
02/03/22 23:14ID:???ユーザ定義の変数をインポートする部分を
no warnings;
my $file = (defined($user::file) && $user::file)
? $user::file : 'bbs.cgi';
....
use warnings;
面倒は嫌いだ。(w
0898839
02/03/22 23:15ID:???>use LWP::Simple;
>$content = get ("http://www.2ch.net/");
>$length = length($content);
では全く応答なしです。
>>882
$document_lengthは空でした。ナニも入っていませんでした。
私がやろうとしていることは不可能なことなんですかね・・・。
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:???ってやってるあたりがおかしいから。
レス数が950を超えています。1000を超えると書き込みができなくなります。