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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/03/03(月) 05:07:32ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
0685nobodyさん2008/10/03(金) 17:22:11ID:???
>>684
random てのが何を示すか分らんが…。
! ( $b >= random(100) ) は確実に0、1しか返さんから変に思えるが、
まあ、アリではあるので。
ポイントは、
1. 条件式「!($b >= random(100)) 」を式としてではなく値として利用。
2. 三項演算子の二段がさね。

my $res = COND ? TRUE_EXPR_1
    : ( COND ? TRUE_EXPR_2
    : FALSE_EXPR_2 ) # FALSE_EXPR_1
    ;

my $flag
 = ! $a # CONDITION
 ? !($b >= random(100)) # TRUE_EXPRESSION
 : # FALSE_EXPRESSION ( だかその中にさらに三項演算子)
  (
  ($c <= $a) # CONDITION
  ? random(3) # TRUE_EXPRESSION
  : random(11) # FALSE_EXPRESSION
  )
 ;

分けると
my $pre_flag = ($c <= $a) ? random(3) : random(11) ;
myy $flag = ! $a ? !($b >= random(100)) : $pre_flag ;
0686Perlについて教えてください。2008/10/03(金) 18:04:37ID:PunwVHG2
cgi掲示板なのですが、ログインすると文字化けしてまして、
コードがISO、西ヨーロッパなどとなってしまうのです。

そこで、headerの部分にcharset=を含めようとしてるのですが、
何度やっても、500エラーになってしまいます。


sub header {
print "Content-type: text/html\n\n";
print "<!--//HEAD//-->\n";
print "<html><head>\n";
print "<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">\n"
print "<title>CGI Control Panel</title>\n";


print "<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">\n"
↑
を追加して日本語になるように、お願い致します。
0687nobodyさん2008/10/03(金) 18:06:50ID:???
セミコロンが抜けてる
あと、Content-type: text/html; charset=云々
というのもあるよ。
0688nobodyさん2008/10/03(金) 18:22:45ID:???
>>686
マルチ氏ね
06896842008/10/04(土) 09:25:08ID:S1uyMhw/
>>685
なるほど、わかりました。
すいません。randomはrandの間違いでした。

my $flag = (!$a) ? !($b >= rand(100)) : (($c <= $a) ? rand(3) : rand(11));

つまり↑と↓は同じという理解で良い訳ですね。

my $flag;
if (!$a) {
$flag = !($b >= rand(100));
} elsif ($c <= $a) {
$flag = $rand(3);
} else {
$flag = $rand(11);
}

ありがとうございました。
0690nobodyさん2008/10/04(土) 10:53:07ID:uZuIKJns
「導入効果バツグン! PHP5.0+MySQL5.0で構築する最速Webシステム」
↑これおすすめ!
"register_globals = on"
を推奨していることについて気をつければ・・・ですが
0691nobodyさん2008/10/04(土) 18:05:45ID:???
専用鯖なら気にならんからな
0692nobodyさん2008/10/04(土) 18:06:47ID:???
>>691
なんで?
0693nobodyさん2008/10/04(土) 18:16:28ID:???
safe_modeと勘違いしてる悪寒
0694nobodyさん2008/10/04(土) 19:36:37ID:???
1 ******
2
3 aaa
4
5 ******

上のようなテキスト(数字は行番号)で、任意の文字列(aaa)にマッ
チしたら、囲まれた範囲(2行目〜4行目)を別ファイルにコピーする
コードはどう書けばいいでしょうか?

自分でも調べますが、perlは全く知らないので教えてくれる人がい
ると助かります。
0695nobodyさん2008/10/04(土) 19:50:09ID:???
1: > perlは全く知らないので
2: ところでaaa
3: aaa
4: aaa
5: これだと
6: aaa
7: どこからどこまでaaaが
8: aaa
9: aaa囲まれた
10: 範囲なんだ
0696nobodyさん2008/10/04(土) 20:01:11ID:???
>>694
簡単なのは「******」から次の「******」までをバッファリングして、
バッファの中に「aaa」があったらファイル開いて書き込む、とかかね。
06976942008/10/04(土) 20:31:56ID:???
>>696
なるほど、その発想は無かった。
0698nobodyさん2008/10/04(土) 21:35:30ID:???
696氏の方針で。
perl -0777ne 'print grep /^aaa$/m, /^\*{6}\n(.*?)(?=^\*{6}\n)/gms ' hoge.txt >fuga.txt

正規表現一回だと結構めんど
perl -0777ne 'print /^\*{6}\n((?:(?!^\*{6}\n).)*?^aaa\n(?:(?!^\*{6}\n).)*?)(?=^\*{6}\n)/gms ' hoge.txt >fuga.txt
06996942008/10/04(土) 22:21:09ID:???
>>698
ありがとう、参考にさせてもらいます。
07006942008/10/05(日) 14:05:30ID:???
お陰様で当初の目標は達成できました。どうもありがとう。

次は一歩すすんで、↓のようなテキストの場合、2-4行目と9-11行
目を別ファイルに保存したいのです。


1 *start*
2
3 aaa
4
5 *end*
6
7
8 *start*
9
10 aaa
11
12 *end*


ファイルをオープンしてwhile文で繰り返し処理をしたら行けるの
かな、と思ったのだけど、よく考えたらwhileは1行ずつしか読み
込まないからこの方法だと駄目なのですね。

分かる人がいたらお願いします。
0701nobodyさん2008/10/05(日) 14:13:01ID:???
>ファイルをオープンしてwhile文で繰り返し処理をしたら行けるの
>かな、と思ったのだけど、よく考えたらwhileは1行ずつしか読み
>込まないからこの方法だと駄目なのですね。

なにがダメなんだ?
0702nobodyさん2008/10/05(日) 14:19:41ID:???
後出し追加質問は良くない。
自分で何処まで書けたのか提示しないのも良くない。

この質問に答えた後に、「では…の様にするのはどうしたら良いでしょう?」
って来るのが目に見えてて答える気にはならん罠。
0703nobodyさん2008/10/05(日) 14:21:12ID:???
後から出すんだから追加質問に決まってたorz...
0704nobodyさん2008/10/05(日) 14:56:18ID:???
httpリクエストヘッダからクッキーを抜き出したいんだけどお願いします
クッキーを発行しているページへ下記の様にしましたけどエラーです
どなたか手直しお願いします
やりたいことは新しいクッキーを100個くらい集めたいです

use HTTP::Request;
use LWP::UserAgent;
 
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => 'http://hoge.jp');

