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

【Perl】初心者コーナー Part14

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん02/07/18 16:34ID:jemWJhH3
いらっしゃーい、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あたりを見よう。
0853nobodyさん02/08/06 11:10ID:???
いや、そもそもその方式が。
0854art02/08/06 11:11ID:a25IbhtN
>>853
お願いします・・助けてください・・(笑)
0855nobodyさん02/08/06 11:23ID:???
「data」ディレクトリ内にあるtxtファイルの数を
$datという変数に代入するにはどうすればいいですか?
0856nobodyさん02/08/06 11:30ID:yJuB6gJh
cgiで画像を分割する方法ってありますか?

合成ならカウンタとかでよく見かけるんですが、
分割はどうしてもわかりません。

たとえば500x500の画像を
100x100の5個に分割したりする方法です。
085785602/08/06 11:30ID:yJuB6gJh
>>856
500x500
↓
500x100

まちがえたよー
0858nobodyさん02/08/06 11:31ID:???
>art
投稿毎にファイルを生成するなら、ファイル名の数値を調べてインクリメントするが吉。
効率悪いし、メンテナンスしにくいと思うが。
0859nobodyさん02/08/06 11:35ID:???
前もって分割しておく(固定のファイルをいちいち分割する理由がない)。
もしくはGD.pm
086085602/08/06 11:39ID:yJuB6gJh
>>859
画像を携帯から見ようと思うのですが、
当然機種によって表示できるサイズがちがうので、
表示させる段階で分割させたいのです。

厳密にいえば、
大きな画像の任意の一部を抜き出してブラウザに返すのがいいです。
なので、別に分割してファイルを複数つくる必要はないかもしれません。

GD.pmってモジュールですよね?
まだモジュール使ったこと無いので緊張しますが
ちょっと調べてきます。
0861nobodyさん02/08/06 12:53ID:3j+94g7Z
$test =~ /ー/;
ってやるとエラーが出るんですけど、どうすればいいでしょうか?
0862nobodyさん02/08/06 13:15ID:???
$test =~ /\Qー\E/;
0863nobodyさん02/08/06 13:17ID:???
>>861
文字コードをEUC-JPにする
0864nobodyさん02/08/06 13:23ID:xsMd1/x0
掲示板の更新時刻をTOPページに表示しようと思うのですが
掲示板が沢山あり、ログファイルが沢山ある場合、
したの処理を、ログファイルの個数だけ書かないといけないのでしょうか?
良い方法が思いつきません
どうすればよろしいのでしょうか?

#!/usr/local/bin/perl

$file1="log.txt";

$a=(stat($file1))[9];
($x,$mm,$h,$d,$m,$y,$x,$x)=localtime($a);
$m++;

print "Content-type: text/html\n\n";
print"掲示板の更新日は$m/$d $h:$mm";
0865 ◆adminSE. 02/08/06 13:35ID:???
掲示板のログファイル名を配列にいれといてforeachで回して処理すれば?
0866nobodyさん02/08/06 13:49ID:???
>>855の質問に誰か答えられる方いませんか
0867nobodyさん02/08/06 13:57ID:???
opendir DIR data;
@list = <DIR>;
closedir DIR;
@CON = grep { /^*.\.txt$/ } @list;
$dat = $#CON;
0868nobodyさん02/08/06 14:00ID:???
@CON = grep { /^.*\.txt$/ } @list;
0869nobodyさん02/08/06 14:00ID:???
>867
それだと1個足らなくない?
0870nobodyさん02/08/06 14:05ID:???
>>866
ファイル数用のカウンターを作っとけばいいんじゃねーの。
0871nobodyさん02/08/06 14:07ID:???
>>869
そういやそうだった。
0872nobodyさん02/08/06 14:12ID:???
>>867
出力すると「-1」って出てきたんすけど・・
1個少ないんだったら変数に1足しても問題ないですかね?

>>870
簡単に言わないでよ
0873nobodyさん02/08/06 14:48ID:xsMd1/x0
>>865

ありがとうございます。
配列に入れて回したのですが
08/06 14:07 メイン掲示板
08/06 14:09 雑談掲示板
・
・
と出力されるのですが、新しいモノが上に来るようにソートするにはどうしたらよいでしょうか?



