トップページ⇒php
981コメント390KB

くだすれPerl(超初心者用)2

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん2008/03/03(月) 05:07:32ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
0830nobodyさん2008/11/22(土) 18:47:52ID:???
>>829
ありがとうございます。試してみます
0831nobodyさん2008/11/29(土) 12:59:08ID:060X3luI
初心者です

あ い う え お か き く け こ

と文字列があり、リロードする度に2回ずつ表示させるにはどう書いたら良いか教えてほしいです。

一回目 あ
二回目 あ
三回目 い

って感じです。宜しくお願いします。
0832nobodyさん2008/11/29(土) 13:40:07ID:???
ファイルに記録しとけば?
0833nobodyさん2008/11/29(土) 21:05:33ID:???
my @words = qw(あ い う え お か き く け こ);
my $num = 0;
for $num (0 .. 20) {
$num = $num/2;
print $words[ $num%@words ], "\n";
}
08348312008/11/30(日) 01:08:25ID:???
勉強になります
ありがとうございました。
0835nobodyさん2008/11/30(日) 18:06:10ID:???
こうだな

my @words = qw(あ い う え お か き く け こ);

{
my $call = 0;
sub _idx {
int($call++/2);
}
}

while (my $val = $words[_idx()]) {
print "$val\n";
}
0836nobodyさん2008/12/09(火) 19:35:05ID:???
<input type="text" name="Word">の「Word」の値をformからgetで渡す
ボタンを押して表示されるURLが「test.cgi?page=1?Word=○○」になるようにしたい

<form action="test.cgi?page=1">と書いても?以降は無視されちゃうんですが
何か方法ありますか?
0837nobodyさん2008/12/09(火) 19:48:00ID:???
<form method="get" ......
08388362008/12/09(火) 19:53:00ID:???
<form method="get" action="test.cgi?page=1">
とやると、URLが「test.cgi?Word=○○」になってしまいます。
「?page=1」を入れるにはどうしたらいいでしょう
0839nobodyさん2008/12/09(火) 21:57:27ID:???
<form action="test.cgi">
<input type="hidden" name="page" value="1">
<input type="text" name="Word">
08408362008/12/10(水) 07:22:57ID:???
>>839
すみません それだと「test.cgi?page=1&Word=○○」になってしまいます
Wordの前を「?」にしたいので、hiddenではできないかなと思ってたんですが
できるのでしょうか
0841nobodyさん2008/12/10(水) 08:06:09ID:???
?を2つて事?それは無理でない?てかなんでそうする必要あるんだろ?
順番的な話だけなら記述する行を逆にすればいい話だけど
08428362008/12/10(水) 08:45:47ID:???
既存のCGIの改造なのですが、元のものは>>839の内容をpostで渡しています。
アクセス数の内訳を把握するためにURLを表示させたいのですが、
同じ内容を表示するにはURL内のpageとWordの前に
それぞれ?がないとだめなようなので。

formの記述でなんとかなるかなと思ったんですが、無理ですか…
他の方法を考えます。ありがとうございました。
0843nobodyさん2008/12/10(水) 11:15:13ID:???
初心者ユーザです
プログラムを頂いてActive perl5.6ではしっかり動作したのですが、
5.8.8環境下で一応動くものの、日本語が文字化けして意味不明になります。
ググッた所では日本語の処理方法が違う?見たいな事がチラホラ見えます。

日本語処理で5.6を5.8.8においてそのような違いが有るのでしょうか?
対処方法が有れば、ご教授お願いします;