while(1){
my $response = $ua->request($request);
print $response->header('Set-Cookie'),"\n";
sleep 1;
0705nobodyさん2008/10/05(日) 14:58:35ID:???
>>704
hoge.jp は実在だから使うなと(ry
0706nobodyさん2008/10/05(日) 15:07:27ID:???
えぇええええ!
実在してたのかorz
この前、実在のアドレスは2chで晒すなと指摘を受けたので
気をつけたのに
>>705さんは私と多分どこかで遭遇してるね
いつも応援ありがとう
よろしく^^
0707nobodyさん2008/10/05(日) 15:09:29ID:???
実在はwww.hoge.jpの方だた。良く見ずに書いた。
あなたには非が無い。
07086942008/10/05(日) 16:00:04ID:???
>>702
それは申し訳ない。
次からはルールに倣って質問します。
0709nobodyさん2008/10/05(日) 16:08:06ID:???
クッキー食いたくなった
0710nobodyさん2008/10/05(日) 16:51:17ID:???
>>704
全角スペースが含まれていて、}が閉じてないとか?
エラー内容が伏せられてるから、あてずっぽうで。

URLはhttp://example.com辺りを使えば被らない事がrfc2606保障されてる。
07117002008/10/05(日) 17:06:32ID:???
自分で考えてみて、出来たことは出来た。
Cは知っているのでその知識で強引に実現した感じ。

=========
#!/usr/bin/perl

$i = 1;
open IN, "hoge.txt";

while (<IN>) {
if (/.*start.*/) {
$flag = on;
$string = "";
} elsif (/.*end.*/) {
open OUT, ">file$i";
print OUT $string;
$i += 1;
$flag = off;
close OUT;
} else {
if ($flag eq on) {
$string .= $_;
}
}
}

close IN;
=========

perlの人からは腐ったコードに見えると思うので改良点が有ったら
教えてください。Cの人から見ても腐ってる、というのはこの際勘
弁。
07127002008/10/05(日) 17:38:53ID:???
文字列aaaを含むという条件を忘れていたので追加しました。

========
#!/usr/bin/perl

$i = 1;
open IN, "hoge.txt";

while (<IN>) {
if (/.*start.*/) {
$flag = on;
$string = "";
} elsif (/.*end.*/) {
$_ = $string;
if (!/.*aaa.*/gms) {
next;
}
open OUT, ">file$i";
print OUT $string;
$i += 1;
$flag = off;
close OUT;
} else {
if ($flag eq on) {
$string .= $_;
}
}
}
close IN;
=======
0713nobodyさん2008/10/05(日) 19:23:20ID:???
>>712
正規表現の.*はいらない。gmsもいらない

あと、状態遷移のアルゴリズムはシグナル判定(start,end文の検出)を
状態判定(flagの検出)の内側に持ってきた方がよいと思われ。
0714nobodyさん2008/10/05(日) 19:31:32ID:???
>>712
裸の文字列は、C でも厳禁 => $flag = 'on', $flag eq 'on'
07157002008/10/05(日) 21:09:06ID:???
レスどうもです。

「こんなのperlを最大限に使えば半分以下のコードで済む」といっ
た間違いで無ければ、さしあたってはそれでいいです。とりあえず
動くものを書いて、根本的なロジックがおかしくなければ後は修正
するだけなので。

そういった間違いではないようなので、後はこれをブラッシュアッ
プしていきます。どうもありがとうございました。
0716nobodyさん2008/10/05(日) 21:42:03ID:???
たぶんこれからも「次の段階」がずっと続くような取り組みかたをしてて
「C脳の自分」(表現が悪くて申し訳ない。悪意はないです)が不安で訊いてしまうのかな?

ループ制御できてフラグ使えてパターンマッチ使えてるんだし
指摘されてる bare word とかそんなもんじゃないすか。

> 「こんなのperlを最大限に使えば半分以下のコードで済む」

'on' or 'off' のフラグ変数でなく範囲演算子 .. でフリップフロップ(>>46の使い方)させたら便利とか
フラグ変数使うにしても文字列比較より 1 か 0 のほうが楽とかコマゴマしたのはあるけど、
動きゃいいんです。
0717nobodyさん2008/10/05(日) 22:01:19ID:???
まぁ元々perlは最初からカチっと作るモノには向いてないからな
0718nobodyさん2008/10/05(日) 22:11:49ID:???
コード部分だけだったら8行。
シェバン行とuse strict; use warnings で11行。
そんなもん追求するには10年早い。
0719nobodyさん2008/10/05(日) 23:59:23ID:???
>>710さん
>>704です
ご指摘ありがとうございました
お陰さまで動くようになりました^^;
空行の全角スペースを削除して
最後の行に}を付け足しただけで
エラー無くなりました
ありがとうございました^^
0720nobodyさん2008/10/06(月) 01:08:02ID:???
WEBから抽出した文字列をテキスト保存する方法教えてください
0721nobodyさん2008/10/06(月) 01:19:35ID:???
>>720です
言葉足らずですいません
ファイル名は年月日時分秒で保存したいです
よろしくお願いします
0722nobodyさん2008/10/06(月) 03:55:49ID:???
>>720です
テキスト保存できるようになったのですが
ファイル名をTES-YYYYMMDDHHMMSS.txtにする方法わかりません
どなたか教えてください
お願いします
0723nobodyさん2008/10/06(月) 04:31:33ID:???
よく分からないんだがファイルをダウンロードした時の時刻をファイル名にするってこと?
それともファイルのタイムスタンプをファイル名にするってこと?
0724nobodyさん2008/10/06(月) 04:41:45ID:???
>>723さん
レスありがとうございます
>>720です
ダウンロードが完了した時刻をファイル名にしたいと思います
tes-08-10-06-04-41-50.txt
上記のようなファイル名が目標です
お時間のあるときにでも教えて頂けたら幸いです
0725nobodyさん2008/10/06(月) 05:06:00ID:???
use DateTime;