print "Content-type: text/html\n\n";
foreach $c (1..$q) {

$access=(stat($file[$c]))[9];
($x,$min,$hour,$mday,$mon,$x,$x,$x)=localtime($access);

$date = sprintf("%02d/%02d %02d:%02d",$mon+1,$mday,$hour,$min);

$sort="$date $name[$c]<BR>\n";
push(@new,$sort);

}
@new = sort { (split(/<>/,$b))[6] cmp (split(/<>/,$a))[6] } @new;
print @new;
0874nobodyさん02/08/06 14:52ID:???
$sort="$date $name[$c]<BR>\n";
の部分は
$sort= "$date<>$name[$c]<><BR>\n";
でした
0875 02/08/06 15:16ID:???
どんどん板のレベルが低下してるのが笑える!
0876nobodyさん02/08/06 15:24ID:???
>>875
そうだな・・・
まぁ、ここは初心者のスレだし良いんでないの?
0877nobodyさん02/08/06 16:14ID:32Vwa5NB
>>873
my %file2mtime;
@file2mtime{@file} = map{ (stat($_))[9] } @file;

foreach my $file (sort{ $file2mtime{$a} <=> $file2mtime{$b} } @files) {
print $file, "\n";
}
0878nobodyさん02/08/06 18:57ID:+CLAZ6EK
IEで、キャッシュを無効にするにはどうしたらいいでしょう。
cgiからの出力を、ブラウザの戻るボタン押下時に意図的にリ
ロードさせたいだけなんですが。。。

<%
Response.AddHeader "Expires", "0"
If Request.ServerVariables("SERVER_PROTOCOL") = "HTTP/1.0" Then
Response.AddHeader "Pragma","no-cache"
Response.CacheControl = "no-cache"
Else
Response.CacheControl = "no-cache"
End If
%>
とか
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
とか
試したんですが無理でした。

誰かよろしくお願いしますっ!
0879nobodyさん02/08/06 19:18ID:???
>>878
Perlとどういう関係があるの?
0880nobodyさん02/08/06 19:29ID:???
>878
ttp://pc.2ch.net/test/read.cgi/php/1025930486/444
マルチポスト氏ね
088187802/08/06 19:36ID:+CLAZ6EK
>>879
Perl cgiです。。
formにオブジェクトを埋め込めないため、ノーキャッシュ
で制御しようとしてるんですが、IEではうまく動かないん
で、どなたか経験者がいらっしゃたらなぁと。

>>880
答えれねぇんなら出てくん名ぼけが
0882nobodyさん02/08/06 19:41ID:???
>881
向こうのスレでレス返してやってるのは俺なんだがな。
マルチポスト氏ね。
088387802/08/06 19:49ID:+CLAZ6EK
>>882
おおそうか。ならあのページにかかれてある事が
上のソースでやってる事もわかってて書いたんだろうな。