パッチの置き場所が問題?w
動作環境
5.6 XP ルート設定有り マイコン→ユーザ1→プログラム置き場
5.8.8 XP 設定なし マイコン→Cドライブ→直置き
0844nobodyさん2008/12/10(水) 11:24:04ID:???
文字コードがかわった。
5.8対応するならUTF-8前提で書き直したほうがいいと思う。
0845nobodyさん2008/12/10(水) 11:26:49ID:???
>>843
いい機会だし、テンプレートでも勉強してみたら?
0846nobodyさん2008/12/10(水) 11:41:47ID:???
返信有難うございます
>>844
やはり文字コードが変更されていたんですね;;
書き直し・・・強引に動かす方法無いですかね?(有れば)
無理が有りすぎならプログラム書いた人に相談してきます。
>>845
テンプレート?練習用テンプレで書いてみるって事でいいですか?
急いで探してみます><
0847nobodyさん2008/12/10(水) 12:17:15ID:???
まずはそのプログラム見せないとなんとも答えようがない
0848nobodyさん2008/12/10(水) 20:43:28ID:???
>>842
で、その既存のスクリプトって何なの?
0849nobodyさん2008/12/11(木) 01:27:32ID:???
>>842
明らかにどこかおかしい。
0850nobodyさん2008/12/14(日) 13:24:40ID:???
例えば掲示板スクリプトなどで、
一つのファイルで全部やるよりも、

書き込み.cgi
閲覧.cgi
管理人用.cgi
検索.cgi

などのように、処理の種類ごとに
ファイルを細かく分けた方が、体感軽いとかありますか?
0851nobodyさん2008/12/14(日) 13:32:50ID:???
体感じゃわからん程度
0852nobodyさん2008/12/14(日) 14:18:58ID:???
では、余り気にしなくても良いですね!
ありがとうございました!
0853nobodyさん2008/12/15(月) 17:24:02ID:???
無限ループを回避する方法ってありませんか?
ループごとにカウントしてlastだと管理しにくいので良い方法を探しています
0854nobodyさん2008/12/15(月) 19:30:03ID:V2NIPW0r
あらかじめ何回ループするか決めておいて
for(0..$num)とでもしとけば?
0855nobodyさん2008/12/15(月) 21:15:31ID:???
>>853
なにをしようとしてるのか晒せば良い解が得られるかも
0856nobodyさん2008/12/15(月) 21:46:41ID:???
>>853
終了条件を予め決めておく

>>855
人が何をしようが勝手だろ
こんなとこでネタ探しかよ氏ねくず
0857nobodyさん2008/12/15(月) 22:03:34ID:???
自己レスかよ…
0858nobodyさん2008/12/15(月) 22:05:31ID:???
煽る意味ねえしなあ。
0859nobodyさん2008/12/15(月) 22:08:55ID:???
自演じゃないのかもしれんが、無限ループがどういう状況なのか解らんのに、
レスしても混乱するだけだろ。
0860nobodyさん2008/12/16(火) 00:25:05ID:???
質問の意図を尋ねることもできないこんな世の中では
0861nobodyさん2008/12/16(火) 00:47:33ID:???
デッドロックの検知みたいに無限ループを自動的に発見してブレイクさせる機能が欲しい
0862nobodyさん2008/12/16(火) 01:51:39ID:???
>>861
alarm
0863nobodyさん2008/12/16(火) 03:01:44ID:???
>>856
そんな餌で釣れちゃう?
08648532008/12/16(火) 12:06:04ID:???
皆様ご返信ありがとうございます。
質問の仕方が悪くて申し訳ないです。