$filename = DateTime->now(time_zone => "+0900")->strftime("tes-%y-%m-%d-%H-%M-%S.txt");
0726nobodyさん2008/10/06(月) 06:00:00ID:???
>>725さんありがとうございます
>>720です
教えて頂いたコードでテストしてみたところ
Can't locate DateTime.pm in @INC (INC contains: C:/Perl/lib .) at tes.pl line 6.
BEGIN failed--compilation aborted at tes.pl line 6.
とエラーになります
当方の環境でしょうか?
WindowsXp ActivePerl-5.8.8.822です
今日はオヤスミしますので、また明日にでも調べてみます
お疲れのところ本当にありがとうございました
0727nobodyさん2008/10/06(月) 06:41:21ID:???
>>712
use File::Slurp;
my $text = read_file('hoge.txt');

my @part = ($text =~ m|^\*start\*$((?:(?!^\*start\*$).)*?aaa.*?)^\*end\*$|gms);

for (my $i = 0; $i < @part; $i++) {
write_file('file' . ($i + 1), $part[$i]);
}

0728nobodyさん2008/10/06(月) 06:46:14ID:???
もう一行減らせるなw
0729nobodyさん2008/10/06(月) 07:29:33ID:???
>>720です
先人の残してくれたものを参考にさせて頂き
なんとか目標のものができました
みなさん本当にありがとうございました^^

