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

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

■ このスレッドは過去ログ倉庫に格納されています
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
060760103/08/07 18:16ID:???
>>606
マジで感謝でございます。
有難うございました。
0608あぼーんNGNG
あぼーん
0609あぼーんNGNG
あぼーん
0610nobodyさん03/08/07 18:55ID:???
>>603
$addr="192.168.0.78";
$addr=~/192\.168\.0\.(\d+)/;
if($1>=65&&$1<=94){
0611nobodyさん03/08/07 20:28ID:MNjVgF7U
あなたたち、これのどこがおかしいんですか?
とてもすばらしいじゃないですか
僕の芸術をケチつけられても困ります。

もっといい方法があるなら教えてくださいよ
0612あぼーんNGNG
あぼーん
0613nobodyさん03/08/07 20:30ID:MNjVgF7U
プレイヤー1は$play11の攻撃 プレイヤー2は$play22の攻撃

$play11 = $sentaku1
$play22 = $sentaku1
$kik = 60

$sentaku = {
$play1 = int(rand 2)
if($play1 == 0) {
$kik
}
}
else($play1 == 1) {
$bougyo = int(rand 5)
if($bougyo =< 1){
0;
else($bougyo >= 2) {
1;
}
{
$panti = int(rand 5);
if($panti == 0) {
$panti1 = 10;
else($panti > 0) {
$panti2 = 20;
}
* $bougyo;
}
}
0614nobodyさん03/08/07 21:24ID:???
もう来るなと言ったろ
0615nobodyさん03/08/07 22:51ID:???
それ、エラーチェックしてんの???????????????


とりあえず、まず文法守れや。
0616nobodyさん03/08/08 00:55ID:???
foreachは
foreach $a ($b) {}
とするか
foreach ($b) {}
とするのはどっちのほうがいいのですか?
0617nobodyさん03/08/08 01:05ID:???
>>616
ケースバイケース。
後者は $_ に入るだけだから、うまく使い分ける。
0618nobodyさん03/08/08 01:06ID:XW8ex5pf
あるCGIに半角カナも投稿出来るように改造したいなと思い、
ライブラリ、jcode.plをjcodeg.plに変更し、コンバート処理を
&jcode'convert(*value, sjis);
から、
&jcode'convert(*value, "sjis", "", "z");
のように変更しました。
これで一応は半角カナも文字化けせず投稿できるようにはなったんですが、
ログファイルの更新ごとに、ログファイル先頭の部分に、
「*main::valuesjisz」
という何とも意味がわからぬ文字がついてしまうようになりました...
色々いじってみたのですが、上手くいきません。
どうしたら上手く処理出来るんでしょうか...

jocdeg.pl : ttp://jo.st45.arena.ne.jp/script/
0619nobodyさん03/08/08 01:16ID:???
>>618
これでやってみそ。

&jcode'h2z_sjis(*value);
0620nobodyさん03/08/08 01:21ID:RBuH2Puu
プレイヤー1は$play11の攻撃 プレイヤー2は$play22の攻撃

$play11 = $sentaku1
$play22 = $sentaku1
$kik = 60

だけど、エラーが出ます。なんでエラーでるんすか?
イフとエルスの置き方はちゃんとしてますよ。
ふざけてますね。
0621あぼーんNGNG
あぼーん
0622nobodyさん03/08/08 01:23ID:???
なんでそんなんも分からん状態で質問してんのさ。
最低限文法とか調べてや。
ふざけてるのは(ry

単純文の終わりにはセミコロンがいるよ。
0623nobodyさん03/08/08 01:25ID:???
>611 :nobodyさん :03/08/07 20:28 ID:MNjVgF7U
>あなたたち、これのどこがおかしいんですか?
>とてもすばらしいじゃないですか
>僕の芸術をケチつけられても困ります。
>
>もっといい方法があるなら教えてくださいよ
0624あぼーんNGNG
あぼーん
0625nobodyさん03/08/08 01:31ID:???
キリないから相手にするなって
062661803/08/08 01:41ID:???
>>619
どうもありがとうございます。
早速やってみたところ、500 Internal Server Errorが出てしまいました(~_~;)
他に手立てはないでしょうか?
よろしくお願いします。
0627nobodyさん03/08/08 01:46ID:???
>>626
ちゃんとエラーの読める環境で試しましょう。
0628nobodyさん03/08/08 01:55ID:???
>>618さん
&jcode::convert(\$value, "sjis", "", "z");
と書いてもダメぽ?
062961803/08/08 02:05ID:???
>>628
エラーも出ず、ログファイルも正常に更新されました!!
どうもありがとうございます!(^^)!
0630nobodyさん03/08/08 02:41ID:RBuH2Puu
攻撃
イフキック

エルス、パンチ(イフ、命中(イフ、5分の1で会心の一撃
             (エルス、普通
       (エルス、ミス

と言う様に、イフの中に、さらに3重、4重にイフやエルスを
クませることってできますよね?

あと、エラー出ても、500さーバーエラー、中見が悪いって内容の
エラーしか出ないんですけど、どこが悪いか詳細の出すことできないっすか?

自分のパソコンにアクティブ入れると、詳細出ますかね?
0631nobodyさん03/08/08 02:43ID:???
各生徒のテストの成績データをperlで扱うとき、どのようなデータ型を使うのが
ベストでしょうか?DBは使わないとします。

要するに、行が色々なテスト名、列が生徒名となっているような典型的なテーブルです。
0632nobodyさん03/08/08 02:50ID:???
>>631
ハッシュでいいんじゃないの?
0633nobodyさん03/08/08 02:56ID:???
生徒名・テスト名から点数にアクセスできるようにしたいのですが、
ハッシュだとキーはどうなりますか?
0634nobodyさん 03/08/08 03:01ID:???
リファレンスでも勉強してくれば〜??
0635nobodyさん03/08/08 03:53ID:???
>>631
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perllol.html
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html
0636あぼーんNGNG
あぼーん
0637あぼーんNGNG
あぼーん
0638あぼーんNGNG
あぼーん
0639あぼーんNGNG
あぼーん
0640あぼーんNGNG
あぼーん
0641nobodyさん03/08/08 04:32ID:RBuH2Puu
攻撃
イフキック

エルス、パンチ(イフ、命中(イフ、5分の1で会心の一撃
             (エルス、普通
       (エルス、ミス

と言う様に、イフの中に、さらに3重、4重にイフやエルスを
クませることってできますよね?

0642nobodyさん03/08/08 04:34ID:RBuH2Puu
こうなる
プレイヤー1は$play11の攻撃 プレイヤー2の$play22の攻撃;

$play11 = $sentaku1;
$play22 = $sentaku1;
$kik = 60;
$sentaku = {
$play1 = int(rand 2);
if($play1 == 0) {
$kik;
}
}
else($play1 == 1) {
$bougyo = int(rand 5);
if($bougyo =< 1){
0;
else($bougyo >= 2) {
1;
}
{
$panti = int(rand 5);
if($panti == 0) {
$panti1 = 10;
else($panti > 0) {
$panti2 = 20;
}
* $bougyo;
}
}
0643nobodyさん03/08/08 04:44ID:???
>>642
どこでPerlを学んだ?
0644nobodyさん03/08/08 04:44ID:RBuH2Puu
フセイン
イフ捕まる(アメリカに核を落とす

エルス捕まらない(イフ包茎じゃない(イフ、オレは天才(オレを総理に
                         逆らう者北朝鮮へ
                 (エルス、オレは天才じゃない
                          (世界を滅ぼす
        (エルス包茎(世界を滅ぼす

と言う様に、イフの中に、さらに3重、4重にイフやエルスを
クませることってできますよね?
0645nobodyさん03/08/08 04:48ID:???
>>644
もう寝れ。二度とくるな。基本的な文法くらいわかってから来い
0646nobodyさん03/08/08 04:49ID:RBuH2Puu
10日でおぼえる
Perl/CGI
入門教室

<h1>定価2800円
税なし
0647nobodyさん03/08/08 04:51ID:???
>>646
俺もそれ読んだが、それ読んで、なんで>>644なんだ?
その本を理解するまで読んどけ
0648nobodyさん03/08/08 04:54ID:RBuH2Puu
おれのパーるは動かないぞ
サーバーはエラーばっか出しヤガル
自分のパソコンにアクティブ入れようか考え中
0649nobodyさん03/08/08 04:54ID:???
ところで全然関係ないけど。

今日、オートロードってヤツをなんと初めて知った。恥ずかしい限り。
見た瞬間感動しちまった初心者な自分。
うん、いいね。あれ。

それだけです。
0650nobodyさん03/08/08 04:55ID:RBuH2Puu
おみくじの部分を入れかえて
パわーアップさせたら、そうなった
0651nobodyさん03/08/08 04:56ID:RBuH2Puu
この本、全然使えないな
0652nobodyさん03/08/08 04:56ID:???
>>649
名前しか知らない。解説して。




ぐぐるの面倒だ
0653nobodyさん03/08/08 04:57ID:???
>>651
使えないのはお前の脳みそです。
俺はそれでPerl始めましたから。
かなりわかりやすい本だと思いますが?
0654nobodyさん03/08/08 04:58ID:RBuH2Puu
3000円返せ
0655nobodyさん03/08/08 05:01ID:RBuH2Puu
半か丁かのところで
半を選ぶ

そこにさらに半を選ぶと、半か丁か選ばれて内容がかわる

半か丁かを簡単に改造しただけなんだが
この始末だ

10日でおぼえるどころか、1日目から動かない
この本、だめすぎ
0656nobodyさん03/08/08 05:04ID:???
>>655
解説嫁。カスガ。けなすな、人が気に入ってる本を








と、反応してしまう自分が悲しい
0657nobodyさん03/08/08 05:13ID:RBuH2Puu
わかった
if($bougyo =< 1){

の=と<が逆だな
56Pでわかったよ
これで動きそうだ
0658nobodyさん03/08/08 05:30ID:fJ1eIuTw
>>657
いや、報告しなくていいから。
ここはあんたの日記帳じゃないんだし。
0659nobodyさん03/08/08 05:41ID:???
ゲームで、対戦で、攻撃はパンチとキック、どちらかは2分の1パンチの場合は、5回に1回はダメージ低い。さらに5分の2の確率でミスをする。
--------------
実行してないから動くのか知らんけど暇つぶしに。誰が攻撃するのか分からんかったからこう書いた。
--------------
srand;
if($mode == 1){
 $offense = \%you;
 $defense = \%my;
}elsif($mode == 2){
 $offense = \%my;
 $defense = \%you;
}
if( int(rand(2)) ){
 #punch
 $damage =
  $offense->{'攻撃力'} - $defense->{'守備力'};
 if(!$rand = int(rand(5))){
  #half
  $damage = int($damage / 999);
 }elsif($rand < 3){
  #miss
  $damage = "";
 }
}else{
 #kick
 $damage =
  $offense->{'攻撃力'} - $defense->{'守備力'};
}
($damage < 0) and ($damage = 0);
$defense->{'HP'} -= $damage;
0660nobodyさん03/08/08 05:44ID:???
>>652
間違って存在しないサブルーチンに飛んだら、エラーを発生させず、特定のサブルーチンに移動してもらう昨日。
引数もちゃんと受け継がれる。
変数名で飛んでくルーチンを指定してる時とか便利かも。

使いかたは検索して。
0661nobodyさん 03/08/08 05:44ID:???
fJ1eIuTw は自演か?

二度と来るな!
0662nobodyさん03/08/08 05:51ID:???
>>661
違う。頭の柔軟体操のため、作ってみただけ。
スマソ。
066366203/08/08 05:58ID:???
>>661-662
勘違い起こした。fJ1eIuTwは、>>658だったのね。
恥ずかしい勘違いレスをしてしまった。汗
0664nobodyさん03/08/08 06:27ID:???
RBuH2Puuって、ちょっと前に探してますスレにいた粘着と行動が似てるな。
0665nobodyさん03/08/08 06:32ID:???
>>660
知らなかった。いいこと知った。
0666nobodyさん03/08/08 06:34ID:???
別に>>658は自演じゃないべ。
0667nobodyさん03/08/08 08:09ID:???
自分も以前、半角カナのやつで行き詰まったことがあるけど、適当にいじってたら投稿できるようになった。

if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
jcode::convert(\$buffer, 'euc');
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
てな感じで…

チャットなんもんで、htmlで出力してるんだけど
ヘッダには charset=Shift_JIS って書いてる。
でも文字化け全然しない…
不思議……(@▽@;)
0668nobodyさん03/08/08 13:11ID:???
>>659
お前はバカか?やるなら荒らしと廃スレでやれや
0669nobodyさん03/08/08 14:21ID:awu4UezK
配列のなかの要素(数字)をすべて足した数値を出すには
foreachを使うのが一番いいのでしょうか?
0670nobodyさん03/08/08 14:45ID:???
>>669
map でも良さそうですね。
0671nobodyさん03/08/08 14:49ID:???
>>667
IEで見てんじゃねーの
0672nobodyさん03/08/08 15:25ID:???
>>669-670
<q cite="http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlstyle.html">
戻り値をただ単に捨ててしまうような void 文脈で、grep()やmap()、
`backticks` (訳注: `ls`のようにバッククォートで括った実行文のこと)
を使うことは避けましょう。そういった関数はすべて戻り値を持って
いるのですから、それを使うべきです。戻り値に用がないのであれば、
代わりにforeach()を使ったループか system()関数を使いましょう。
</q>
0673nobodyさん03/08/08 16:17ID:???
>>669
$ perl -e '@array=(1,2,3);print eval join("+",@array);'
0674nobodyさん03/08/08 16:22ID:???
:で区切られた文字列があります。
もし、 : の後にhogehogeがあるなら、:から:までを消すのはできたんですが
   ※こんな感じで s/:hogehoge.*?://g
その逆の、 : の後にhogehogeが ない なら、:から:までを消す 方法を教えてください。
0675nobodyさん03/08/08 16:30ID:???
age
0676あぼーんNGNG
あぼーん
0677あぼーんNGNG
あぼーん
0678あぼーんNGNG
あぼーん
0679あぼーんNGNG
あぼーん
0680あぼーんNGNG
あぼーん
0681nobodyさん03/08/08 16:47ID:RBuH2Puu
#!/usr/bin/perl

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

srand;
if($mode == 1){
$offense = \%you;
$defense = \%my;
}elsif($mode == 2){
$offense = \%my;
$defense = \%you;
}
if( int(rand(2)) ){
#punch
$damage =
$offense->{'攻撃力'} - $defense->{'守備力'};
if(!$rand = int(rand(5))){
#half
$damage = int($damage / 999);
}elsif($rand < 3){
#miss
$damage = "";
}
}else{
#kick
$damage =
$offense->{'攻撃力'} - $defense->{'守備力'};
}
($damage < 0) and ($damage = 0);
$defense->{'HP'} -= $damage;
0682nobodyさん03/08/08 16:52ID:RBuH2Puu
これで動かないんですけど、
あと何が必要ですか?
キャラはPlayer1とPlayer2
Player1はHP400、キック力は60、パンチ力は20、防御力は10
Player2はHP300、キック力は100、パンチ力は40、防御力は0

とりあえず1回動かしてみないと、先にすすめないし、
勉強もできない
困ったもんだ
0683nobodyさん03/08/08 16:55ID:dNGBD9SF
%Japan = (
       'tokyo' => [ qw(新宿 渋谷 原宿 池袋 秋葉原) ] ,
       'kanagawa' => [ qw(横浜 藤沢 厚木 茅ヶ崎 横須賀) ] ,
   );
という感じのデータで、$Japan{tokyo}を配列としてforeachでぐるぐる回したいのですが、
どのようにすればいいのでしょう?
foreach ( @$Japan{tokyo} ) { print; }
とやったのでは出来ませんでした。



0684nobodyさん03/08/08 16:59ID:???
Perlの初心者スレが無かったのでここで質問です。

サーバ上のPerlのバージョンを調べたいのです。
Niftyを利用しているのですが、
説明のページにもPerl5としかかかれておらず細かいところがわかりません。
#例えば5.6なのか5.8なのか不明だったり

Perlスクリプトで調べるにはどうやれば良いのでしょうか。
因みにNiftyはtelnet不可で標準モジュールも全く使えません。
0685nobodyさん03/08/08 17:11ID:???
>>684
#! /usr/local/bin/perl

print 'Content-Type: text/html',"\n\n";
print '<html>';
print $];
print '</html>';

ってな感じのCGIを設置してアクセスする。
0686nobodyさん03/08/08 17:14ID:???
#質問でsageてた

>685
ありがとうございます。
5.00503だとわかりすっきりしました。
068767403/08/08 17:17ID:???
…かいけつしますた
0688nobodyさん03/08/08 17:17ID:???
>>683の質問ムズイ(;´Д`)・・・これが解ければリファレンスが理解できた事になるかな・・・
068968803/08/08 17:20ID:???
と思ったら、ぐぐったらあっさり解決したよ(´・ω・`)ションボリ

>>683
foreach (@{$Japan{tokyo}})

括弧ひとつ余計につけないとダメらしい
0690nobodyさん03/08/08 17:33ID:RBuH2Puu
#!/usr/bin/perl

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

# Player1
$HP = 400;
$KIK = 60;
$PAN = 20;
$DF = 10;

# Player2
$HP = 300;
$KIK = 100;
$PAN = 40;
$DF = 0;

# Player1
$kougeki1 = srand;

# Player2
$kougeki2 = srand;

srand;
if($mode == 1){
$offense = \%you;
$defense = \%my;
}elsif($mode == 2){
$offense = \%my;
$defense = \%you;
}
0691nobodyさん03/08/08 17:33ID:RBuH2Puu
if( int(rand(2)) ){
#punch
$damage =
$offense->{'$PAN'} - $defense->{'$DF'};
if(!$rand = int(rand(5))){
#half
$damage = int($damage / 999);
}elsif($rand < 3){
#miss
$damage = "";
}
}else{
#kick
$damage =
$offense->{'$KIK'} - $defense->{'$DF'};
}
($damage < 0) and ($damage = 0);
$defense->{'HP'} -= $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>Player2は<big>>$kougeki2</big>のダメージを与えた。</p></body>\n";
print "</html>";
0692nobodyさん03/08/08 17:34ID:RBuH2Puu
やっぱ動かない
考えるか
0693nobodyさん03/08/08 17:37ID:???
>>RBuH2Puu

わざわざ貼らんでよろしい。
0694nobodyさん03/08/08 17:39ID:???
スルーでお願いします
0695nobodyさん03/08/08 17:57ID:RBuH2Puu
動くまで貼るけどな
0696nobodyさん03/08/08 18:04ID:???
一生貼り続けるってことだね( ´,_ゝ`)プッ
069768303/08/08 18:13ID:???
>>688さん
ありがとうございます!見事に出来ました!
それにしても、やっぱりリファレンスって難しいんですね…。

0698nobodyさん03/08/08 20:00ID:???
つーかattackとかkickとかしろよ、名前
KIKって(;´Д`)
0699nobodyさん03/08/08 20:02ID:???
>>659
が余計なコト書くから。
RBuH2Puuがわけの分からん行動はじめた。
0700nobodyさん03/08/08 20:13ID:???
ぷうまだ居たんだ。
0701nobodyさん03/08/08 20:25ID:???
もうすでに意地になってるだけだろ。一番ダサいパターンだ。
0702nobodyさん03/08/08 20:28ID:???
($damage < 0) and ($damage = 0);
$defense->{'HP'} -= $damage;
0703nobodyさん03/08/08 20:35ID:???
ある変数を複数の条件で比較したいのですがどうすれば良いのでしょう。
例えば$hogeは$fooか$barか$baz以外の値であればエラーとしたくて
if ($hoge ne ($foo or $bar or $baz)){&error(不正な値が混じってます);}
のように書いたりしたのですがダメでした。
0704nobodyさん03/08/08 20:39ID:???
if (($hoge ne $foo) or ($hoge ne $bar) or ($hoge ne $baz)){&error(不正な値が混じってます);}
0705nobodyさん03/08/09 01:40ID:???
>>704
書いた本人もわかってると思うけど、orはandの間違いだよね。
0706nobodyさん03/08/09 02:34ID:9s2Ca0tO
# Player1
$HP = 400;
$KIK = 60;
$PAN = 20;
$DF = 10;

# Player2
$HP = 300;
$KIK = 100;
$PAN = 40;
$DF = 0;

# Player1
$kougeki1 = srand;

# Player2
$kougeki2 = srand;
■ このスレッドは過去ログ倉庫に格納されています