【Perl】初心者コーナー Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/20 22:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0357nobodyさん
02/12/11 13:21ID:mexeU5Q0しても
timelocalが使えません。
助けてください。
0358nobodyさん
02/12/11 13:25ID:???実はPerl4ってことはないか?(w
ところでどう使えないんだ?エラーが出るのか?値が不正なのか?
良ければここにソースを書いてみれ。
0359nobodyさん
02/12/11 13:25ID:mexeU5Q0のことは忘れてください。。。
0360nobodyさん
02/12/11 14:40ID:???Firebirdかなんか知らんが、つまりはDBIだしょ?
$sqlResult = $statement->execute();
で、処理した件数が返ってくるはずだが・・・
0361nobodyさん
02/12/11 15:55ID:3BdsDO3lコマンド「chmod」の代わりになるコマンドってあるんですか?
もしあるのであれば教えてください。
もしくは
$ImgFile = "$ImgDir$no$tail";
if (!open(OUT,"> $ImgFile")) {
if ($clip_err) { &error("画像のアップロードに失敗しました"); }
}
binmode(OUT);
binmode(STDOUT);
print OUT $upfile;
close(OUT);
chmod (0666,$ImgFile);
この部分をchmodを使わずに構成する事はできませんか?
>>1で指定された書き方が出来そうにないのでこういう形でお聞きします。
どなたかお願いします。
0362nobodyさん
02/12/11 16:10ID:???open(OUT, "> $ImgFile")より上に umask 0;
0363nobodyさん
02/12/11 16:22ID:IDueDvlEいえ、Perl4なんてことはないっす。w
前はActivePerl5.6.1ビルド633でGDBM_FileをPPMインスコした記憶があって、
今回ActivePerl5.8.0ビルド804にする際以前の5.6.1ビルド633は綺麗さっぱり
DISKから消してしまったんです。GDBM_Fileは後からインスコすればいいという
考えで。
そしていざGDBM_Fileのインスコしようと思ったら、Perl5.6用しか見つからなくってお口あんぐり状態な訳です。
エラーは
Can't locate GDBM_File.pm in @INC (@INC contains: C:/perl/lib C:/perl/site/lib .) at (eval 1) line 2. BEGIN failed--compilation aborted at (eval 1) line 2.
と、漏れのマシンにGDBM_Fileが装備されてないって出ます。
ソースの抜粋は。。。自分が作ったスクリプトじゃない配布物なんで、カキコするのもちと・・・。
動作は電話帳データベースのようなもので、電話番号を入力すれば住所が分るといったものと同等です。
暫く待てばPerl5.8(Windows)用のGDBM_Fileが出てくるのかな?
0364nobodyさん
02/12/11 16:44ID:???chmodの行を削って
open(OUT, "> $ImgFile")より上に umask 0;
という事でよろしいですか?
ありがとうございました。
0365nobodyさん
02/12/11 17:50ID:???require './jcode.pl'; # jcode.plのパス
をしてjcode.plを呼んでるんですけど、コマンドラインで
「C:\>perl "C:\Documents and Settings\***\デスクトップ\unko.cgi"」
を実行すると、
「Can't locate ./jcode.pl at C:\Documents and Settings\***\デスクトップ\unko.cgi line 17.」
と出てしまいます。
(webだとエラーになりません。ローカルではデスクトップでスクリプトを実行しています。)
なぜでしょうか。
0366nobodyさん
02/12/11 18:14ID:???require '.\jcode.pl';
0367nobodyさん
02/12/11 19:35ID:???カレントディレクトリに jcode.pl がないんでしょ。
そのコマンドラインだと、カレントは C:\ で、スクリプトのある場所と違ってるし。
0369nobodyさん
02/12/11 20:59ID:???じゃぁいちいち、perlのスクリプトがある場所までcdしてからやらないといけないのですか?
毎回cdするのは結構面倒だと思うんですけどどうなんでしょうか。
0370nobodyさん
02/12/11 21:03ID:3ApX3k5Y0371nobodyさん
02/12/11 21:08ID:???0372nobodyさん
02/12/11 21:32ID:IDueDvlEそうなんです。Perl5.6用は見つかるんですが5.8用に全く行き当たらなくって。
グーグルしか使ってませんが。w
暇を見てぼちぼち探してみます。
>>365
いっぺんお使いのPerlにJcodeをインスコしてみてはどうでしょ。
コマンドプロムプトで
perl -MCPAN -e shell
してから、プロムプトがcpanに変化しますんで
>cpan install Jcode
でいけるかと。
0374nobodyさん
02/12/11 22:10ID:a27i1ZyR上手くいきません。Perl5を使っています。
#!/usr/bin/perl
$file = 'split.txt';
open(IN,$file);
@data = <IN>;
close(IN);
foreach(@data){
($1,$2,$3,$4) = split(/ /,$_);
$newdata = "$4,$3,$2";
open(OUT, ">$file");
print OUT "$newdata\n":
close(OUT);
}
exit;
これを走らせると
Modification of a read-only value attempted at split.cgi line 9.
と split の部分にエラーが出てしまいます。
どうしたらいいんでしょうか?
0375nobodyさん
02/12/11 22:15ID:qA0+bOBO$1とか$2というのはマッチの特殊変数。
任意の値を代入することは出来ない。
変数名を別なのに変えるべし。
0376nobodyさん
02/12/11 22:22ID:???もしくはヘビーユーザー( ´∀`)
>>374
同じファイル2回もopenするのは無駄っぽいから、
>>331(の下のやつ)みたいに1回にまとめた方がいいかもね。
0377nobodyさん
02/12/11 22:26ID:???0378374
02/12/11 22:34ID:???とりあえず、出来ました。ありがとうです。
chomp(だっけ?) だかなんだかを使ってやるやり方があったような…
0379nobodyさん
02/12/11 22:47ID:???つーか、chomp使ってないから、できたファイルは意図したようにはなってないはずだが?
0380ありゃ
02/12/11 23:15ID:pgarahTm削除したいのですが、
foreach (values %array){
s/ //g;
print "$_\n";
}
とした場合と、
foreach (values %array){s/ //g;}
foreach (values %array){print "$_\n";}
とした場合、私のローカル環境(パールのバージョン:5.6.0 built for i386-linux)
では、同じ結果が出るのですが、ほとんどのレンタルサーバ上で
実行すると、違った結果が出力されてしまいます。
なぜでしょう?
}
0381353
02/12/12 00:03ID:???レス、サンクスです。
>モードは"+>"だよね。そのコードからすると。
"+>"と"+<"は意味は同じですよね?ちなみに僕は"+<"です。
open(FILE,"xxxx");
@file = ();
push @file, scalar <FILE> for 0..8;
seek(FILE,0,0);
print FILE "zzzz";
print = @file;
close(FILE);
こんな感じでいいんですよね?
いまいち”scalar <FILE> for 0..8”この辺の書き方が曖昧にしか理解できていないど、
本でも読んで理解したいと思います。
0382nobodyさん
02/12/12 00:04ID:???0383nobodyさん
02/12/12 00:53ID:???話じゃないよね? っていうか「違った結果」の
希望とする値
実際の結果
の両方が見たいんですけど。
0384nobodyさん
02/12/12 01:25ID:ZGG2sBOp違うよ。
"+>"は内容を消す。
"+<"は内容がそのまま残ってしまう。
素直に一旦読んだ後書き込みで開き直した方がいい。
0385ありゃ
02/12/12 01:56ID:DcSt6eP2すみません、
%array = ('one' => '0 1','two' => '0 2','three' =>
'0 3');
とした場合、希望する結果は01と02と03が表示されることで、
私のローカル環境(パールのバージョン:5.6.0)
では、上下どちらの書き方でも同じ結果が出ますが、
実験した複数のサーバでは、
上の場合では0 1と0 2と0 3が表示され、
下の場合では01と02と03が表示されてしまいます。
実験したサーバのひとつは、パールのバージョンが5.0
だったので、単にバージョンの違いでしょうか・・・。
0386Q1
02/12/12 03:43ID:???ランダムリンクを作成して、
処理で
print "Location: http://xxxx.xx.xx/\n\n";
として飛ばしているのですが、
サンプルで自分のホームページを登録したのですが、
試して見ると、 302 FOUNDと表示されます。
この処理はアンカータグを使い、getの処理で呼び出しているのですが、
呼び出すページと飛ぶページが同じだと、302が表示される様なのですが、
これを回避する方法はないでしょうか。
「302を表示させずに、そのページへ飛ぶ。」というのは可能でしょうか。
0387マリモーマ
02/12/12 05:04ID:ItnO3SiH&header;
print "<meta http-equiv=refresh content=0;url=http://$url>";
exit;
0388Q1
02/12/12 05:39ID:???検討してみます。
ありがとうございました。
0389nobodyさん
02/12/12 09:19ID:???> if ($mode %2 != 1) {
っていうのがあるんですけど、これの %2 って何ですか?
0392391
02/12/12 09:33ID:???0393389
02/12/12 11:25ID:???>2で割った余り。
あっそうか。% と 2 がくっついてるので
「またPerlの記号的な記法か」と思ってしまいました。
ありがとうございます。
0394nobodyさん
02/12/12 11:55ID:???0396353
02/12/12 15:33ID:???と言うことは
open(IN,"<xxxxx");
flock(IN,2);
@file = ();
push @file, scalar <IN> for 0..8;
close(IN);
open(OUT, "+>xxxxx");
flock(OUT,2);
seek(OUT,0,0);
print OUT "zzzzz\n";
print OUT @file ;
close(OUT);
とした方が良いみたいですね。
なんとなくopenを2回するのは、あんまりいいことではないと思っていました。
"+<"と"+>"の違いも教えてもらって、感謝します。
0400336
02/12/12 19:14ID:BLMNLzB2ここ間違ってました。
sub decode {
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("長すぎます"); }
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# S-JISコード変換
&jcode'convert(*value,'sjis');
}
}←このカッコを忘れていた。
エラーメッセージよりだいぶ上(^^;
・・・でも動かない。なんでだろう。
ファイルへの書き込みが出来ていないみたいなんですが。。。
>>344
それはここに書き込む時に付け加えたので問題ないです(^-^;
0401336
02/12/12 19:18ID:BLMNLzB2#入力された内容をファイルを作って保存する。
sub words {
$file = "./pass.txt";
if($in{'pass'} eq ""){ &error("設定できませんでした"); }
open PD, ">$file" or &error("システムエラー発生");
@pwd = ('a'..'z','A'..'Z','0'..'9','.','/','%');
srand;
$kw = $MIX[int(rand(@pwd))] . $MIX[int(rand(@pwd))];
$words = crypt("$in{'word'}", $kw);
print PD "$words";
close PD;
}
@pwdの変数をちょっと変えているんですが、これは使っては駄目ですか?
(%とか/とか。)
#参考にした掲示板スクリプトでは中身が9までしかないです。
#それ以降は私の付け加え。
0402336
02/12/12 19:19ID:BLMNLzB20403nobodyさん
02/12/12 19:51ID:???@MIXって @pwd じゃない?(別に@MIXがあるのかな)
あと、cryptの salt($kw) は '%' は使えません。
それ以外の64文字は使えるので、 int(rand(@pwd)) は int rand 64 でもOK。
0404nobodyさん
02/12/12 20:01ID:???以下のようなsort したデータがあります。
名前,点数というデータの形(配列)です。
山田,28
山田,39
佐藤,94
加藤,83
加藤,28
加藤,28
木下,23
木下,33
ここから、各人の合計点を出したいのですが、どうするのが良いでしょうか?
名前でuniqする方法は分かるのですが、点数を足していく方法がわかりません。
ヒントだけでよいので、お願いします。
0405nobodyさん
02/12/12 20:07ID:ZGG2sBOp@dataに入ってるとして、
%hash=();
for (@data) { my @array = split/,/; $hash{$array[0]} += $array[1]}
で%hashに入る。
0406nobodyさん
02/12/12 21:01ID:???すげーー!目からウロコ。thanx
12行位かかって書いてたのに、一行って!(for は foreachでなくてもOK?)
平均点(合計点 / 名前の出現回数)を出すには、
%hash=();
$no =1;
for (@data) {
my @array = split/,/;
$hash{$array[0]} += $array[1];
if ( $prev_name eq $array[0]){ $no ++; }else{ $no = 1; }
$avg = $hash{$array[0]} / $no;
$prev_name = $array[0];
}
??? とか? やっぱ頭悪い。
0407nobodyさん
02/12/12 21:16ID:???割り算の後に小数点を下2桁まで表示したいのですが、
sprintf("%4.2f",$a) すると割り切れる時でも小数点以下に 3456.00
と出てしまいます。
割り切れない場合、 1234.56
割り切れる場合 1000
と表示するにはどうしたらよいのでしょうか?
0408nobodyさん
02/12/12 21:20ID:H3YHNRGsuse strictってなんでみんな使わないの?
0410nobodyさん
02/12/12 21:26ID:???そうかなあ。ちゃんとしたPerl使いならもちろん
使っているだろうけど、CGIだけのためにPerlやってる
人ってなんかそういうのあんまり意識してないような。。。
0411nobodyさん
02/12/12 21:33ID:???$a =~ s/\.00$//;
>>410
巷で配布してるCGIはピンからキリまであるからなあ。
あと配布用にPerl4でも動くようにしてるところもあるでしょうし。
0413ななし
02/12/12 22:17ID:???なんとか方法は分かったんですが、ブラウザにドラッグするののやり方が
わかりません。おしえてください。おねがいします。
0414nobodyさん
02/12/12 22:20ID:???0415nobodyさん
02/12/12 22:21ID:LUwqAPKoありがとうございます。
そういう方法しかないんですかね。結局。
あるサイトに
$a = int($a * 100)/100;
ってあったんですけど、これだと無駄が多そうですよね。
$a =~ s/\.00$//;
$a =~ s/\.0$//;
の方が早そうですね。
0417nobodyさん
02/12/12 22:50ID:rgoFlUwc★http://yahooo.s2.x-beat.com/linkvp/linkvp.html★
0418n
02/12/12 22:51ID:rgoFlUwc★http://yahooo.s2.x-beat.com/linkvp/linkvp.html★
0420nobodyさん
02/12/12 23:16ID:???>407を読み直した方がいいかも。
0421nobodyさん
02/12/12 23:19ID:i62/L17Z0423422
02/12/13 00:04ID:???$b+=0;
の間違い。
0424nobodyさん
02/12/13 00:12ID:???ベタだけど、
%hash1=%hash2=();
for (@data) {
my @array = split/,/;
$hash1{$array[0]} += $array[1];
$hash2{$array[0]}++;
}
$hash1{$_} /= $hash2{$_} for keys %hash1;
でどうかな。(結果は%hash2)
0425398
02/12/13 00:53ID:???0427424
02/12/13 08:15ID:???0428nobodyさん
02/12/13 11:37ID:???検索すれば理由は簡単に判りそうな気がするけど・・・
ttp://www.ryu.dyn.to/cgi-bin/tree.cgi?action=clip&no=771
※※※これは「Return-Path」のみの検索キーで見付けた※※※
注)自力で調べる努力を怠ってる人はまともに相手をして貰えません
0430nobodyさん
02/12/13 15:58ID:???の者ですが。色んな方法がありますね。
sprintf($a=~s/\.0+//?"%4f":"%4.2f",$a)
と
$b=sprintf('%4.2f', $a); $b+=0;
が一番シンプルそうです。
>>419
int $a ではいけないですよね?
0431nobodyさん
02/12/13 17:39ID:iG+3sspLCSVで貯めるのですが、その際、CSVデータが誕生日$yyyy,$mm,$ddで
ソートしたいのですがいつソートするんでしょう?
1回そのまま書き込んで、もう一回呼んで、ソートしかないですか?
書き込む前にソートできますか?
0433nobodyさん
02/12/13 18:16ID:???好きなように決めてくれ。
書き込みが追加書き込みなら、読んでからソートのほうが改造が楽。
基本的には頻度が少ないほうでソートするべきだろう。
0434nobodyさん
02/12/13 19:29ID:4EJmzvt/@MIX??・・・は、ないです。
$MIXではなく@MIXにしないといけないのでしょうか。
あ、あと%の件ありがとうございました(^^;
で、書き直しましたが、これでもできてないです。
文法エラーとかInternalエラーとかは一切出ず、フォームに
言葉を入れてボタンを押すとリロードされます(これはちゃんとした処理)
動いているように見えるんですけど、PDへの書き込みが出来てません。
どこで引っかかっているのかな・・・。
cryptが動いていないのか、ファイル書き込みが動いていないのか。。。
0436nobodyさん
02/12/13 20:12ID:???そもそも、
$kw = $MIX[int(rand(@pwd))] . $MIX[int(rand(@pwd))];
は、
$kw = $pwd[int(rand(64))] . $pwd[int(rand(64))];
であるべきでは?
あと、
print PD "$words";
は、何かセパレータを入れておくべきかも?
例:
print PD "$words\n";
13文字ずつで切り出せばよいけれども。
0437nobodyさん
02/12/13 20:13ID:???これはちょうど表示部分のところです。
#このスクリプトの名前,"bbs.cgi"
$pagemax = "1ページの表示数";
$file = "データファイル";
open(OUT, "<$file");
flock(OUT,2);
@view = <OUT>;
$log = @view;
if($ARGV[0] =~ /\d{1,3}/){
print @view[$ARGV[0]..$ARGV[0]+$pagemax];
$ARGV[0] += ++$pagemax;
if($ARGV[0] < $log){
print "<a href=\"bbs.cgi?$ARGV[0]\">NEXT</a>";
}
}else{
print @view[0..$pagemax];
if($log > $pagemax+1){
$pagemax++;
print "<a href=\"file.cgi?$pagemax\">NEXT</a>";
}
}
close(OUT);
とりあえずこれで動作はしたんですが、もっとスマートな方法はないですかね?何かすごく効率が悪そうなんで。
0438nobodyさん
02/12/14 01:20ID:???去年まで金無し君だったけど、オンラインカジノとパチンコで
二年で350万貯めた。一度やってみなよ。
初回のみだけど、1ドル以上のチップを買えば30ドル(4000円くらい)貰える。
もらうだけもらってプレイせずに換金することもできるし、ルーレットで赤か黒に
思い切って賭けてしまえば50パーセントで二倍になる。
金なきゃオフラインでゲームすればいいだけ。暇つぶしになる。
ビデオポーカーとかスロとか色々あるのでマジでお勧め。
http://www.imperialcasino.com/~1kl5/japanese/
0439nobodyさん
02/12/14 11:40ID:???無駄なところは読み込みたくないので
何行目〜何行目 を ハンドルに放り込む方法はないのでしょうか?
0440439
02/12/14 11:57ID:???ちょっとログがMB級あるんで
必要なところだけ読み込めたら楽なんだけど
0441nobodyさん
02/12/14 12:20ID:???原始的な方法でいいなら、100〜200行の場合。
$from = 100;
$to = 200;
open(IN,$file);
foreach $l(1 .. $from-1){<IN>;}
foreach $l($from .. $to){push(@data,<IN>);}
close(IN);
とか。
過去スレで出た方法だと、行の始まりのインデックスを別ファイルに保存して
readで呼び出すとかあったかな?
0442nobodyさん
02/12/14 12:59ID:???データを展開しないで指定行に飛ぶのは無理っぽい。
0443439
02/12/14 13:08ID:2kNAmjtjログファイルの記録方法を考え直して見ます
0444nobodyさん
02/12/14 13:12ID:???0445nobodyさん
02/12/14 15:48ID:???$from = 100;
$to = 200;
$lines = $to - $from + 1;
open IN, "head -$to | tail -$lines |";
0447439
02/12/14 17:45ID:???open IN, "head -$to $filename | tail -$lines |";
で逝けそうですね ありがとうございます。
0448nobodyさん
02/12/14 19:22ID:???while (<IN>) {
next if ++$count < $from;
last if $count > $to;
...
}
ファイルの大きさと、指定範囲によるけど、
数千行ぐらいなら十分かなぁと。
パイプは起動コスト高いから、ベンチとって見るのがいいと思う。
perlメモにperlでtailするサンプルあったけど、正直大して早くなかった。
でもお勧めは、バークレイDBかな。。身も蓋も無いけど。
0449nobodyさん
02/12/14 21:36ID:???自動で、別窓で一覧にして永久的に表示するというのをやりたいのですが
どうしたらいいでしょう
0451nobodyさん
02/12/14 21:49ID:???0453nobodyさん
02/12/14 23:14ID:TSZsnHUGAn electric wave boy is the reason which carried out the way which finishes being incomprehensible...
電波少年は不可解な方法を実行した理由です...
微妙ですが
0454nobodyさん
02/12/15 00:32ID:???0456nobodyさん
02/12/15 02:18ID:???■ このスレッドは過去ログ倉庫に格納されています