use HTTP::Request;
use LWP::UserAgent;
use File::Find;
use File::Basename;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => 'ttp://www.ググル.co.jp/');
$i = 1;
while($n < 3){
$n++;
my $response = $ua->request($request);
print $response->header('Set-Cookie'),"\n";
sleep 1;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
@a = split($i);
$i = sprintf("TES-%s%04d年%02d月%02d日%02d時%02d分%02d秒%s", $a[0], $year+1900, $mon+1, $mday, $hour, $min, $sec, $a[1]);
open(DATAFILE, ">> $i.txt") or die("Error:$!");
print DATAFILE $response->header('Set-Cookie'),"\n";}

0730nobodyさん2008/10/06(月) 07:58:00ID:???
あぁ1箇所書きミスしてた^^;
まあいいかw
0731nobodyさん2008/10/06(月) 08:02:00ID:???
終ったんならいいけど、参考までに
use POSIX qw(strftime) ;
print strftime "%y年%m月%d日%H時%M分%S秒\n", localtime ;
0732nobodyさん2008/10/06(月) 08:02:45ID:???
年四桁%Y
0733nobodyさん2008/10/06(月) 08:13:21ID:???
>>731さん
>>732さん
今後の参考にさせて頂きます
レスありがとうございます^^
0734nobodyさん2008/10/07(火) 18:53:36ID:???
use strict;
use warnings;
use LWP::UserAgent;
use Time::Piece;
use IO::File;
my $fname = localtime->strftime("%Y年%m月%d日%H時%M分%S秒.txt");
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET=>'http://www.google.co.jp/');
my $res = $ua->request($req);
if ($res->is_success) {
my $io = IO::File->new("$fname", ">");
$io->print($res->content);
$io->close;
}
0735nobodyさん2008/10/08(水) 23:43:58ID:???
>>734さん
レス遅くなり申し訳ないです
サンプル作ってくれたんだ^^
ありがとう
環境の違いなのか4行目のuse Time::Piece;の部分がキャントロケートなんとかってエラーが出るんです
use Time::Piece;が当方のパソコンにインストールされていないってことなんでしょうか?
せっかく>>734さんが作ってくれたのに使えなくってすいません
ありがとうございました
0736nobodyさん2008/10/09(木) 00:43:23ID:???
CPAN使ったことないのか?
0737nobodyさん2008/10/12(日) 14:00:31ID:???
数日前にperlの勉強を始めた超初心者です。
配列の勉強中で下のようなのを書いたんですが、実行するとエラーになります。
どこが悪いのか分からないので教えていただけないでしょうか?

#!/user/bin/perl
$. = ",";
$\ = "\n";
@data = (3,6,7);

print @data;
%data[1] = 'six';
print @data;

%data[5] = 9;
print @data;

