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

Perl コーディング初心者質問コーナー Part26

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん03/07/24 19:48ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

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

関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0859nobodyさん03/08/11 13:42ID:???
>>858
PATH_INFO
詳しくは CGI スレで。
0860nobodyさん03/08/11 13:56ID:???
>>858
http://pc2.2ch.net/test/read.cgi?bbs=php&key=1059043704
http://pc2.2ch.net/test/read.cgi/php/1059043704/
0861nobodyさん03/08/11 14:06ID:???
どーもthxです。勉強してきます
0862nobodyさん03/08/11 14:08ID:???
>>860
あ、なるほど本来(?)なら
bbs=php&key=1059043704
と引数を渡すところを、
PATH_INFOってのを使って、
/php/1059043704/
こういう形で引数を渡すように設定できる

そういうことですね。勉強になりました。
0863nobodyさん03/08/11 18:17ID:???
>>854
俺は14874行の
perlスクリプトを動かしてるが、なんてことはなく
サクサク動いてるぞ。
0864nobodyさん03/08/11 18:26ID:???
単純に行数じゃ判断できないしなぁ。
改行だけなら1〜2バイトだし。
行数よりもファイルサイズが重要でないかい?
0865nobodyさん03/08/11 18:41ID:???
2113行、60KBでサクサク
0866nobodyさん03/08/11 19:59ID:???
10000行、20KBで以下略。
0867nobodyさん03/08/11 20:01ID:???
2701行、85Kbでサクサク
086886303/08/11 20:02ID:???
14874行って書いたけれど、
サイズは623KBだ。
サクサク。

