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

このエントリーをはてなブックマークに追加
952904:2007/05/24(木) 02:43:26 ID:???
Σ(@@;;;;;
大文字と小文字か・・・っ!!

ありがとうございました(><)
953861:2007/05/24(木) 10:14:27 ID:hyRyij45
前回ありがとうございました
こんどは別の物で行き詰まりました。
1:CGIからファイルを製作するときに付けたファイル名(フォー
ムから環境変数を利用して送信)がすでにあるファイルと重複し
ていた場合の処理。以下ソース
#!/usr/bin/perl

$dir = "環境変数からファイル名を取得した値";

opendir(DIR , '.');
@view = readdir(DIR);
$xx = pop @view;
while ($xx = 0) {
if ($xx =~ /$dir/) {
print "すでにディレクトリが存在します";
}
$xx = pop @view;
}
print "elrr end"

2:もし$xxが0にならなかったら怖いので実行できない
954nobodyさん:2007/05/24(木) 11:21:06 ID:???
いちいち他人に聞かなきゃできないんだったら
やめちまえ
955nobodyさん:2007/05/24(木) 11:43:03 ID:???
-e とかつかえよ
で、ここは宿題を教えてもらう場所じゃないからな
956861:2007/05/24(木) 11:51:00 ID:hyRyij45
申し訳ありませんでした。
製作環境を先に作ることにします。
ウインドウズ用のパールが借りているサーバーと一部互換性がなくうまくいき
ませんでした、やはりリナックスを買うべきでしょうか><


957nobodyさん:2007/05/24(木) 11:53:09 ID:???
日本語でおk
958nobodyさん:2007/05/24(木) 12:30:25 ID:???
>>948

>>620-623 を嫁
959nobodyさん:2007/05/24(木) 12:30:41 ID:???
>>953
それ常に0ですからwってか改造スレ行ってください。

>>948
自分で頑張るのはいい事だと思うけど頑張る方向まちがった感が…
張られたソースと数レス前みれば解決しそうな内容なのにな

960906:2007/05/24(木) 15:10:45 ID:uINrQbUQ
みなさんのアドバイス参考にさせていただき 以下のようにしました
ムチャクチャなのは承知なので勘弁してください(自分のPC上で動作させます)
ホントに知識がないのに急遽必要になったものですから・・・
けどなんとかあと一歩まで来ました

$|=1;
open(QQ,"base.txt");
$base = <QQ>;
close(QQ);
$base++;
open(QQ,">base.txt");
print QQ "$base";
close(QQ);

use Tie::File;
tie @array, 'Tie::File', "data.txt" or die;
$line = $array[$base-1];
untie @array;

最難関は最終行に行き着いたときに1行目に戻る方法!
ほぼ徹夜でやって未だ成功しておりません.....
961nobodyさん:2007/05/24(木) 15:45:15 ID:???
while(1) {
}

で囲めばよくね?
962nobodyさん:2007/05/24(木) 15:51:49 ID:???
もはやどこまで本気なのか。。 $#array とだけ書いておこう。
963nobodyさん:2007/05/24(木) 16:14:37 ID:???
てか tell/seek を使ったほうがメモリの節約にもなるだろう・・・
もう無視でいいんじゃね?
人の話聞かないんじゃアドバイスするほうも惨めだわ
964906:2007/05/24(木) 17:06:14 ID:???
>>961
助かりました!
私の場合ブラウザの「更新」を押す度にdata.txt内の次の数字が
表示されるようにしたかったのですが「while」のヒントをいただいて
調べていると「if」が使えることに気付きました

>>962
$#arrayは何か使いやすい重要なヒントなんだと思います
しかし検索すると「$#」の部分が無視されてうまく検索できません
コレを使うともっともっと改良の余地があるのでしょうね・・・

>>963
すみません。。
tell seekについては調べたのですが「xxxバイト先を指定する」とからしく
xxx行目を指定する場合に私の知識では上手く使いこなせず断念してしまいました
気分を害してしまい申し訳ないです・・・


以下が完成したものです
これで更新を押す度にdata.txt内の次の行が表示され,最終行に行くと
1行目に戻っているようです
なんか表示までが多少モッサリした気がしますが・・・
965906:2007/05/24(木) 17:07:31 ID:???
(続き)
なにかもし「ここはいくら何でもこうした方がよい」的なアドバイスがあれば
宜しくお願いいたします

#!/usr/local/bin/perl

$|=1;
open(QQ,"base.txt");
$base = <QQ>;
close(QQ);

use Tie::File;
tie @array, 'Tie::File', "data.txt" or die;

if ( $array[$base-1] =~ /[0-9]+/ ) {
$line = $array[$base-1];
$base++;
open(QQ,">base.txt");
print QQ "$base";
} else {
$line = $array[0];
open(QQ,">base.txt");
print QQ '2';
}

close(QQ);
untie @array;

print <<"_HTML_";
Content-type: text/html

以下略
966nobodyさん:2007/05/24(木) 18:14:03 ID:???
>>906
>>893>>921はみてるんだろうか?
967nobodyさん:2007/05/24(木) 18:16:18 ID:???
data.txtがまったく変更されないか、後ろに付け足すのみならば、
どこまで読んだかを行数ではなくファイルの先頭からのバイト数で
管理することができる。そうすればseekが使えて、これはいちいち
ファイルを読み出して行数数えなくてもいいので効率的。

途中の変更があったりするんならあきらめて頭から読むしかないが、
それはいかにも効率が悪いのでそもそもデータの持ち方から普通は
考え直すね。
968nobodyさん:2007/05/24(木) 22:39:15 ID:???
同時アクセスあった場合どうなるの?
ロックとかもしないとね。うん。
969nobodyさん:2007/05/24(木) 22:53:09 ID:???
めんどくさいからDB使えよ
970nobodyさん:2007/05/24(木) 23:45:29 ID:???
今度はリファクタリングか。
完成品渡すまで帰らないんじゃないか。
971nobodyさん:2007/05/25(金) 17:41:48 ID:???
外見(css, 独自項目など)をカスタマイズ可能なカレンダーを生成(HTML)するような
フレームワークなりなんなりのモジュールってないですかね?
972nobodyさん:2007/05/25(金) 18:41:39 ID:???
973nobodyさん:2007/05/26(土) 02:02:39 ID:???
まだ、やってたのか…。↓やるから、この話は終わり。

use CGI;
my $q=CGI->new(); open(FILE,'<','./data.txt'); my @file=<FILE>; close(FILE);
my ($p,$s,$e)=($q->param('p'),$q->param('s')?1:0,$ENV{'SCRIPT_NAME'});
$p=$p=~/^\d*$/?$p<=$#file?$p:0:0; print $q->header(-charset=>'Shift_JIS'),
$q->start_html(-lang=>'ja',-encoding=>'Shift_JIS',-title=>'',
-head=>$q->param('m')ne's'?$q->meta({-http_equiv=>'refresh',
-content=>sprintf("5;URL=$e?p=%d",$p+1)}):''),$p==0?'前':$q->a({href=>sprintf(
"$e?p=%d%s",$p-1,$s?'&s=1':'')},"前"),' / ',$q->a({href=>sprintf("$e?p=$p%s",$s?'':'&s=1')},
$s?'再生':'停止'),' / ',$p>=$#file?'次':$q->a({href=>sprintf("$e?p=%d%s",$p+1,$s?'&s=1':'')},
"次"),"<hr>$file[$p]",$q->end_html;
974nobodyさん:2007/05/26(土) 02:03:44 ID:???
>>973
あ、ちなみに>>906に対してのレスね。
975nobodyさん:2007/05/26(土) 02:05:58 ID:???
どうせなら 7line にしたらかっこよかったのに
976nobodyさん:2007/05/26(土) 02:17:39 ID:???
動作確認したら、間違ってた(w
ついでに7行にしてみた。
use CGI;my $q=CGI->new();open(FILE,'<','./data.txt');my @file=<FILE>;close(FILE);my ($p,
$s,$e)=($q->param('p'),$q->param('s')?1:0,$ENV{'SCRIPT_NAME'});$p=$p=~/^\d*$/?$p<=$#file?
$p:0:0;print $q->header(-charset=>'Shift_JIS'),$q->start_html(-lang=>'ja',-encoding=>
'Shift_JIS',-title=>'',-head=>$s?'':$q->meta({-http_equiv=>'refresh',-content=>sprintf(
"5;URL=$e?p=%d",$p+1)})),$p==0?'前':$q->a({href=>sprintf("$e?p=%d%s",$p-1,$s?'&s=1':'')},
'前'),'/',$q->a({href=>sprintf("$e?p=$p%s",$s?'':'&s=1')},$s?'再生':'停止'),'/',$p>=$#file?
'次':$q->a({href=>sprintf("$e?p=%d%s",$p+1,$s?'&s=1':'')},'次'),"<hr>$file[$p]",$q->end_html;
977nobodyさん:2007/05/26(土) 02:20:21 ID:???
$p==0?なんたら:かんたら
って
$p?かんたら:なんたら
にならない?
978nobodyさん:2007/05/26(土) 02:35:14 ID:???
>>977
なるね。…ていうか勢いで書いて>>973を上げた時点で動作確認すら
してなかったので、細かいツッコミは、かんべんしてくださいな(^_^A
979nobodyさん:2007/05/26(土) 02:40:03 ID:???
いやいや1行は78文字ですからw
980nobodyさん:2007/05/28(月) 09:50:25 ID:???
>>976
数万行のファイルをそのままメモリですか、そうですか
981nobodyさん:2007/05/28(月) 10:24:47 ID:???
亀レスな上にひどい内容www
半年ROMってろ
982nobodyさん:2007/05/28(月) 12:09:53 ID:???
相手するなよ。
983nobodyさん:2007/05/28(月) 17:39:54 ID:???
空気読まずに>>906のお馬鹿さんにプレゼント
・一気読みするよりはましだけど>>921よりタコ
・$nextを保存するなり次のCGI呼び出しの引数に使う
use IO::File;
# 例: ($value,$next) = get_line($file,$line);
sub get_line{
my($c,$f) = (0,IO::File->new($_[0]));
$c++ == $_[1] && return ($_,$c) while <$f>;
return get_line($_[0],$_[1]-$c);
}
984nobodyさん:2007/05/28(月) 18:41:47 ID:???
■やりたいこと
30個あるデータを6セルずつのテーブルに入れたい。
■考えたこと
tdタグを出す度に変数Xに1足していき、セルの数に達したら変数Xを初期化すればOKじゃまいか。
■処理結果
一番最後の段になると全部は吐き出されない。なぜこうなるのでしょうか。

■書いたコード(Perl)
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print <<"EOM";
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
</head>
<body><center><table border="1"><tr>
EOM

$flag=0;
for ($xx = 1; $xx <= 30; $xx++) {

 if($flag eq 6){
  $flag=0;
  print "</tr><tr>";#ここが認識されてない?
 }else{
  $flag= $flag+1;
  print "<td>$flag</td>";
 }
}
print "</table>";
985nobodyさん:2007/05/28(月) 18:51:03 ID:???
print "<td>$flag</td>";

print "<td>$xx</td>";

でやってみ
986984:2007/05/28(月) 19:07:25 ID:???
>>985
やってみました。
・・・アホでした・・・orz
 if($flag eq 6){
  $flag=0;
  print "</tr><tr>";#ここが認識されてない?
     ~~~~~~~~~~~<td>〜書いてないから、ですね。
ヒントどうもありがとうございました。
987nobodyさん:2007/05/29(火) 13:03:16 ID:???
>>984
それ、最後が「</tr><tr></table>」にならないか?
988nobodyさん:2007/05/29(火) 13:25:03 ID:???
ならない。最後のtrが抜けるので最終行をprint "</tr>\n</table>\n";にしないといけない。
989nobodyさん:2007/05/30(水) 01:25:04 ID:???
print "Content-Type: text/plain\n\n";
while(1){
my $buf,$total;
my $len=read(STDIN,$buf,100);
print $len.('x'x100)."\n";
$total+=$len;
last if $total >= $ENV{'CONTENT_LENGTH'};
}

みたいにSTDINのreadとSTDOUTへのprintを交互にやるようなCGIに
100MBちかくあるmultipart/form-dataを読ませると途中で
ストップしてしまうことがあるみたいですが、同じ症状に出くわした人とかいますか?
990nobodyさん:2007/05/30(水) 01:32:18 ID:???
タイムアウトやんw
991nobodyさん:2007/05/30(水) 01:43:53 ID:???
それがサーバ側のプロセスは死んでなくて何かreadで待ってるっぽいし、
ブラウザもタイムアウトしないしどうなってるのかなと…。
992nobodyさん:2007/05/30(水) 06:26:25 ID:???
しっかし平然とwhile(1)するな。信じがたい。
993nobodyさん:2007/05/30(水) 09:06:59 ID:???
>>988
???
だから、最終行を「print "</tr></table>"」にしないと
結果の最後が「</tr><tr></table>」になるって事だろ?
>>997の言ってる意味わかってんの?
994nobodyさん:2007/05/30(水) 09:34:17 ID:???
>>993
やってみれば?
995nobodyさん:2007/05/30(水) 09:48:23 ID:???
0〜6は要素数7ですよ
だから割り算があってないの
算数からやり直してください
996nobodyさん:2007/05/30(水) 10:15:46 ID:???
正直俺にも>>997の言っている意味は判らん。
997nobodyさん:2007/05/30(水) 10:18:16 ID:???
>>219についてですが、削除に値しない場合は理由を教えてください。
「声優のウンコを食べる」
は7.エロ・下品の削除対象に適応できて、
「声優の子宮に住み羊水を飲む」
には適応されない理由を教えてください。我儘言ってすみません。
998nobodyさん:2007/05/30(水) 10:33:06 ID:???
スレ違い
板違い
気違い
999nobodyさん:2007/05/30(水) 11:15:48 ID:???
次スレは任せた
1000nobodyさん:2007/05/30(水) 11:34:32 ID:???
Perlコーディング初心者質問スレ Part 55
http://pc11.2ch.net/test/read.cgi/tech/1180492034/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。