@data = (1,2);
print @data;
0738nobodyさん2008/10/12(日) 14:09:49ID:???
一行目
0739nobodyさん2008/10/12(日) 14:35:35ID:???
>>738
あ、基本的なところが;;
直して実行してみましたが、まだエラーになります(ノд`)
他に変なところは無いでしょうか?
0740nobodyさん2008/10/12(日) 14:47:38ID:???
%data[1] => $data[1]
%data[5] => $data[5]
0741nobodyさん2008/10/12(日) 15:16:41ID:???
エラー文くらい読もうぜ
0742nobodyさん2008/10/12(日) 15:25:44ID:???
すみません;;
ありがとうございます;;;
0743nobodyさん2008/10/12(日) 21:56:41ID:???
初心者がつまづく最初の難関だよねー
なんで配列の要素にアクセスするのに、
%じゃなくて$なんだよと。
0744nobodyさん2008/10/12(日) 22:56:30ID:???
なんでと言われてもなぁ
0745nobodyさん2008/10/13(月) 01:27:50ID:???
>>743
なんで%が出てくる理由があるのかと
0746nobodyさん2008/10/14(火) 12:12:13ID:???
なんで説明に => 使うんだよ・・・
0747nobodyさん2008/10/14(火) 12:28:13ID:???
うんうん
0748nobodyさん2008/10/14(火) 14:49:26ID:W0wcfnrq
漠然とした質問ですみません。
今HP乗せてるブロバイダでperl4が対応しなくなるので、ソーすを変更しろと
いう通知が来ました。無料公開のCGIを拾ってきて掲示板や質問を埋めて
もらってメールを受けるのを使った程度の記憶しかありませんw
4から5に変更するにはどうしたらいいのでしょうか?
0749nobodyさん2008/10/14(火) 15:25:39ID:???
たぶんそのまんまでいいよ。
0750nobodyさん2008/10/14(火) 15:47:00ID:???
4→5になるのはPHPのような気がする。
0751nobodyさん2008/10/14(火) 15:47:24ID:CJyY9JPp
リンゴはコマンドプロンプト無いけどどこで実行確認するの?
0752nobodyさん2008/10/14(火) 18:34:16ID:???
OSXのことかね。
ssh起動してターミナルでGo。
0753nobodyさん2008/10/14(火) 19:19:11ID:CJyY9JPp
>>752
ありがとう!
0754nobodyさん2008/10/18(土) 08:37:31ID:TpRddp7o
Embperlというperlモジュールを追加したいのですが、
追加中に
Apache source not found, enter path name or q to quit
といわれてしまいます。
Apacheのソースコードなどが必要ということでしょうか?
Apacheのバージョンが2.2.6なのですが、ソースコードが見当たらないです。
すいませんがご存知の方教えてほしいです。
0755nobodyさん2008/10/18(土) 10:53:04ID:???
>>754
配布元ウェブサイトに行くとそのあたりのことを書いてありますが。
0756nobodyさん2008/10/18(土) 11:46:59ID:TpRddp7o
また質問です。
Apache2.2.6から2.2.10にアップグレードする場合、
古いApacheを消さず、そのままアップグレードってできますか?
環境はwindowsXPです。
0757nobodyさん2008/10/18(土) 11:48:06ID:TpRddp7o
誤爆しました。すいません。
0758nobodyさん2008/10/18(土) 18:51:00ID:???
Larry Wall に、Programming Perl の第4版をいつ書くのかを聞きたいのですが、どこで聞けますか?
0759nobodyさん2008/10/18(土) 21:19:53ID:???
使用しているモジュールのバージョンアップ後に
lwpでhttpsサイトのソースをgetで取ると一部が抜けてしまう
状態になったのですが、Crypt-SSLeayを削除したところ
問題なく取得できるようになりました。
最近のバージョンではCrypt-SSLeayは使わなくなったのでしょうか?
07607592008/10/18(土) 21:31:03ID:???
すんません、なんか勘違いしていたようです・・・

あれこれやってるうちにp5-Net-SSLeayの方も入れてました。
これも消したところ接続不能に…
一方ずつ試してみたところ、Crypt-SSLeayの方では>>759の状態になるのですが
Crypt-SSLeayを削除してNet-SSLeayを入れたところ正常になりました。
LWPではCrypt-SSLeayの方を使ってたと思うんですが、Net-SSLeayに変わったのかな・・

BASIC認証もおかしくなったしportupgradeでまとめてあげたのが悪かったのか…(´・ω・`)
0761nobodyさん2008/10/24(金) 04:49:19ID:kVbR7JUN
perlで入力された文を単語に分割し、単語ごとに改行し、a.txtファイルへ追加書き込みを行うプログラムを具体的にそのプログラムを書いて教えてください。
0762nobodyさん2008/10/24(金) 12:59:37ID:???
単語に分けるには形態素解析とか使うのが常套だと思うが
ここに書くには面倒だな
0763nobodyさん2008/10/24(金) 13:48:31ID:???
くだ質問失礼します。