>>854
はマシンのスペックがよっぽどしょぼいか、
しょっぱいスクリプトの書き方してるんじゃないかな。
0869nobodyさん03/08/11 20:04ID:???
10000行で20KB
ってことは、10000行の改行だけのスクリプトってことだな
0870nobodyさん03/08/11 20:04ID:???
あ、ちがった。
KBとBの単位をまちごた。
0871nobodyさん03/08/11 21:26ID:???
最近UTF-8でスクリプト書いても動く事に気付きました。
で素朴な疑問ですがやはりEUCでないとどこかで不都合起きたりしますか?
今のところ何も起きてないけど気になって。
0872nobodyさん03/08/11 21:34ID:???
UTF-8だと問題ないでしょ。
さらに
perl5.8を使って、
use Encode;
でさらに幸せになれます。
0873nobodyさん03/08/12 04:00ID:???
たった50行ですけど、重くて全然動かないですよ。
パソコンの環境によっては500行以下にしなさいってことだ。
0874あぼーんNGNG
あぼーん
0875あぼーんNGNG
あぼーん
0876あぼーんNGNG
あぼーん
0877あぼーんNGNG
あぼーん
0878あぼーんNGNG
あぼーん
0879あぼーんNGNG
あぼーん
0880あぼーんNGNG
あぼーん
0881あぼーんNGNG
あぼーん
0882あぼーんNGNG
あぼーん
0883あぼーんNGNG
あぼーん
0884nobodyさん03/08/12 04:50ID:???
50行で動かないってどういうスクリプトだそりゃ。
または博物館行きのスペックのマシンでも使ってんのか?
0885nobodyさん03/08/12 04:53ID:???
ほっとけ
0886nobodyさん03/08/12 04:55ID:???
>>884
とてつもなく巨大な配列とか使ってたりして(w
0887nobodyさん 03/08/12 05:17ID:???
無限ループすれば一行でもおもくできるが?

つか、おめぇAA貼ってる馬鹿だろ。みんな放置汁
0888nobodyさん03/08/12 05:21ID:???
>>874-882までまた削除依頼でいいだろ
今度はコピペとして依頼してくれって言ってるから、そろそろ(ry
0889nobodyさん03/08/12 05:27ID:???
わざと重くするなら無限ループでもなんでも簡単だが、
50行でうごかねーって騒いでるのは
わざと重くしてるのか?
0890nobodyさん03/08/12 10:40ID:???
すいません、CPANって、なんて読むのでしょうか?
しーぱん?しーぴーえーえぬ?
0891nobodyさん03/08/12 10:50ID:???
しーぱん
0892nobodyさん03/08/12 10:55ID:???
しーぽん
0893nobodyさん03/08/12 11:00ID:???
シパーソ
0894nobodyさん03/08/12 11:41ID:???
>>890
CPAN (See-Pan)
0895あぼーんNGNG
あぼーん
0896あぼーんNGNG
あぼーん
0897あぼーんNGNG
あぼーん
0898あぼーんNGNG
あぼーん
0899あぼーんNGNG
あぼーん
0900あぼーんNGNG
あぼーん
0901あぼーんNGNG
あぼーん
0902あぼーんNGNG
あぼーん
0903nobodyさん03/08/12 11:55ID:???
粘着質だな
0904nobodyさん03/08/12 12:02ID:???
そのうち板ごとアク禁されるでしょ
0905nobodyさん03/08/12 13:34ID:???
>>874以降の分、削除依頼してきた
0906nobodyさん03/08/12 14:43ID:???
激しくPerl初心者で悪いんだが、所有者がWebになってるディレクトリを削除するために(FTPからは削除できない)
それ用の簡単なプログラムを書いてみたんだが500InternalServerErrorになる。ソースをうpするのでご教授願いたい。
ttp://amici.dip.jp/~takuho/cgi/hakoniwa_sakujo.txt
KENTWEB配布の文法チェッカーでは異常なしらしいんだが…。
090790603/08/12 14:44ID:???
失敬、アドレス間違えた。
正しくは、
ttp://nd22.abz.jp/cgi/hakoniwa_sakujo.txt
0908nobodyさん03/08/12 14:56ID:???
>>906
2行目に
print "Content-type: text/plain\n\n";
を挿入
0909 03/08/12 14:57ID:???
だな
0910nobodyさん03/08/12 15:00ID:???
>>906
UNIXで動かしてるのか?
と言うより、CGIとして起動してるのか?

それなら>>908のは必須だよ。
0911nobodyさん03/08/12 15:09ID:Ehp7RR1Q
えー、よく分からないんだが、Windowsで書いたPerlのスクリプトを、Linuxのサーバにうpして走らせてる、でいいのかな?
あと、>>908の言うとおりにスクリプトを変更して走らせたら、なんかDLしますか?みたいなウィンドウが出てきたので、txt/plainをtxt/htmlにしてみたら一応走った。
$sakujp1から$sakujp9までを表示させてみたら全部0 (´Д`;)マジカヨ
0912nobodyさん03/08/12 15:13ID:???
うが、失敬あげてもた
0913nobodyさん03/08/12 15:17ID:???
>>911
ディレクトリは空なんだろうね。
0914nobodyさん03/08/12 15:21ID:???
>>911
txtじゃなくtextなのだが
0915nobodyさん03/08/12 15:22ID:???
>>913
空じゃないといけないのかw
スクリプト書き直します

>>914
ああ、こりゃまた失敬。
ちゃんとtextって書いてますよ。
0916nobodyさん03/08/12 16:29ID:dyQ6VIzM
定数のみを記載したファイルを各CGIにて読み込んで、
各ページで内容を統一したいのですが、以下の方法では
エラーとなってしまいました。
どなたかご教授お願いします。

# main.cgi

require "inc.pl";
・・・・

# inc.pl
my $title = "welcome";
・・・・

よろしくです。
0917nobodyさん03/08/12 16:29ID:???
落ち着いてから喋れよ
0918nobodyさん03/08/12 16:44ID:RiEGcXgN
my %hage = (
 a => "hage",
 b => {
  c => "$hage{a} /hage",
 },
);

こんな感じで$hage{b}{c}で、$hage{a}を使いたいけど、
出来ませんよね?何かいい方法有りませんか?
0919nobodyさん03/08/12 16:47ID:???
my の意味わかってる?
なんでつけてんの
092091903/08/12 16:50ID:???
あ、、>>916あてね
0921nobodyさん03/08/12 16:53ID:???
>>918
どうしても初期化時にやりたいの?
0922nobodyさん03/08/12 16:56ID:???
>>918
my $zura = "hage";
my %hage = (
 a => $zura,
 b => {
  c => "$zura /hage",
 },
);
092391603/08/12 17:07ID:???
解決しました。

根本的に間違えていました。

まず、パッケージ宣言をしていませんでした。
あと、>>920さんのいうとおり、パッケージとして読み込む
内容に対してmyにしていました。

092491803/08/12 17:10ID:???
>>919
実はあんまいみ分かって使ってないかも(汗

サブルーチンの中でその間数内でしか使わない変数は、
myを付けるようにしてる。あと、use strict;してると、
my付けなきゃ怒られるから、、、

>>921-922
一つにまとめた方がすっきりしていいかなーって思いましてね。
やっぱ無理ですかね?
092591803/08/12 17:11ID:???
>>920
あ、俺宛じゃないのね。
失礼。
0926nobodyさん03/08/12 17:35ID:???
>>925
ついでに勉強しておくと良いと思われ。
キーワードはvarsとかourあたりで。
092792303/08/12 19:10ID:dyQ6VIzM
解決したのですが、別の問題が・・・

requireで呼び出す定数の記載されたplファイルが、
ブラウザから丸見えになってしまいます・・・
(見られたくない内容が記載されています)

属性を600にしたら動かないようですし。

ブラウザから参照できないファイルにできないものですか?

よろしくお願いします。

0928nobodyさん03/08/12 19:18ID:???
全然コーディングと関係ないぞ
092992303/08/12 19:23ID:dyQ6VIzM
>>928 失礼しました。流れでついつい聞いてしまいました。

ちなみに拡張子をcgiにしてみると実現できました。
0930nobodyさん03/08/12 19:41ID:???
>>927
そこから先はスレ違いの内容だ。
0931nobodyさん03/08/12 19:42ID:???
.htaccessで観覧不可にすればいーじゃん
0932nobodyさん03/08/12 20:11ID:???
>>932-938まで削除依頼済み
0933nobodyさん03/08/12 20:23ID:???
>>940
運用情報にて規制対象にするのがよいかと。
0934nobodyさん03/08/12 20:31ID:???
>>941
それはいいね。
運用情報をちょっと見てきたけど、コピペや広告がビシバシと
アク禁になっててワラタ。
今後も続いたらそっちに回そう。
0935nobodyさん03/08/12 20:50ID:y42wbWjQ
my $ref_mail = $pop3->get($num);
my $mail = join(/ /, @{$ref_mail});

とかくと、成功したり失敗したりします。
エラーが出た場合のエラー内容は下記のとおりです。

Can't use an undefined value as --.cgi reference

これについて調べてみたのですが、どうも理解が
できません。
定義するとエラーが出てしまいますし、初心者の私に
どうか教えていただければ幸いです。
0936nobodyさん03/08/12 20:57ID:???
あるところに糞スレの好きな男がいた。
男は「(都の人のする)糞スレというものをひとつ立ててみよう」と思った。
男の女房が「(天さかる鄙にすむわたしのような教養のない女でもわかるが)都の人はそんなことをしない(と思う)」
と諌めたが、男はきかない。
「(釈迦入滅以来うだつのあがらない自分という男にほとほと愛想が尽きたが)
ここで糞スレを立てれば(都の人のように)頓知がきいていると世の賞賛を受けるだろう」
と糞スレをたてた。

はたして翌日、>2以降、罵倒の嵐だった。
>1も無駄なことをするものだなあと(何故か判らぬが突然出てくる)横川の僧都(そうず)は嘆いた
0937nobodyさん03/08/12 22:05ID:???
>>942
でも担当★がちょとあんぽんたんだったので★を剥奪されたそうです(w
0938nobodyさん03/08/12 22:14ID:???
透明削除入れたので、レス番がずれました。
申し訳ないです。

>>937>>932-934辺りへのレスです。
0939nobodyさん03/08/12 22:35ID:???
クエリーストリングを、%inに入れたとして、以下のコードを実行すると、

sub htmlspecialchars{
  #PHPの同名関数と同じ動きをします。
  my ($letter) = $_[0];
  $letter =~ s/&/&/g;
  $letter =~ s/"/"/g;
  $letter =~ s/'/?/g;
  $letter =~ s/</</g;
  $letter =~ s/>/>/g;
  return $letter;
}

foreach $key (keys %in){
  &jcode::convert(\$in{$key}, "sjis");
  print qq|<input type="hidden" name="$key" value="|. &htmlspecialchars(\$in{$key}) .qq|">\n|;
}
<input type="hidden" name="country" value="SCALAR(0x827cdbc)">
<input type="hidden" name="gender" value="SCALAR(0x827cd2c)">
となってしまうのですが、どこがいけないのでしょうか・・・?
0940nobodyさん03/08/12 22:43ID:???
>>938
乙。
あぼーん<>あぼーん<>あぼーん<>あぼーん<>あぼーん<>
を追加加工は出来なかったのね(w

>>939
リファレンスで渡してるやん。。。
0941nobodyさん03/08/12 23:00ID:???
#!/usr/bin/perl

# CGIヘッダの出力
print "Content-type: text/html\n\n";

while($HP1 > 0) and ($HP2 > 0){
srand1;
srand2;
}

# Player1
$HP1 = 400 - $kougeki1;
$KIK1 = 60;
$PAN1 = 20;
$DF1 = 10;

# Player2
$HP2 = 300 - $kougeki2;
$KIK2 = 100;
$PAN2 = 40;
$DF2 = 0;

# Player1
$kougeki1 = sentaku;
$kougeki1 = $KIK2 = 100;
$PAN2 = 40;

# Player2
$kougeki2 = $KIK2 = 100;
$PAN2 = 40;
$DF2 = 0;
0942nobodyさん03/08/12 23:00ID:???
sentakud;
if($mode == 1){
$offense = \%you;
$defense = \%my;
}elsif($mode == 2){
$offense = \%my;
$defense = \%you;
}
if( int(rand(2)) ){
#punch
$damage =
$offense->{'$PAN1'} - $defense->{'$DF2'};
if(!$rand = int(rand(5))){
#half
$damage = int($damage / 999);
}elsif($rand < 3){
#miss
$damage = "";
}
}else{
#kick
$damage =
$offense->{'$KIK1'} - $defense->{'$DF2'};
}
0943nobodyさん03/08/12 23:07ID:???
sentaku2;
if($mode == 1){
$offense = \%you;
$defense = \%my;
}elsif($mode == 2){
$offense = \%my;
$defense = \%you;
}
if( int(rand(2)) ){
#punch
$damage =
$offense->{'$PAN2'} - $defense->{'$DF1'};
if(!$rand = int(rand(5))){
#half
$damage = int($damage / 999);
}elsif($rand < 3){
#miss
$damage = "";
}
}else{
#kick
$damage =
$offense->{'$KIK2'} - $defense->{'$DF1'};
}

($damage < 0) and ($damage = 0);
$defense->{'HP1'} -= $damage;
0944nobodyさん03/08/12 23:08ID:???
($damage < 0) and ($damage = 0);
$defense->{'HP2'} -= $damage;

# HTMLの出力
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";
print "<html>\n";
print "<head><title>対戦バトル</title></head>\n";
print "<body>
<p>Player1:体力は$HP1です</p>
<p>Player2:体力は$HP2です</p>
<p>Player1は<big>$kougeki1</big>のダメージを与えた。</p>
<p>Player1は<big>$kik1</big>のダメージを受けて混乱した。
<p>mona-は<big>$panti1</big>のダメージで野原でクソをし始めた。
<p>Player2は<big>>$kougeki2</big>のダメージを与えた。</p>
<p>Player2は<big>>$kik2</big>のダメージを受けて裸踊りを始めた。
<p>Player2は<big>>$pantti2</big>のダメージで光浦なみの女にレイプし始めた。</p></p></body>\n";
print "</html>";
0945nobodyさん03/08/12 23:09ID:???
>>935

それはその下のファイルを使うな、という意味です。
そのファイルは使えないので、そのファイルを全部削除して、
1から書き直すことをすすめます。
0946nobodyさん03/08/12 23:46ID:???
配列の中身を順番に書き出すにはどうすれば良いんでしょうか。

while (@test){
 print\n;
}

とかやってみたのですがPCごと固まってしまいました…。
あとハッシュの中身を例えば
キー:値
のような形のリストとして出力するような方法も知りたいです。
#キーは不定
0947nobodyさん03/08/12 23:55ID:???
>>946
foreach(@test){
print $_,"\n";
}
0948nobodyさん03/08/13 00:11ID:0XDiwwzH
foreach $key(keys %HASH){
print $key." = ".$key{$key}."\n";
}
0949nobodyさん03/08/13 00:20ID:???
>948
間違ってるぞ。
foreach $key(keys %HASH){
print "$key=$HASH{$key}\n";
}
0950nobodyさん03/08/13 00:23ID:???
while (my($k, $v) = each %hash) {
print "$k:$v", "\n";
}
0951nobodyさん03/08/13 00:23ID:???
>>943
ハードリファレンスやシンボリックリファレンスとして使用する値は、
定義済みの値でなければなりません
0952nobodyさん03/08/13 00:25ID:???
>>945
あるいは
while ( @test ) {
  pop shift @test."\n";
}

>>946
あるいは
while ( ($key, $val) = each %HASH ) {
  print $key." = ".$val."\n";
}
095395203/08/13 00:26ID:???
失礼。訂正です。

>>945
あるいは
while ( @test ) {
  print shift @test."\n";
}
0954nobodyさん03/08/13 00:26ID:0XDiwwzH
お。。
まちがってた。
thxでごんす。
095594603/08/13 00:28ID:???
ありがとうございました。
whileとforeachの違いがイマイチわかりづらいですが
ラクダ本でも見てゆっくり勉強する事にします。

ハッシュの方はKeys関数のところみたら見事に載ってました。
わざわざすみませんでした…。
095695203/08/13 00:29ID:???
たびたび失礼。訂正です。

>>945
あるいは
while ( @test ) {
  print shift @test;
  print "\n";
}
0957nobodyさん03/08/13 01:30ID:???
>>945
@testが小さければ
print join("\n", @test, '');
0958nobodyさん03/08/13 10:45ID:???
>>946

while (<>) {
print $_ . "\n";
}
のつもりで書いたのか。それならば。
while (shift @test) {
print $_ . "\n";
}
レス数が950を超えています。1000を超えると書き込みができなくなります。