例えば配列の値を見るとき、
my $count=0;
for (@array) {
print $_;
$count++;
last if $count>1000;
}
等、終了条件を決めて抜ければいいんですが
ループの度にカウンターを設定してカウントって面倒ですよね?
意図としては>>861のように、何もせず、あるいはもう少し簡単にブレイクする方法があれば
教えて頂きたいというものでした。
PHPだとmax_execution_timeで実行時間を制限できます。
Perlだとそういったものは無いのでしょうか?
08658532008/12/16(火) 12:09:30ID:???
ミスりました
×for (@array) {
○foreach (@array) {
0866nobodyさん2008/12/16(火) 12:19:48ID:???
>>864
854氏が既に書いてるが、
for my $i ( 0 .. 999 ){
print $array[$i] ;
}
08678532008/12/16(火) 12:35:45ID:???
無駄なループを考慮すると
for my $i ( 0 .. $#array ){
print $array[$i] ;
}
こんな感じでしょうか。

あれれ?配列の場合、無限ループにはなり得ない??
0868nobodyさん2008/12/16(火) 13:16:54ID:???
ならないです。
0869nobodyさん2008/12/16(火) 13:57:42ID:???
@array=(1,1);
$i=1;
foreach(@array){
print $_;
$array[$i+1]=$array[$i];
$i++;
}

こんな悪戯とかは。
0870nobodyさん2008/12/16(火) 14:41:21ID:???
>>865
それ、ミスじゃないよ
0871nobodyさん2008/12/16(火) 17:48:59ID:???
>>864
>>862
0872nobodyさん2008/12/17(水) 08:19:35ID:???
無限ループにうっかり陥ったことってある?
俺は意外と無いんだけど…
0873nobodyさん2008/12/17(水) 10:44:54ID:JyAZ5ywx
特定URLで与えられるページを定期的にキャッシュして保存するにはどうすればよいでしょうか?
0874nobodyさん2008/12/17(水) 10:53:59ID:???
無限ループ内でページ取りに行って
取得できたらファイル保存してスリープ
を繰り返す
0875nobodyさん2008/12/17(水) 11:28:15ID:JyAZ5ywx
スリープは処理に時間がかかっているとサーバに怒られたりしませんか?
cronとかそういうのがあると聞いたんですが
0876nobodyさん2008/12/17(水) 11:33:30ID:???
処理に時間がかかると怒られるサーバって書いてなかったのでとりあえずスリープって
書いた
cron使えるサーバならそれでいける
0877nobodyさん2008/12/17(水) 12:12:50ID:JyAZ5ywx
どこでも cron 使えるわけではないのですね。なるほど。
2つの場所にある cgi が、十分短い時間だけスリープして相手を呼び出すってどうでしょう?
0878nobodyさん2008/12/18(木) 11:45:09ID:???
共用でcron使えるのっていまどき普通なのか?

2つのCGIで呼び合うというのは作ったことがあるができるよ。
システム占有率が目立たなければ問題ないと思う。
cronが使えればそれに越したことはないと思うが
0879JyAZ5ywx2008/12/18(木) 11:54:13ID:pPcqWUbs
cron は使えないようでした。それではダブル cgi でやってみます (・ω・)ゝラジャ
0880nobodyさん2008/12/19(金) 19:42:45ID:???
ファイルへの書き込みについての質問です。
ファイルの先頭に追加書き込みをする処理を行いたいのですが、

読み書きモードで開いて、ファイルを全て配列に読み込み、
unshiftで先端に追加してファイルに書き込みをしなおし、
するやり方と、

上書きモードで新しいファイルに追加を書き込み、
それから読み込みモードで元ファイルを開いて中身を新しいファイルに書き込み、
unlinkとrenameをするやり方では、

どちらの方が良いのでしょうか?
また、この二つ以外にオススメのやり方があれば教えて下さい。
08818802008/12/19(金) 20:00:28ID:???
ファイルの中身は1万行とかそういう大量のものではなく、
通常の掲示板の書き込み保存ファイルなどだけを扱うつもりです。
0882nobodyさん2008/12/19(金) 20:13:08ID:???
その2つを比べると後者が圧倒的にいいと思うが、
できれば先頭に追加書き込みする仕様を変えるとかは選択肢にないの?
0883nobodyさん2008/12/19(金) 20:22:02ID:???
ファイルの末尾に>>で書き込みして、
読み込むときにreverseなどをした方が良いのでしょうか?
0884nobodyさん2008/12/19(金) 20:23:05ID:???
>>883の読み込むときとは、
ブラウザでファイルの中身を表示するときのことです。
掲示板でいうと記事一覧表示などです。
0885nobodyさん2008/12/19(金) 20:26:00ID:???
書き込みが頻繁にないのなら、最新分は静的な html でもいいんじゃね
0886nobodyさん2008/12/19(金) 20:38:36ID:???
書き込みは一番多いところでは大体1分に5〜15回程あります。
読み込みは一番多いところでは1秒に30〜100回程あります。
ただ、少ない時間(朝〜昼など)は読み込みも1分に1度程度になる時期もあります。

静的なhtmlというと、書き込みのたびにhtmlファイルの形に書き出す感じでしょうか。
確かにそうしている掲示板スクリプトなどは閲覧が早いですよね、
そういったことはやったことがないので調べてみます、
難しそうに感じますが試してみます。ありがとうございます。

ログファイルへの書き込み自体は、末尾に追加書き込みをし、
閲覧時にreverseするやり方が良いのですか?

サーバーは専用サーバーを借りております。
ただ私に知識が足りないので、基本的な運用は管理者の方に任せている状態です。
必要なモジュールなどはお願いして入れてもらっている形です。
0887nobodyさん2008/12/20(土) 00:27:59ID:???
>>886
CPAN の File::ReadBackwards を使うという手もあります。

何故住人が口を揃えてファイル先頭への追記を忌避するかというと、
必然的にいずれかのステップでファイル全体のコピーを必要とするため、
空間的にも時間的にも効率が悪いからです。

また、読出し負荷を下げるために静的ファイルを利用する際には、
投稿ログファイルのタイムスタンプとキャッシュのタイムスタンプを比較して、
キャッシュのほうが新しければキャッシュをただ投げ返すといった方法もとれるでしょう。

がんばってください。
0888nobodyさん2008/12/20(土) 00:56:27ID:???
うむ。Perlコミュは実際的で頼もしい。
0889nobodyさん2008/12/20(土) 22:09:13ID:???
Perlでzipを解凍するにはどうしますか?
win環境です。
パスワードセットして解凍するです。
よろしくお願いします。
0890nobodyさん2008/12/20(土) 22:46:36ID:???
>>889
今までに何をやったのか書け。
0891nobodyさん2008/12/20(土) 22:53:25ID:???
Perlインストールしたフォルダを”zip”で検索して出たモジュール使うか、
zip解凍ソフトの実行ファイルをオプション付きでPerlからたたく
これで解決
0892nobodyさん2008/12/20(土) 22:54:40ID:???
> Perlインストールしたフォルダを”zip”で検索して出たモジュール使うか、

wwwwww

CPAN つかえよwww
0893nobodyさん2008/12/21(日) 18:51:35ID:???
~$ find `perl -e "print qq(@INC)"` -iname *zip*
./movies/loli.zip
~$
0894nobodyさん2008/12/22(月) 12:53:17ID:???
パスワード付きは、多分、zipコマンド叩くのが早い。
0895nobodyさん2008/12/22(月) 20:16:30ID:Vaq4WjNP
今掲示板を作ってるんですが、htmlファイルを外部ディレクトリに用意して、読み込んで使いたいと思っています
そこで読み込んだhtmlファイルに変数を埋め込んでcgiから出力したいんです
簡単なデータ構造なら埋め込む方法は何個か思いつくんですが、記事とか記事のタイトルとか、配列やハッシュの配列などをどう処理しようか悩んでます
一般的にはどういう方法を取るもんなんでしょうか
0896nobodyさん2008/12/22(月) 20:26:01ID:???
Catalyst + DBIC + TT で完璧。
0897nobodyさん2008/12/22(月) 20:29:14ID:???
>>896
素早い回答ありがとうございます
早速ググってみたいと思います
0898nobodyさん2008/12/22(月) 20:57:44ID:???
Tenjinとかどうだろうか?

Tenjin - the fastest template engine in the world
http://www.kuwata-lab.com/tenjin/
0899nobodyさん2008/12/22(月) 21:01:36ID:???
MENTA とか使ってやれよ。
extlib にゴミが大量に入ってて当初のコンセプトはどこにあるのかさっぱりだけどwww
0900nobodyさん2008/12/22(月) 23:07:11ID:TJyyzWEd
CPANでEncodeモジュールを1.83から2.26に上げようとしているのですがうまくいきません。

all skipped: Perl 5.8.1 or later required
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------------
t/enc_module.t 2 512 3 2 66.67% 2-3
3 tests and 6 subtests skipped.
Failed 1/24 test scripts, 95.83% okay. 2/5850 subtests failed, 99.97% okay.
make: *** [test_dynamic] エラー 29
/usr/bin/make test -- NOT OK
Running make install
make test had returned bad status, won't install without force

Perlのバージョンを今の5.8.0から5.8.1以上に上げないといけないのでしょうか?
0901nobodyさん2008/12/22(月) 23:09:31ID:???
5.8.0 (笑)
09028952008/12/23(火) 00:34:22ID:ZaYeCOkc
>>896-899
ありがとうございます
とりあえずのところ、一番わかりやすかったHTML::Templateを使ってみることにしました
できれば勉強のために自分で作ってみたかったんですが、ソースコード見て諦めましたw
0903nobodyさん2008/12/24(水) 03:27:20ID:DJKrSH/S
掲示板にトリップ機能を付けたいが折れの頭じゃわがんね
なんとか関数と暗号でググると コードとか詳しく説明してあるがイマイチ
0904nobodyさん2008/12/24(水) 23:13:25ID:???
それは残念だったね。再来年頑張れ。
0905nobodyさん2008/12/25(木) 00:07:36ID:???
>>903
トリップ機能とかwikipedia見ただけでつけれたぞ
0906nobodyさん2008/12/25(木) 00:45:10ID:eRkadvZc
ん〜ん素人なりに 勉強してみる 今日も掲示板訪問者からトリップ機能まだ〜ぁなんてメールが来ていた。コードをどこに書くのかが分からん
0907nobodyさん2008/12/25(木) 10:37:40ID:???
MENTAとか凄くわかるんだけど、でもspeedy_cgiで高速化とかってかなり無理なの?
おれはCatalystとか使える環境でやってるから、レンサバのかたの事情は
よく分からんのだけど、speedy_cgiレベルでもキツい?

speedy_cgiオケなら、初めはCGI::Application(Titanium)でやって
負荷が増えてきたたらspeedy_cgi化するってのがよさそうだけど。
0908nobodyさん2008/12/25(木) 21:09:02ID:???
speedy_cgi がどうかしたの?
0909nobodyさん2008/12/26(金) 00:56:21ID:???
共有サーバで動かすのは、セキュリティに問題あるんじゃないの?
例えば、mod_perlは同じユーザーで、プロセス使い回しで実行されるから、かなり危険。
SpeedyCGIはどうなの?
0910nobodyさん2008/12/27(土) 00:59:07ID:???
おまえらmod_perlite作ってるから少しまたれよ
0911nobodyさん2008/12/28(日) 03:50:28ID:???
>>910
待つかどうか判断したいので、まずはリポジトリ晒してもらおうか。
0912nobodyさん2008/12/28(日) 06:40:16ID:???
ぐぐった? http://www.modperlite.org/
0913nobodyさん2008/12/29(月) 10:09:26ID:p2M05RZ+
リフレッシュでgoogleに飛ばしたいんですがいろいろやっても飛びません。どう直せばいいんでしょうか。ロケーションならいけるみたいなんですが、リフレッシュで飛びたいんです。

#!/usr/local/bin/perl

print "Refresh: 3;http://google.com/","\n";
print "Content-type: text/html\n\n";
print "a";
exit;

0914nobodyさん2008/12/29(月) 10:19:37ID:???
url=http://nanntoka
0915nobodyさん2008/12/29(月) 14:53:03ID:???
meta要素で書かないと。
0916nobodyさん2008/12/31(水) 22:39:26ID:vTUPxBET
レスキューさんのCGIを少し触ってこの場合yahooへ三回クリックされれば次のgooへ三回、その次はgoogleを2回
ってな感じで繰り返すのですがyahooへ三回飛ばしたい場合

if ($count>=0 and $count<=4){
print "Location:$word_5\n\n";
}elsif ($count>=5 and $count<=9){
print "Location:$word_5\n\n";
}elsif ($count>=10 and $count<=14){
print "Location:$word_5\n\n";

三回書くのではではなく
:$word_5 = 3

みたいな感じで数字で回数を指定するにはどう書いたら良いでしょうか?
できたらコピペで使えるような答えが欲しいです・・・お願いします。

http://test.testars.com/link.txt ソース
http://test.testars.com/link.cgi


09179162008/12/31(水) 22:42:28ID:???
あ、すいませんこの場合yahooへ9回でした。
$word_5 = 9
みたいに書く方法無いでしょうか?
09189162008/12/31(水) 22:43:52ID:???
ち・・ちがったyahooへ15回でした(汗
すいません
0919nobodyさん2009/01/02(金) 02:39:12ID:???
#! /usr/bin/perl
use strict;
my @num_url = (
  "2,http://www.yahoo.co.jp/",
  "3,http://www.goo.ne.jp/",
  "2,http://www.google.co.jp/");
my $file = "./count";
my ($fh, $count);
open($fh, "<", $file) or die "error";
$count = <$fh>;
close($fh) or die "error";
chomp $count;
my $num_url;
my $i = 0;
for $num_url (@num_url) {
  my ($num, $url) = split(/,/, $num_url);
  if ($count >= $i and $count < $i + $num) {
    print "Location:$url\n\n";
  }
  $i += $num;
}
$count++;
if ($count >= $i) {
  $count = 0;
}
open($fh, ">", $file) or die "error";
print $fh $count;
close($fh) or die "error";
09209162009/01/02(金) 13:25:54ID:???
>>919
ビッグなビッグなお年玉でした。
ありがとうございます、感謝!!
0921nobodyさん2009/01/03(土) 21:24:01ID:xUjko049
ちょっと質問させて下さい。
cgi掲示板を連ねてレンタル掲示板を作ろうかと検討しています。

そこで、全てのフォルダにある掲示板cgiに広告を表示させたいのですが、
MTみたいなモジュールを使って表示させることを掲示板cgiで可能なのでしょうか?

サーバー内
┏bbs1(レンタル)フォルダ
┣bbs2(レンタル)フォルダ
┣bbs3(レンタル)フォルダ
┣bbs4(レンタル)フォルダ
┣bbs5(レンタル)フォルダ
┣bbs6(レンタル)フォルダ
┣bbs7(レンタル)フォルダ
以下どんどん追加

全てに共通した広告を出す。
また、広告の修正なども、1つを修正すれば全てに反映されるようにしたい。
0922nobodyさん2009/01/03(土) 21:37:02ID:???
マルチ乙
0923nobodyさん2009/01/03(土) 23:20:23ID:???
>>921
カンタンだろw
できないなら金払って頼めばいい。
0924nobodyさん2009/01/03(土) 23:50:12ID:xUjko049
>>923
それを聞いてんだろカス!

教えてやる知識ねーならくんなよボケw
0925nobodyさん2009/01/04(日) 00:16:52ID:???
質問コーナーでは知識を持ってるものが圧倒的に偉いという事が
バカにはわからないようだ。ww
0926nobodyさん2009/01/04(日) 00:24:01ID:???
別に偉くはないが。知識も示してないようだし。
0927nobodyさん2009/01/04(日) 00:31:33ID:???
そうか?

教えてもらえないバカは回答得ようと必死でマルチしてるが、
俺は教えなくても何にも困って無いぞ。
0928nobodyさん2009/01/04(日) 00:55:27ID:???
>>921
複数掲示板に対応するスクリプトをひとつ用意した方が楽じゃないか?
まあ、ム板にもあったように広告用モジュール作って、読み込ませればいい。
0929nobodyさん2009/01/04(日) 03:50:47ID:???
>>924

>教えてやる知識ねーならくんなよボケw

自分に対して「教えてやる」って・・・
まず日本語から勉強じゃまいか?
それ以前に幼児に対するような躾が必要そうだがw
0930nobodyさん2009/01/04(日) 10:21:21ID:???
躾入りまぁす(´・ω・`)
レス数が900を超えています。1000を超えると表示できなくなるよ。