あるPerlスクリプトでMIME::Toolsを利用しているのですが
MIME::Tools内でFile::Tempをインクルード?しようとしているときに
File::Temp Vresion 0.18 Required--This only Version 0.12と表示され
スクリプトが動作しません。

CPANではFile::TempのVer 0.12の配布は終わったらしくインストールできません。
そこでtar.gzを探してインストールしてみたのですがエラーは改善しません。
CPANでインストールしたものを-Dオプションで削除しても同様でした。

CPANでインストールしたものとtarボールからインストールしたモジュールは
同居できないのでしょうか?

もしそうだとするとこのエラーは解決しないのでしょうか。

動作OSはDebian Etchです。
0764nobodyさん2008/10/24(金) 14:02:11ID:???
>>763
> File::Temp Vresion 0.18 Required--This only Version 0.12

File::Temp Vresion 0.18 が必要--これはたったの Version 0.12

07657632008/10/24(金) 14:33:43ID:???
>>764
レスありがとうございます。
英語を誤読していましたか。お恥ずかしいです。

で、CPANでFile::Tempと念のためMIME::Toolsを最新にしてみました。
File::TempはVre 0.20、MIME::Toolsは5.427に上がりました。

ですが元のParlスクリプトを実行すると
全く同じエラーが表示されます。
バージョン番号を誤認しているようなのですが
そもそもParlやCPANはどこでバージョンを管理しているのでしょうか。
0766nobodyさん2008/10/24(金) 14:48:26ID:???
思い込みと決めつけ
0767nobodyさん2008/10/24(金) 14:57:09ID:???
>>765
コンソールから、
perl -MFile::Temp -e "pritn $File::Temp::VERSION" (Unix系ならシングルクオートで)
やってみ。
これで0.12が出たら、多分、システムにもともと入ってた0.12と新しく入れた0.18が共存してる。

OSとか分からんからはっきりとは言えないけど、そのシステムに合ったやり方で
モジュールのバージョンアップしないと(ActivePerlならppm、RHEL系Linuxならrpmなど)
違うファイルパスに二つのバージョンが入ってしまう、ってことも起こり得る。
07687632008/10/24(金) 15:22:04ID:???
>>767
レスありがとうございます。
教えていただいたコマンドを実行してみましたが何も表示されませんでした。
念のためsudoにてroot権限でも実行してみましたが同じでした。
(ちなみ動作環境はDebian Etchです)

とりあえず共存の可能性があるとのことご指摘があったので
Perlのモジュールが格納されてそうなディレクトリを
調べてみたいと思います。
0769nobodyさん2008/10/24(金) 16:55:38ID:???
>>768
大変失礼した。>>767の"pritn"は"print"のtypoだ。pritnてなんだよ(w)
あと、OSちゃんと書いてたの見落としてた。ごめん。

で、なにも表示されないってことだけど、それはおかしいと思う。
(モジュールが入ってなければなんらかのエラーが出るはず。bashからなら囲いの""を’’にしてみて)

Deb系のことは詳しく知らないからあくまでも参考だけど、RHEL系の場合/usr/lib/perl5 以下に、
5.8.8とかsite_perl、vendor_perlみたいなディレクトリがいくつかあって、例えばrpmから入れたらvendorに入るけど、
tarから手動でmakeとかするとsite_perlに入ったりする。(モジュールによって違う)
07707632008/10/24(金) 20:41:34ID:???
>>769
フォローありがとうございます。
SSHクライアントの表示がおかしかったようです。
実行結果をリダイレクトしてviで覗いたら
0.20と記録されていました。

で、途中報告です。
実は動かそうとしているスクリプトは
後出しで申し訳ないのですがほかのサーバで動作していた
Movable Type関係のスクリプトなのです。
で、Movable Type内にもPerlのライブラリがあるらしく
そちらとバッティングしている可能性が大きくなってきました。

