【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あたりを見よう。
0331nobodyさん
02/12/10 15:46ID:???書き込み処理の所なんですが、
open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
truncate(OUT,0);
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
close(OUT);
と
open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
truncate(OUT, tell(OUT));
close(OUT);
ではどちらがいいんでしょうか?
ただtruncateの使い方がちょっと違うだけなんですが・・・。
それ以前に文法的に間違っていたらご指摘お願いします。
0334nobodyさん
02/12/10 16:11ID:???>332さんごめんなさい。
0335nobodyさん
02/12/10 16:17ID:???せめて、配列じゃなくって$hoge1という変数が欲しい
理由を書いてもらえませんか? もしかするとその原因
自体変更することで、全体としてすっきりするっていう
可能性もありますから。
0336nobodyさん
02/12/10 19:01ID:4NsDPNiK作ろうとしてるのは、パスワードを作るだけのスクリプトと、そのパス
を使って管理する掲示板なんだけど・・・文法チェッカかけたら
「Missing right curly or square bracket at hoge.cgi line 65, at end of line
syntax error at hoge.cgi line 65, at EOF
hoge.cgi had compilation errors.
」
ってなってしまった。。。
0337336
02/12/10 19:02ID:4NsDPNiK0338nobodyさん
02/12/10 19:04ID:???メールの受信をしたいので、下記のように記述したのですが
0 use Net::POP3;
1 unless ($pop = Net::POP3->new("$HOST")) {
2 print "POP3接続失敗 \n";
4 }
5 $pop->user($LOGIN_NAME);
6 $auth_check = $pop->login($LOGIN_PASS);
7 if( $auth_check == undef )
8 {
9 print "認証: NG \n";
10 }
どうしても、認証NGとなってしまいます。
POPサーバーには、Win2000 exchangeを使用しているため
ログインユーザー名に、「ドメイン\\ユーザー名」と記述したり、
しなかったり、と色々試してみたのですがダメでした。
ちなみに、モジュールが置いてあるマシンからPOPサーバーへの
pingは通りました。
どなたか、分かる範囲で構いませんので
ご指摘下さい。
0340336
02/12/10 19:06ID:4NsDPNiK暗号化して、それをファイルに保存(ファイルを作成というコマンド
がない?ので、ロックファイル作成のコードを使ってます)、というもの。
エラーが出ている65行目は。。。
sub error {
&head;
print <<"ERR"; #ここが65行目。
<center>
<hr>
<font color="#C20000"><b>エラー</b></font><hr>
$_[0]
<hr>
</body>
</html>
ERR
}
何が違うんでしょう??
0341336
02/12/10 19:07ID:4NsDPNiKカッコ?!
・・・見てみます。
0343nobodyさん
02/12/10 19:17ID:???0345338
02/12/10 21:05ID:???とりあえずもう一度、修正版を書いておきます。
0 use Net::POP3;
1 unless ($pop = Net::POP3->new("$HOST")) {
2 print "POP3接続失敗 \n";
4 }
5 $pop->user($LOGIN_NAME);
6 $auth_check = $pop->pass($LOGIN_PASS);
7 if( $auth_check == undef )
8 {
9 print "認証: NG \n";
10 }
0346nobodyさん
02/12/10 21:24ID:???0347nobodyさん
02/12/10 21:51ID:???@test=("か","き","く","け","こ");
@hoge=("あいうえお","テスト","さしすせそ","たちつてと","");
@hoge{1}=@test;
$data=@hoge[0];
このようにすると$dataの中には「か」だけが格納されてしまうのですが。
0349347
02/12/10 21:53ID:???正 $data=@hoge[1];
0350nobodyさん
02/12/10 21:56ID:???0352nobodyさん
02/12/10 23:43ID:???@test=("か","き","く","け","こ");
@hoge=("あいうえお","テスト","さしすせそ","たちつてと","");
$hoge[1] = \@test;
print $hoge[1]->[5];
print $hoge[1][3];
print @{$hoge[1]}
0353nobodyさん
02/12/11 00:22ID:???open(FILE,"xxxx");
@file = <FILE>;
@file = @file[0..8];
seek(FILE,0,0);
print FILE "zzzz";
print = @file;
close(FILE);
このように添字を使って”xxxx”の記録数を10にしたんだけど、
これはかなりダサイやり方?
0354nobodyさん
02/12/11 01:45ID:fCm39Cv9モードは"+>"だよね。そのコードからすると。
@file = ();
push @file, scalar <IN> for 0..8;
のほうがいいと思うよ。
0355nobodyさん
02/12/11 11:59ID:IDueDvlEこちらのスレに対策知ってる神はいらっしゃる?
0356nobodyさん
02/12/11 12:50ID:???$sql = "insert into *** values( '***' )";
$statement = $dbHandle->prepare( $sql );
$sqlResult = $statement->execute;
この$sqlResultには何が返ってくるのでしょうか。
見たんですけど何も入っていませんでした。
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 ではいけないですよね?
■ このスレッドは過去ログ倉庫に格納されています