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

Perlコーディング初心者質問スレ Part 45

■ このスレッドは過去ログ倉庫に格納されています
00019882005/12/08(木) 22:48:27ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0313ヽ(´ー`)ノ ◆.ogCuANUcE 2006/01/03(火) 15:36:00ID:???
>>312
foreach my $it (@$Defs) {
    # 各要素は $it でアクセス
}

もしくは、

for (my $i = 0 ; $i < @$Defs ; ++$i) {
    # 各要素は $Defs->[$i] でアクセス
}
0314nobodyさん2006/01/03(火) 18:10:35ID:6LWi5P1T
時刻表示を作ってみたんですが。
どうみてもソースが汚いです。
use strict;なスクリプトに修正してもらえませんか?
サブルーチン初めてなので間違いが多いと思うのでアドバイスお願いします


#!/usr/bin/perl

my $time = &Get_Time;
print "content-type: text/html\n\n";
print "$time\n";

exit;

sub Get_Time{
 my $times = time();
 my($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times);
 my @week = ('日','月','火','水','木','金','土');
 my $time = sprintf("%04d\/%02d\/%02d\(%s\)%s%02d\:%02d:%02d",$year+1900,my $mon+1,$mday,$week[$wday],my $aft,$hour,$min,$sec);
 return $time;
}
0315nobodyさん2006/01/03(火) 18:27:27ID:???
なってるじゃん
0316nobodyさん2006/01/03(火) 18:32:22ID:???
>>314
別に悪くないと思うが。そこからどうシェイプするかは個人のスタイルの問題だし。
03173142006/01/03(火) 18:37:03ID:???
>>315
このままで良いという事ですか?
( ゚Д゚ )

それじゃあもうひとつだけお願いします。
サンプルから引き抜いた部分が多いので、$monと$aftの意味が良く分からないのですが、
表示に影響もないみたいなので、削除しても大丈夫なんでしょうか?
0318nobodyさん2006/01/03(火) 18:40:34ID:QwphIqM2
test
0319nobodyさん2006/01/03(火) 18:42:12ID:???
>>316
あ、ちょっと待った。機能的な部分まで見てなかったw
$monは$monthのつもりで間違ってるんだろうし(今は0+1月だから問題ないように見えるが)
$aftは何したいのか良くわからんし。自分で流れをよく追ってごらん。
03203142006/01/03(火) 18:48:13ID:???
>>319
見逃してた訳ではなかったんですが、おかげさまで理解できました。
ありがとうございました。
他にも見つかったらレスお願いします
0321nobodyさん2006/01/03(火) 18:51:20ID:???
>>314
つかコピペするんじゃなくて、サンプル見ながら「理解しつつ」自分で打ち込まなきゃ身につかないよ。
03223122006/01/03(火) 21:22:10ID:lh2VfF1u
>>313
> foreach my $it (@$Defs) {
> # 各要素は $it でアクセス
> }

これが美しいですね。 ありがとうございました!

0323nobodyさん2006/01/04(水) 01:16:22ID:???
ある文書内に特定のフォーマットにて書かれた文章を取り出す方法を探しています。
例えば
sample.txt内に
aaa=000
bbb=111
ccc=222

aaa=333
bbb=444
ccc=555
というフォーマットで10個くらい書かれている中から
例えば
aaa=000
bbb=111
ccc=222
なら$aaaに000を格納したいんですが、どうすればいいでしょうか?
教えてください。お願いします。
0324nobodyさん2006/01/04(水) 01:25:44ID:???
>>323
>>1

依頼されたツールを誰かが作るスレ
http://pc8.2ch.net/test/read.cgi/php/1078997682/

Perlでリクに答えるスクリプトを作るスレ
http://pc8.2ch.net/test/read.cgi/tech/1086143976/

■こんなCGI作ってください■ Part.2
http://pc8.2ch.net/test/read.cgi/php/1133361560/
0325nobodyさん2006/01/04(水) 02:29:09ID:???
>>323
誘導するほどの話でもないなー。
1.「=」でsplit使って分ける(仮に$leftと$right)
2.$right を ${$left} に代入する

コーディングについてはPerlの本一冊読めば理解できる話だからしない。
0326nobodyさん2006/01/04(水) 02:33:45ID:???
たいていの場合は$aaaに入れるより適当なハッシュを用意して
$hash{aaa}に入れた方がいいと思うけどな。
03273052006/01/04(水) 03:10:14ID:???
>>308-309
いつの間にやらレスが…
すみません、ありがとうございました。

質問したソースのcgiは、とりあえず意地でも正月休み中に動かしたかったので、突貫で作ってしまいました。。
ttp://homepage2.nifty.com/bel_s/webtag/
ソースというかソースはもちろん構造もかなりぐちゃぐちゃです。。
突っ込みどころだらけというかめちゃくちゃだと思いますが何かありましたら突っ込みお願いします。。直すこと前提でとりあえず動かしました。
結局構造改革は大変そうだったのでやめました。自前で作ったfile.pmから作り直しになってしまいそうだったので…。

>>308
全然思いつきもしませんでした。。
使い方によってはだいぶ効率がかわりそうですね。。
verupにむけて参考にさせていただきますm(_ _)m

>>309
チラシの裏ですが今回コンセプトとして「勉強」「設置が楽/場所を選ばない」ってのがありまして、
ライブラリは全部自分で作ってひとつに纏めてしまいました。
03283052006/01/04(水) 03:14:20ID:???
>>327
すみません、「突っ込んでね」ではなく、
暇な方や人のソース眺めるのが好きな方いましたら、気が向いたらお願いします程度の意味です。
なんか変な暗黙の行間ができちゃったような気がするので補足。
今日仕事なのになにやってんだおれー
0329nobodyさん2006/01/04(水) 07:38:24ID:???
>>323

sub read_ini {
 open (INI, shift);
 flock (INI, 1);
 my @ini = <INI>;
 close INI;
 my %INI;
 foreach (@ini) {
  chomp $_;
  if ($_ =~ /^\#|^[(.+)]$|^\/\/|^\[(.+)\]$/ || $_ eq "" || index ($_, "=") < 0) {
   next;
  }
  my $key = substr ($_, 0, index ($_, "="));
  my $value = substr ($_, index ($_, "=") + 1, length ($_));
  if ($key ne "") {
   $INI{"$key"} = $value;
  }
 }
 return %INI;
}
%INI = &read_ini ("test.ini");
foreach (sort keys %INI) {
 print $_ . "\n    " . $INI{"$_"} . "\n";
}

こんなのダメっすか
0330nobodyさん2006/01/04(水) 07:40:11ID:???
インデントが酷くなったorz

sub read_ini {
    open (INI, shift);
    flock (INI, 1);
    my @ini = <INI>;
    close INI;
    my %INI;
    foreach (@ini) {
        chomp $_;
        if ($_ =~ /^\#|^[(.+)]$|^\/\/|^\[(.+)\]$/ || $_ eq "" || index ($_, "=") < 0) {
            next;
        }
        my $key = substr ($_, 0, index ($_, "="));
        my $value = substr ($_, index ($_, "=") + 1, length ($_));
        if ($key ne "") {
            $INI{"$key"} = $value;
        }
    }
    return %INI;
}
%INI = &read_ini ("test.ini");
foreach (sort keys %INI) {
    print $_ . "\n    " . $INI{"$_"} . "\n";
}

0331nobodyさん2006/01/04(水) 09:42:46ID:???
split 使えばいいのに。
0332nobodyさん2006/01/04(水) 11:56:31ID:???
このスレは回答者も初心者なんですね
0333nobodyさん2006/01/04(水) 12:24:17ID:???
>>332
ヒント: WebProg 板
0334nobodyさん2006/01/04(水) 12:42:50ID:???
なんか YukiWiki にそれっぽいルーチンがあったぞ。

sub get_info {
my ($page, $key) = @_;
my %info = map { split(/=/, $_, 2) } split(/\n/, $infobase{$page});
return $info{$key};
}
0335nobodyさん2006/01/04(水) 13:57:55ID:???
>>333
今時ヒントなんて使ってるやつはばかです。
0336nobodyさん2006/01/04(水) 14:00:43ID:???
>>324-325で答えが出たと思ってた
use FileHandle;
use Data::Dumper;

my $fh = FileHandle->new("sample.txt") or die;
flock($fh, 1);
chomp(my @lines = $fh->getlines());
$fh->close();

my @ini_set;
my $temp = {};
foreach my $line (@lines, ''){
if ($line){
my ($key, $value) = split(/=/, $line, 2);
$temp->{$key} ||= $value;
} else {
keys(%{$temp}) and push(@ini_set, $temp);
$temp = {};
}
}

print Dumper(\@ini_set);

こんな感じでどうなん。
0337nobodyさん2006/01/04(水) 14:34:56ID:???
#!/usr/local/bin/perl -w
use strict;
my $format = qr/^\s*([^=]+)\s*=\s*(.*)$/;

my $file = $ARGV[0] || './sample.txt';
-f $file || die "No such file.\n";
open FH, '<' . $file or die $!;

# local $/ = ''; # 段落モード
# while (<FH>) {
#  my %data = /$format/gm; # 空行が Record Separator
#  print map("$_:[$data{$_}]\n", sort keys %data), "---------\n";
# }

while (<FH>) {
  /$format/ || next; # フォーマットに合わない行が Record Separator
  my %data;
  do { $data{$1} = $2 } while <FH> =~ //; # 改行が Field Separator
  print map("$_:[$data{$_}]\n", sort keys %data), "---------\n";
}
__END__

参考: http://search.cpan.org/modlist/Option_Parameter_Config_Processing
0338nobodyさん2006/01/04(水) 16:22:38ID:PpH7t0Dm
キーワードから関連するトラックバックURLやらpingurlを収集する
プログラムってないかな?
0339nobodyさん2006/01/04(水) 17:47:39ID:???
>>338
>>324
【CGI】こんなCGI探してますver.19
http://pc8.2ch.net/test/read.cgi/hp/1134255607/
03403232006/01/04(水) 19:59:55ID:???
たくさんの回答ありがとうございます。
すべて試してみて一番わかりやすいのを参考にさせていただきます。
本当にありがとうございました。
0341nobodyさん2006/01/05(木) 04:32:22ID:+yKIo2wf
CGI&Perlポケットリファレンスを見ながらスクリプトを書いています。
この本を見てて、cryptの暗号化のキー(第2引数ですかね?)は、2文字異常渡しても無視されますと書いてありました。
僕が、今手にして自分で解読してみてるスクリプトに以下のようなものがあったんですけど、(出所はちょっと忘れてしまいました)

$time=crypt($time,int(rand 100));


第2引数が100になることもあるということは、3文字だから無視されますよね?
これって、

$time=crypt($time,int(rand 99));

に書き換えた方がいいんですか?
0342nobodyさん2006/01/05(木) 09:52:45ID:???
>>341
>>162-辺りで出ているがrand 100は0以上100"未満"なのでint(rand 100)が100を取る事は無い。
しかし整数そのまま放りこむのはsaltの強度が落ちるからあまり良いとは言えないなぁ

因みにニ文字以上が切り捨てられるという仕様は暗号化した物の頭ニ文字はsaltなのでこうやって使う
$crypted eq crypt($pass, $crypted)
0343nobodyさん2006/01/05(木) 10:00:36ID:???
>>341
あ、無視の意味を勘違いしているようなので補足
無視されるのは余分な部分であって全体じゃないよ
abcdef -> a
100 -> 10
0344nobodyさん2006/01/05(木) 10:02:43ID:???
Digest::SHA使え。
0345nobodyさん2006/01/05(木) 10:23:19ID:???
>>344
それもSHA1じゃそろそろ怪しくなってきたね
今作るならSHA256か
0346nobodyさん2006/01/05(木) 17:26:03ID:+yKIo2wf
>>343
レス感謝!

でも
abcdef -> a
の部分は

abcdef -> ab

じゃないの?2文字でしょ?
文字の場合は1字とかじゃないよね?
0347nobodyさん2006/01/05(木) 17:45:03ID:???
>>346
ごめん
abcdef -> ab
が正解。いつの間にか消えてしまった
0348nobodyさん2006/01/05(木) 18:23:39ID:+yKIo2wf
>>347
うおぉおぉおぉおおぉぉ!!
自分でちゃんと理解してたーーー!!
ウレシーーーー!!
マジで嬉しい!
>>347さん、本当にありがとうね!
あなたのお陰で、また1つ理解できました。

この感動を今の俺みたいな人に分けてあげたい。
頑張ろっと。
0349nobodyさん2006/01/05(木) 21:27:34ID:???
> この感動を今の俺みたいな人に分けてあげたい。
> 頑張ろっと。

今時 Perl ができる人間なんて、腐る程いますよ。
0350nobodyさん2006/01/05(木) 21:34:34ID:???
ここのスレタイの17バイト目から22バイト目までを音読しれ
0351nobodyさん2006/01/05(木) 23:39:25ID:+yKIo2wf
>>349
その腐った人の中に入りたいです!

>>350
初心者。。。?
んー、ごめん。
どういう意味だったのか分からなかったんだけど^^;
0352nobodyさん2006/01/05(木) 23:56:20ID:???
>>351
多分>>350は>>349宛。君は天然か。
0353nobodyさん2006/01/06(金) 00:41:22ID:???
たまによくわからん流れになるな
0354nobodyさん2006/01/06(金) 02:51:26ID:???
DBIでPostgresqlを使ってるのですが、DBから取得したデータに一括して
utf8フラグつける方法ってあるでしょうか。

http://www.kt.rim.or.jp/~kbk/perl-5.8/perlunicode585.html

上記サイトにFetch関数というラッパーが紹介されてましたが、2002年の記事なので
現在はもっとスマートな方法があるのでしょうか。
0355nobodyさん2006/01/06(金) 03:28:04ID:???
>>354
DBIのドキュメントに書いてあったと思われ
0356nobodyさん2006/01/06(金) 04:00:45ID:iupFgDGk
>>352
すみません^^;
出来る人間にと書けば良かったです!
ご指摘ありがとう!

ここの人たちは優しい人が多いんですね!
ここの住人になりたいです!
0357nobodyさん2006/01/06(金) 04:50:15ID:???
>>355
ありがとうございます。できたっぽいです。2日ググり続けました。
DBI->connectのオプションでpg_enable_utf8=>1で自動的にフラグがたつようです。
DBIのドキュメントにも見つけられなく、海外のどこの馬の骨とも分からない人の
ソースからパクッてきただけなので詳細はよく分かりません。詳しいサイトご存知
でしたら教えてください。
0358nobodyさん2006/01/06(金) 05:35:08ID:???
pg_enable_utf8で検索したの?
0359nobodyさん2006/01/06(金) 05:51:05ID:???
>>357
http://search.cpan.org/~dbdpg/DBD-Pg-1.43/Pg.pm
DBIのconnectの第四引数はDBDに渡されるのよ
各DBD固有のものはDBIのドキュメントをいくら読んでも載ってません
0360nobodyさん2006/01/06(金) 08:04:41ID:???
ありがとうございます!
This attribute is experimental and may be subject to change.
とのことで、使ってる人も少ないんですね。
0361nobodyさん2006/01/07(土) 00:20:22ID:???
マヌケな質問な気がするのですが…
sysopenのモードを変数で渡すことはできませんか?

use Fcntl;
my @mode = (O_RDWR,O_CREAT);

sysopen(FH,"file",@mode); #1
sysopen(FH,"file",join('|',@mode)); #2

などとやってみたのですがどうにも渡りません。
直接定数を決め打ちしたり、定数のリストを渡すとうまくいくのですが、配列を渡すとなぜかだめなようです。
検索してみても決めうちの例しかでていませんし、
perldoc sysopenというのもないようで詰まってしまいました…。
0362nobodyさん2006/01/07(土) 00:55:19ID:???
>>361
my $mode = O_RDWR | O_CREAT;
0363nobodyさん2006/01/07(土) 00:55:27ID:???
>>361
「|」 はビット演算子のorだ。だから文字列でjoinは見当違い。
O_RDWRとかは定数。試しにprintしてみな。

そんな事も知らずにsysopenをどう使うのか疑問だ。
0364nobodyさん2006/01/07(土) 01:16:56ID:???
>>362,363
できました。どうもありがとう。

|がビット演算子というのを知りませんでした。
なんでこんな不思議な記号で区切るのか疑問でしたが、調べ方もわからなかったので為になりました。
リストで渡すと通ったのもO_RDONLYを使ったせいなようで、
展開されて「0256」になったせいで通ってしまったようです。

sysopenを使うのも、ただどこかのサイトで
「入出力を行うだけならばopenよりも安全だ」
というので盲目的に使ってしまっただけで深い意味はありません…。
0365nobodyさん2006/01/07(土) 03:12:37ID:???
ActivePerl5.8.7を使用しています。

Net::FTPを使用して、多数のファイルをアップロードするスクリプトを作りました。
255個目のファイルまでは正常にアップロードできるのですが
256個目のファイルをアップロードする所でputがエラーを返し(0を返す)、正常に送れません。。
(FTPソフトを使えば問題なくアップロードできる)
何か心当たりがあれば、よろしくお願いします。

use Net::FTP;
$ftp = Net::FTP -> new($ftp_server);
$ftp -> login($ftp_id, $ftp_pass);
foreach (@filelist) {
  $ftp -> put($_);
}
$ftp -> quit;
03663562006/01/07(土) 03:25:30ID:hRPnI9VA
ここの住人になりたいなと思うので
コテハンにしようかなと思います。

何か名前を付けてくれませんか!!
0367nobodyさん2006/01/07(土) 03:27:45ID:???
名無し or 死ね
0368nobodyさん2006/01/07(土) 03:27:55ID:???
>>366
nobodyさん
0369nobodyさん2006/01/07(土) 03:37:32ID:???
>>366
GOTOマスター
0370nobodyさん2006/01/07(土) 03:59:38ID:???
>>366
天然
0371nobodyさん2006/01/07(土) 04:14:13ID:snASfRD4
普通の文章なのに「!」で終らせることの出来る強い心をもっ人間に私はなりたい
03723662006/01/07(土) 04:57:39ID:hRPnI9VA
結構打たれ弱いのかも。。。
ちょっと凹み気味です。

あんましいぢめないで下さい!
0373nobodyさん2006/01/07(土) 05:18:10ID:???
Perlメモ-改行コードを削除する
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Remove

この記事に

>複数の処理系の改行コードを想定しなければならない場合は、
>次のようにして文字列の最後の改行を削除します.

>s/\x0D?\x0A?$//;

とありますが、これを
s/\n$//;
としたらまずいですか?
0374nobodyさん2006/01/07(土) 05:44:52ID:???
>>372
つかコテ名乗って良いことなんか何一つないぞ
0375nobodyさん2006/01/07(土) 05:47:04ID:???
まずいです。
詳しくは2つ上の「改行コードを統一する」
0376nobodyさん2006/01/07(土) 05:47:41ID:???
>>374
あぼーんできる。
0377nobodyさん2006/01/07(土) 12:34:39ID:???
>>365
試してみたが上手く動いたぞ。ちなみに俺の環境は
ftp鯖: CentOS + vsftpd
ActivePerl5.8.7-build813 WindowsXP からアップロードする
ファイル数 512個 ファイル名は 1,2,3,....512で中身も1,2,3,...512
で、512個すべて問題なくうP可能

とりあえず出力がうざいが、
$ftp=Net::FTP->new($ftp_server, Debug => 1);
とでもしてみたらいいんでない?
03783652006/01/07(土) 14:31:54ID:???
>>377
試していただきありがとうごます。
エラー出力を頼りに調べた所、PASVモードを有効にすれば直るかも
http://www.perlmonks.org/?node_id=137654
ということで
$ftp = Net::FTP -> new($SET{'ftp_server'}, Passive => 1);
と変更したところ、256個目以降のファイルも正常にアップロードすることができました。
お手数掛けましたー。
0379nobodyさん2006/01/07(土) 18:44:49ID:???
PerlのCGIでエラーをトラップする方法について教えてください。

エラーと見なされることが発生したら、エラー処理用のサブルーチンに飛んで、
エラーメッセージを表示して終了するようにしています。
その際、dieみたいにどこでエラーが発生したかも表示したいので、
引数でエラー内容と呼び出し元のサブルーチン名を渡しています。

&error('必須項目が未記入', 'submit') if (〜);

sub error {
  my ($msg, $where) = @_;

  print "Content-type: text/html\n\n";
  print "エラーが発生しました。$msg at $where\n";

  exit;
}

こんな感じです。ただ、これだと&errorを書くときにいちいちサブルーチン名を
指定する必要があって、面倒です。
何か良い方法はないでしょうか。それとも何か根本的に考え方が間違ってますか?
0380nobodyさん2006/01/07(土) 19:27:38ID:???
>>379
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI/Carp.pod
0381nobodyさん2006/01/07(土) 20:47:01ID:???
>>379
caller関数。
0382nobodyさん2006/01/07(土) 22:25:59ID:7MUFvifm
htmlファイルを雛形としてそこから全行読み込んで一行ずつ検証し、行内に
<textarea name="comment1" cols="60" rows="10"></textarea>
という文字列が現れたらその文字列を
<textarea name="comment1" cols="60" rows="10">$comment1</textarea>
に置き換えてその行を出力するということを試みています (非該当行はそのまま出力)。
最単純に
$line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|;
とやってみましたが、「name=」を含めてその行のみのそれ以降の部分だけ出力されません (以降の行は出力されます)。
このとおり実行はされますが、エラー ログには「name は予約語となる可能性があります。あるいは、name の前にオペレータが抜けてはいませんか。」と残っています。
確かに、$name や $key などは perl で頻繁に使われる語ですが、上記のスクリプト内では $name を使っていませんし、それを使っているようなモジュールも明示的には使用していません。
また、「name=」自体は HTML のフォームに関する属性なので、これの名前を変更はできません。
ちなみに
$line =~ s|"comment1" cols="60" rows="10"></textarea>|"comment1" cols="60" rows="10">$comment1</textarea>|;
や
$line =~ s|<textarea \x6Eame="comment1" cols="60" rows="10"></textarea>|<textarea \x6Eame="comment1" cols="60" rows="10">$comment1</textarea>|;
もやってみましたが、まったく同じ結果に終わります。
推測するに、置き換え行自体に「name=」が現れたら NG のようです。
また、
if ($line =~ |^(.*)"comment1" cols="60" rows="10"></textarea>(.*)$|) {
$line = $1 . "\"comment1\" cols=\"60\" rows=\"10\">" . $comment1 . "</textarea>" . $2;
}
も NG です。
解決策をお願いします。
0383nobodyさん2006/01/07(土) 22:35:23ID:7MUFvifm
$attr = "name";
としておいて
$line =~ s|<textarea $attr="comment1" cols="60" rows="10"></textarea>|<textarea $attr="comment1" cols="60" rows="10">$comment1</textarea>|;
としても駄目でした。
前投稿のとおり置き換え文字列には name= が入っていなくても駄目なので、結局、最終的にその行自体に name= があるとすべて駄目なようです。
完全に手詰まりです。
0384nobodyさん2006/01/07(土) 22:38:53ID:???
>>382

わからん。周辺のコードも晒せ。
0385 ◆TWARamEjuA NGNG
<textarea name="comment1" cols="60" rows="10">##comment1##</textarea>
こうしておいて、、、
s/##comment1##/$comment1/;
じゃだめなのかなぁ。。。

もしくは%sにしておいて、、、
sprintf $html_temp,$comment1;
とかとか。
0386nobodyさん2006/01/07(土) 22:44:54ID:???
最悪
0387nobodyさん2006/01/07(土) 22:45:28ID:???
日本語のエラーログを吐くの?
0388nobodyさん2006/01/07(土) 23:02:27ID:???
>>382
つかエラーメッセージを意訳するな。そのまま書け。
0389382-3832006/01/07(土) 23:06:50ID:5axJGSRV
>>385
駄目でした。置き換え文字列には含まれなくとも行自体に name= があると駄目なようです。
>>388
そのままです。
あとは、Perl のバージョンやパスが書いてあるだけです。
0390nobodyさん2006/01/07(土) 23:14:21ID:???
エラー行は確かにその正規表現が書いてある行なんだよな?

あと悪いことはいわないから周りのコード晒せ。
見た感じループ内の処理みたいだからそのループ全体を。
0391382-3832006/01/07(土) 23:16:51ID:5axJGSRV
>>384

open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html" . \n\n;
for ($i = 0; $i < @lines; $i++) {
$line = $line[$i];
#以下、前記のとおり
print $line;
}
exit 0;
0392382-3832006/01/07(土) 23:17:57ID:5axJGSRV
× $line[$i]
○ $lines[$i]
0393nobodyさん2006/01/07(土) 23:18:37ID:???
おいコラ
0394382-3832006/01/07(土) 23:27:41ID:5axJGSRV
質問しておいてなんですが、周辺も載せましたが、結果を見るとやっぱり置き換えのところで何か起きているとしか思えないです。
0395nobodyさん2006/01/07(土) 23:29:19ID:7SuLco6K
ふざけてやってるうちはいいけど、
最近真面目にそういうお馬鹿スクリプト書く初心者が増えてきたからねぇ…
0396382-3832006/01/07(土) 23:31:06ID:5axJGSRV
テストなので、雛形 HTML のフォーム入力エレメントは今のところ textarea しかないのですが、input のフィールドも追加して検証してみようと思います。
0397382-3832006/01/07(土) 23:32:39ID:5axJGSRV
どこがおかしいですか。初心者なのでわかりません。
0398nobodyさん2006/01/07(土) 23:34:23ID:???
>>391
「初心者なので」というセリフは大嫌いだが、>>391をそのまま実行すると
print "content-type: text/html" . \n\n; でエラー。当然だがね。
0399382-3832006/01/07(土) 23:35:54ID:5axJGSRV
すみません。

open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html\n\n";
for ($i = 0; $i < @lines; $i++) {
$line = $line[$i];
#以下、前記のとおり
print $line;
}
exit 0;

でも先の問題は解決されません。
0400382-3832006/01/07(土) 23:36:41ID:5axJGSRV
本題の解決策をお願いします。
0401nobodyさん2006/01/07(土) 23:37:43ID:???
>>399
こっちでは再現しないけど。「前記の通り」とかじゃなくてフルに書いてみ?
あとPerlのバージョン含めた実行環境も。
0402382-3832006/01/07(土) 23:41:59ID:5axJGSRV
#!/usr/local/bin/perl

$comment1 = "";
open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html\n\n";
for ($i = 0; $i < @lines; $i++) {
$line = $lines[$i];
$line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|;
print $line;
}
exit 0;

駄目。

#!/usr/local/bin/perl

$comment1 = "test";
open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html\n\n";
for ($i = 0; $i < @lines; $i++) {
$line = $lines[$i];
$line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|;
print $line;
}
exit 0;

これも駄目です。
template.html の内容と印刷結果は載せなくても大丈夫ですか。
0403nobodyさん2006/01/07(土) 23:42:28ID:???
というか何を隠そうとしてるのかしらないけど、「そのまま」ここに張りつけてみな。
そうすれば直ぐに答えがかえってくるんだから。
0404382-3832006/01/07(土) 23:44:11ID:5axJGSRV
Perl バージョン:

これは perl, v5.6.1 built for i386-linux です
0405382-3832006/01/07(土) 23:46:11ID:5axJGSRV
>>403
>>402 に書いたのは全行です。
テストなので、これだけしか書いていません。
これだけしか書かないうちに先の不都合が見つかりました。
もっとも、最終的にやろうとしていることはありますが、それらはまだ書いていません。
この問題の解決が先なので。
0406nobodyさん2006/01/07(土) 23:47:27ID:???
もしや置き換え該当行は下から一行目?
0407382-3832006/01/07(土) 23:48:07ID:5axJGSRV
もう一度そのまま貼り付け。

#!/usr/local/bin/perl

$comment1 = "";
open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html\n\n";
for ($i = 0; $i < @lines; $i++) {
$line = $lines[$i];
$line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|;
print $line;
}
exit 0;
0408nobodyさん2006/01/07(土) 23:48:16ID:???
>>402
前者も後者も正常に実行できている。ソースを見てもスクリプトの問題とは思えない。
エラーの出方から見てえらく特殊な環境で実行しているようにしか思えない。
perlバージョンだけでなく、OSのバージョンも。
0409382-3832006/01/07(土) 23:50:31ID:5axJGSRV
>>406
「雛形の」という意味ですか。
であれば、違います。
雛形で言えば、該当行の下には
</form>
</body>
</html>
などの行もあります。
0410nobodyさん2006/01/07(土) 23:50:41ID:???
つかエラーログって何?
コマンドラインで実行できないの?
0411382-3832006/01/07(土) 23:56:08ID:5axJGSRV
雛形 HTML の内容は要らないですか。
0412nobodyさん2006/01/07(土) 23:57:20ID:???
>>411
貼りたきゃ勝手に貼れ。それより>>408の質問に答えろ。
■ このスレッドは過去ログ倉庫に格納されています