今回Debianに移行評価テストをしているのですが
ディストリビュートのディレクトリ構成やパーミッションの違いが
影響しているのもあるようです。
引き続き調べてみて、報告したいと思います。
0771nobodyさん2008/10/24(金) 20:50:49ID:???
まず自分自身を評価しろよ
07727632008/10/24(金) 23:18:20ID:???
結果報告です。

途中経過に書いた通りなのですが
Movable Type 内にextlibというディレクトリがあり
その中にFile::Tempの0.12がインストールされていました。

動作させようとしていたスクリプトが
Movable Typeで提供しているライブラリを優先させて
インクルードさせていたために
CPANでインストールしても有効にならないということでした。

で、Movable Type内のFile::Tempをリネームして
スクリプトを実行したところバージョンチェックに引っかかりませんでした。

ただその後jcode.pmの実行中にたくさんのエラーを吐いて
処理が止まっていました。
これ以上深追いしても私の手で解決するには時間がかかると判断し
今回の評価作業は打ち切りました。

ただ今回初めてPerlでの作業を行って勉強になりました。
コメントしてくだった方に感謝します。
0773nobodyさん2008/11/11(火) 14:43:56ID:???
test.cgi?page=1 にアクセスすると
<html><body>1</body></html>
と表示され、test.cgi?page=2 だと
<html><body>2</body></html>
…というふうに数字が増えていき、これをpage=10までやる。

という場合どうしたらいいですか?
0774nobodyさん2008/11/11(火) 15:10:13ID:???
printf(<<HTML, ($ENV{QUERY_STRING}=~/(\d+)/)[0]+1);
Content-type: text/html

<html><body>%d</body></html>
HTML
07757732008/11/11(火) 16:08:15ID:???
>>774
ありがとうございます。エラーになってしまって表示されません…。
値の設定とかが必要なのでしょうか?
0776nobodyさん2008/11/11(火) 16:21:08ID:???
10まで、とか条件抜けてるけど、エラーにはならんぞ。
先頭の #!/path/・・・/perl とか、パーミッションとかは問題ないな?
07777732008/11/11(火) 16:49:28ID:???
print "Content-type: text/html\n\n<html><body>%d</body></html>"
で%dと表示されるので環境に問題はないと思うのですが…。

先頭の#!/path/・・・/perl の次の行から>>774を貼り付けてtest.cgiで保存し
ブラウザでアクセスしているのですが、何か根本的に間違えていますか?
0778nobodyさん2008/11/11(火) 16:52:57ID:???
そこまでやってて環境とエラー内容を書かないのはなんでだ
まあ普通は CGI.pm 使うとこからやった方がいいが。
07797732008/11/11(火) 17:15:43ID:???
すみません、動きました!
文末にスペースが入っちゃってました。
ありがとうございます!
0780nobodyさん2008/11/14(金) 01:53:06ID:???
既存のCGIを少し変えて、件数ごとのページ送りができるようにしたいと思っています。
送り方は何でもいいのですが、例えばこんな感じで↓

$hyouji=表示件数
$cnt = 0;
for (@logdat) {
$cnt++;
next if ($cnt < $pageno + 1);
next if ($cnt > $pageno + $hyouji);
print "$logdat[$cnt-1]<hr>";
}
print "<form action=\"$script\" method=\"post\">\n";
$next = $pageno + $hyouji;
$back = $pageno - $hyouji;
if ($next < $cnt) {
print "<input type=\"submit\" name=\"page=$next\" value=\"次の$hyouji件\">\n";
}

ただ、元のCGIに以下のような記述があり、どうすればこれを保持したまま上のボタンが
機能するようになるのかがわかりません。

my($cl)=$ENV{'CONTENT_LENGTH'};
read(STDIN, $a, $cl);
foreach (split(/&/, $a)){
($arg, $val)=split(/=/, $_);
$val =~ s/\+/ /g;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
}
undef $a;

どうかご教授ください…
0781nobodyさん2008/11/14(金) 02:08:39ID:???
http://www.google.com/search?q=%E3%81%94%E6%95%99%E6%8E%88
0782nobodyさん2008/11/14(金) 02:18:37ID:???
ご教示ください…
0783nobodyさん2008/11/14(金) 02:45:52ID:???
…はうざキモイ
0784nobodyさん2008/11/14(金) 02:53:52ID:???
ご教示ください!
■ このスレッドは過去ログ倉庫に格納されています