まったく、大変有意義なレスだよな。
ぷ。
0884nobodyさん02/08/06 19:55ID:???
意図的にリロード?
おまえブラウザて何処で動いてるか知ってる(ププp
何か思いっきりスレ違いだし、
カタワって可哀相だねppp
0885nobodyさん02/08/06 19:57ID:???
電波キタ━━━━━━(゚∀゚)━━━━━━!!

マルチポストするようなヤツぁ何をやっても駄目。
088687802/08/06 20:03ID:+CLAZ6EK
>>884
クライアントにきまってんだろがぼけ。
クライアントで動くソース投げ店のがサーバのPerl cgiなんだよ。
あっそうか、Perlつかってcgi作った事のない人だったんだ。
ごめんねぇ。。unixとPerlという閉ざされた世界しか知らないんだ。
かわいそうにねぇ・・・・・・。
あ〜〜、いいこいいこ(* T-)ヾ( ̄▽ ̄;) ヨシヨシ w


0887nobodyさん02/08/06 20:06ID:???
>>886
> クライアントで動くソース投げ店のがサーバのPerl cgiなんだよ。
お前がやってるのは VBScript ASPだろ
なんでPerlのスレに書くんだよ。

顔真っ赤にして捨て台詞書くなよ、みっともない・・・
088887802/08/06 20:17ID:+CLAZ6EK
わかったわかった・・・。
しかしサンプルで書くときはどんな言語でも書くだろうに・・・。
近くにあるライブラリからもってくるんだからさぁ。
まぁ俺がPerlで書かなかったのが悪かったな。

わりぃわりぃ。
Perlしかしらねぇんだもんな。
0889nobodyさん02/08/06 20:20ID:???
誰かアソパソマソ貼ってあげて
0890マジレス02/08/06 20:23ID:???
ASPスレがあるのにそちらで書かないで暴れてるアホがいるスレはここですか?

つーかサンプルも糞もあるかよ、ここはPerlスレだ。
あとCGIとASPの違いが分からんアホも逝ってよし。
0891nobodyさん02/08/06 20:26ID:???
___
/ \ ________
/ ∧ ∧ \ /
| ・ ・ | < 氏ねよおめーら
| )●( |    \________
\ ー ノ
\____/
0892nobodyさん02/08/06 20:26ID:???
     ___
    /     \     ________
   /   ∧ ∧ \  /
  |     ・ ・   | < おう、呼んだか?>>889
  |     )●(  |  \________
  \     ー   ノ
    \____/
089387802/08/06 20:31ID:+CLAZ6EK
最初からこう書けばよかったな。
sub printhtml{
my($htmlbody,$mime)=@_;
my $nc="\n"
.'<meta http-equiv="Pragma" content="No-Cache">'
.'<meta http-equiv="Cache-Control" content="No-Cache">'
.'<meta http-equiv="Expires" content="Monday, March 01, 1999 00:00:00 AM GMT">';
&Jcode::convert(\$htmlbody,'sjis');
&Jcode::convert(\$::debug,'sjis');
if($::isnocache){
print $cgiutil::httpheader_nc;
$htmlbody=~s/\<head\>/<head>$nc/;

}else{
print $cgiutil::httpheader;
};
print $htmlbody;
if($::isdebug){print "<h4>DEBUG START</h4>\n".$::debug;};
1;
};
ってやってるんだが、IEのcashに残る。
でもこれはPerlの文法とかじゃねぇから、わっかんねぇな。
スレ違いスマソ
0894nobodyさん02/08/06 20:31ID:+On492A+
モジュールのLWP::UserAgentはどこにありますか?
0895nobodyさん02/08/06 20:52ID:???
>>893 あまり電波には答えたくないんだが、、、

cgiutilパッケージの中身は分からんは $htmlbodyの中身は分からんは、、、

とりあえずDOSプロンプトかShellで試して出力結果のヘッダに

Pragma: no-cache
Cache-Control: no-cache

<head>〜</head>に

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="co-cache">

が含まれてるか見てみれ

>>894
http://search.cpan.org/
089687802/08/06 21:29ID:+CLAZ6EK
>>895
色々スマソ。
HTTPリクエストにもhtmlにも含まれてます。
で、理由としては隠し属性項目でイベントを保存していたため、
戻るで戻ってこられるとイベントが初期値ではなくなっていたためなんですよ。
で、リロードをかけさせるために有効期限とキャッシュレスにしようとしてい
たんですがうまくいかなかったもので。。
java-scriptでリロード時に強引に書き換えるようにして対応しました。
本来リロード時のイベントが、ボタン押下時のイベントを知っているわけ
ないんですが、これしかうかびませんですた。

スレ違いにもかかわらず、申し訳ありませんでした。
0897 02/08/06 22:33ID:???
>>891
それはZIP圧縮?
0898Piano02/08/06 23:37ID:???
ランキングCGI作ってるんですが
降順で表示させようと
reverse sort (@count);
で実行すると、

9
9
8
7
4
2
16

・・と、なぜか16が最後に来てしまいます。
どなたか分かる方いらっしゃいませんか?
0899nobodyさん02/08/06 23:41ID:Fh8h+3RQ
辞書式に降順してるんでしょ。
reverse sort {$a <=> $b} @count
で、どうでしょ。チェックしてないけど。
0900 02/08/06 23:43ID:???
sort{$b<=>$a}@count;
0901Piano02/08/06 23:44ID:???
>>899
出来ました!!
ありがとうございました!!
0902Piano02/08/06 23:44ID:???
>>900
reverse使わなくても出来るんですね。
参考になりました、ありがとうございます。
090389902/08/06 23:51ID:Fh8h+3RQ
そうか>>900の書き方でいいのか…
0904 02/08/07 00:24ID:ulRsWHQg
すみません、基本以下の質問なのですが、PHPを設置できるレンタルサーバ
はないでしょうか?
御存じの方、教えてください。お願いします。
0905nobodyさん02/08/07 00:36ID:nEZxoP/q
xrea
0906nobodyさん 02/08/07 06:28ID:4Lzws0bX
kz islandさんの「アクセス人数表示Lacerta 0.11」CGIを設置したいんですが

ダウンロードする
属性をCGIを755 LOGを666に変更する
HTMLページに<!--#exec cmd="○○/lacerta/lacerta.cgi"-->
と、埋め込んで
CGIと同じディレクトリにアップする

この設置の仕方は間違ってるのでしょうか?
アップしたHTMLページを開いても何も表示されません・・・。
どなたか、教えていただけませんでしょうか?

ttp://www.kz-island.net/cgi/lacerta.htm
0907nobodyさん02/08/07 07:12ID:???
shtml だと思うが……。
090890702/08/07 07:15ID:???
すまん、寝起きで変なことを書いた。
「SSI が有効な設定になっていて
拡張子が shtml になっているのか?」
と言いたかったんだ。
0909nobodyさん02/08/07 07:54ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
0910nobodyさん02/08/07 09:02ID:fr9q9q5s
cgiの中でxmlファイルを生成して、(xslは当然もとから用意しておいて)
xmlをhtmlに変換する事はできますか?

xmlとxslだけではIEでしか表示できないので普通に手作業で、
msxsl.exeを使ってhtmlへ変換していましたが
今回はcgiでxmlを生成してそこからhtmlへ変換することになったのです。
なのでmsxsl.exeの役割をcgiの中でも出来るのかどうかというわけなのです。
0911nobodyさん02/08/07 09:16ID:???
>>910
DOMとかそう言うXMLの常識の言葉を知っていれば答えは自分で出せるはずだけど。
0912nobodyさん02/08/07 10:56ID:7jIJ9A+d
うpろだを作ってるのですが、

送信するものがファイルのみならうまくいくのですが、
一行コメント等もいっしょに送るにはどうすればいいでしょうか?

というのも、
binmode(STDIN);
とやって標準入力をバイナリモードにしちゃうやりかたしかわからないので

テキストは受信してもめちゃめちゃなんですよ。
0913nobodyさん02/08/07 11:26ID:???
テキストもバイナリで受け取っても問題ないと思うが?
ただ\nとかいう表現方法はお勧めできない。
0914nobodyさん02/08/07 12:02ID:biTmKPZ6
まさか、エンコードした日本語を「化けてる」って言ってる
わけじゃないよね。
0915nobodyさん02/08/07 12:05ID:???
>>912
テキストファイルをアップロードしたら、まんま送られるだろ。どうめちゃめちゃなの?

>>914
アップロード時に日本語がエンコード???
0916nobodyさん02/08/07 12:49ID:???
>>915
うpろだでアップロードなんだから、日本語とかはURLエンコードされてしまうと思われ。
0917nobodyさん02/08/07 13:31ID:???
>>916
オマエどこ中だよ!
0918nobodyさん02/08/07 14:18ID:???
>>912
binmodeってWindowsサーバ使ってるのか。
0919nobodyさん02/08/07 14:24ID:???
>>917
落ち着けよ。
0920nobodyさん02/08/07 15:36ID:???
>>915
日本語テキストファイルはそのまんま送られないよ。
「アップロード URLエンコード」とかのキーワードで探せばわかる。
0921nobodyさん02/08/07 16:07ID:???
>>916=920
君は何か勘違いをしている。
0922nobodyさん02/08/07 16:30ID:???
>>921
とりあえず、お前の見解をどうぞ。
0923nobodyさん02/08/07 16:34ID:???
>>912はどこにもテキストファイルとは書いてない。
092492002/08/07 16:50ID:???
>>920はテキストファイルじゃなくってテキストそのもののことです。
それでも>>921の見解は間違いなことにはかわりない。

とりあえず日本語をHTTPでやり取りするときには(ブラウザ側で
自動的に)URLエンコードされるのは当然なんだが、それは知って
いるのかな?
0925nobodyさん02/08/07 17:00ID:???
>>924
お前はテキストファイルと書いたがな。
092692102/08/07 17:01ID:???
>>920=%E3%81%B0%E3%81%8B
092792102/08/07 17:44ID:rbDAoZ/o
私の見解を
enctypeがapplication/x-www-form-urlencoded(デフォルト)なら日本語はURLエンコードされる。
しかしアップローダということなので恐らくenctypeはmultipart/form-dataと思われる。
multipart/form-dataではURLエンコードはされない。
以上
0928nobodyさん02/08/07 18:06ID:???
>>927
漏れもファイルのほうはそう思うが、
送られてくるテキストの方が掲示板のデータように送られてくるのだとしたら、
URLエンコードされてしまうと思う。

つーか、>>912現れてどうめちゃくちゃなのか言え!
092992102/08/07 18:23ID:IJRoW2QJ
<form enctype="multipart/form-data" method="POST" ・・・>
<input type="text" name="hoge" value="日本語">
<input type="submit">
</form>
これでエンコードはされない
だけどboundaryとかが入るのでnameとvalueの受け取りが面倒。
0930nobodyさん02/08/07 18:38ID:sSYiyIo6
>>921=ばか
0931nobodyさん02/08/07 18:41ID:mhNc4G4w
とりあえず、実際にやってみれば判るんでない。
093292102/08/07 18:43ID:2dLUgCtT
>>930
正解でし(UTF-8)
0933nobodyさん02/08/07 19:00ID:???
>>912
CGI.pm使うかcgi-lib.pl使っとけ。
0934nobodyさん02/08/07 20:42ID:???

これは?

%82%A4%82%F1%82%B1
0935nobodyさん02/08/07 20:48ID:???
>>934
それをUTF-8でデコードしろ。
0936nobodyさん02/08/07 21:19ID:???
perlのコメントを自動的に取り除いてくれるソフトありませんか?
0937nobodyさん02/08/07 21:21ID:???
Perlがもっとも得意とする分野なんだが・・・。作れ。
0938nobodyさん02/08/07 21:23ID:???
>>935

いやネタとして出題しただけだが
俺が分からなくて困っているのではない。
0939 nobodyさん 02/08/07 21:30ID:???
>>936
perldoc -q comments
で、C Styleのコメントを取り除くscriptを解説してくれている。
それを参考にしる。
0940nobodyさん02/08/07 23:13ID:???
$val =~ s/&/&/g;
$val =~ s/"/"/g;
$val =~ s/</</g;
$val =~ s/>/>/g;
$val =~ s/\0//g;

このような処理はデコードとはいいませんよね?
なんて言うんでしょうか?
0941nobodyさん02/08/07 23:15ID:???
置き換え。
0942nobodyさん02/08/07 23:20ID:???
>>941

もしコメントとして書く場合はどれが適当でしょうか?

■[置換]のEXCEED和英辞典からの検索結果 


ちかん
置換

substitution; replacement; 《数学》 a permutation. 〜する substitute; replace; 《数学》 permutate. 

0943nobodyさん02/08/07 23:32ID:???
tikan;
esuke-pu;
↑ これが伝説のPGにだけ許される最高の称号
0944nobodyさん02/08/08 00:00ID:???
思うに次スレたてて欲しくない。
ぜんぜんPerlの話じゃないやん。
CGIすれに統合!でめでたしめでたし終わり。
0945nobodyさん02/08/08 00:19ID:???
CGIすれも終わった方が良いんじゃネーノ?w
http://pc.2ch.net/test/read.cgi/php/1025930486/462-
0946nobodyさん02/08/08 00:22ID:???
>>936
モジュールはちと面倒くさいけど、普通のスクリプトからコメントを
取るなら多分 perl -MO=Deparseが一番簡単だと思う。B::Deparseなら
q#foobar# とかの"#"に惑わされる事はないし。
0947nobodyさん02/08/08 00:30ID:???
>>946
ボクりんが今から作るから、チョット待っててネ、パックン!
0948nobodyさん02/08/08 00:31ID:???
次スレは【Perlコーディング】とタイトルに入れてほしい。
0949nobodyさん02/08/08 00:32ID:zM69Q9o6
正規表現で
アイウエオという文字列があったときに
ア イ ウ エ オ
文字ごとに空白を
ってあける方法ってありますか?
あるとしたらどうやるのでしょうか?
簡単にできそうで2バイト文字の扱いがよくわかりませんでした・・・
0950nobodyさん02/08/08 00:41ID:???
>949
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Split
ここ参照。
095194702/08/08 01:25ID:???
ど?

#!/usr/bin/perl

my @files= ('/path/file.pl');

for my $file ( @files ){
    open(R, $file) || next;
    open(W, ">$file.txt") || next;
    while (<R>){
        last if /^__(?:END|DATA)__$/;
        next if /^[\s;]*$/ || (/^[\s;]*#/ && $.!=1);
        1 while s/^(.*[\w"'\)\]\}\s];|.*\)\s*\{)\s*#.*/$1/;
        s/;[;\s]+\n$/;\n/;
        print W unless (!/^=cut/ && /^=\w+/) .. /^=cut/;
    }
    close(R); close(W);
}
0952nobodyさん02/08/08 01:34ID:htQeibpH
>>949
正規表現じゃなくて良いなら。応用は自分で考えて。

$hoge = index($value,'アイウエオ');
if($hoge > -1){
for($count = 0; $count < 4; $count++){
substr($value,$hoge+2,0) = ' ';
$hoge += 3;
}
}
レス数が950を超えています。1000を超えると書き込みができなくなります。