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

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

レス数が900を超えています。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
0809nobodyさん03/08/10 14:29ID:???
>>800
my ($year, $mon, $mday, $hours, $min) = unpack('A2A2A2A2A2', $packed_data);
で返った値をtimegm();につっこむ。$mon-1と$year+100を忘れずに。

>>802
useは@INCを辿ってモジュールを探して、
見つけたら読み込んでimportメソッドを実行する。
importされた関数、変数などが別名(エイリアス)で扱えるようになる。
コンパイル時に処理される。
@ISAはクラス内に呼び出されたメソッドがない場合、
@ISAを辿って目的のメソッドを探して実行するようになる。
実行時に処理される。
0810nobodyさん03/08/10 16:29ID:???
>>809さん、どうも有り難うございます。勉強のために、以下のスクリプトを
作ってみました。

package AB;
sub aloc {
my ($pkg, $a, $b) = @_;
my $obj = bless {"a" => $a, "b" => $b}, $pkg;
return $obj;
}
1;
0811nobodyさん03/08/10 16:30ID:???
(続き)
package X;
use AB;
@ISA = ('AB');
sub new {
my ($pkg, $a, $b, $x) = @_;
my $obj = $pkg->aloc($a, $b);
$obj->{"x"} = $x;
return $obj;
}
1;

#!/usr/bin/perl
use X;
$q = X->new('A', 'B', 'X');
$ans = $q->{'x'};
print "$ans\n"; # Xと表示、OK

試しに、パッケージXの@ISAの行をコメントにしてみると、alocが見つから
ないと言われます - 当然です。
そこで、パッケージABの2行目に、
use Exporter; @ISA = ('Exporter'); @EXPORT_OK = ('aloc');
を挿入し、パッケージXのuseを
use AB('aloc');
に変更してみたら、上手く行きました。

ということで、useと@ISAの機能は分かりましたが、今度は、ABやXのような
クラスを実装する場合、Exporterで輸出するのが良いのか、それとも@ISAで
継承するのが良いのか、が分からなくなりました。
0812あぼーんNGNG
あぼーん
0813nobodyさん03/08/10 16:31ID:c9slSjrq
srand;
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'};
}
0814nobodyさん03/08/10 16:32ID:c9slSjrq
srand2;
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;

($damage < 0) and ($damage = 0);
$defense->{'HP2'} -= $damage;
0815nobodyさん03/08/10 16:32ID:c9slSjrq
# 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>";
0816あぼーんNGNG
あぼーん
0817nobodyさん03/08/10 16:37ID:???
ID:c9slSjrq 取り敢えず、NGワードっと、
↓ハイ、次の方どうぞ
0818あぼーんNGNG
あぼーん
0819あぼーんNGNG
あぼーん
0820あぼーんNGNG
あぼーん
0821あぼーんNGNG
あぼーん
0822あぼーんNGNG
あぼーん
0823nobodyさん03/08/10 17:21ID:???
>>c9slSjrq
にゅ速で美味しんぼ連載してるひと?
0824nobodyさん03/08/10 17:28ID:???
だいたいPerlで変なゲーム作ろうとしてる意図が不明。
0825nobodyさん03/08/10 17:47ID:???
キチガイのやることを理解などできるわけがない。
0826nobodyさん03/08/10 19:14ID:???
ID:c9slSjrqの情報調べてみたけど、やっぱり小学生だったよ。
0827nobodyさん03/08/10 20:43ID:???
>>810-811
継承が必要なら@ISAを使う、隠蔽したいなら使わない。かな。
(深く考えた事ないですね。オブジェクト指向なら継承しとけみたいな。)

モジュールはexportした方が便利かと。
(というか、するべきものだと思ってました。)

# 蛇足ですがalocはallocでは。
0828nobodyさん03/08/10 21:37ID:???
>>827さん、レス有り難うございます。

「そこで、パッケージABの2行目に、
use Exporter; @ISA = ('Exporter'); @EXPORT_OK = ('aloc');
を挿入し、パッケージXのuseを
use AB('aloc');
に変更してみたら、上手く行きました。」
と書きましたが、実行できるようにするだけなら、ここまでしなくても、
alocの呼び出しを、AB::alocとするだけで、充分ですよね。

「継承」の意味が良く分からないです(@ISA使わなくても、useで充分じゃない
のかなって思ってしまいます)。
オブジェクト指向の本質が分かってないんでしょうね。

# ご指摘のとおり、alocはallocのつもりでした。
0829nobodyさん03/08/10 22:08ID:???
>>828
Hoge.pm
--------------------------------
package Hoge;
import{ エクスポートな処理 }
--------------------------------
というものがあったとしたら、
use Hoge;
は、
BEGIN{
require Hoge;
Hoge->import;#または、import Hoge;と書いてもあり。
}
を実行しているだけ。
importメソッドがなけりゃ、
BEGIN{ require Hoge; }
と同じ。
だから、クラスによって違うのさ。
0830nobodyさん03/08/10 22:21ID:???
とあるスクリプトで時間を計算して表示させているのですが、
例えば10.99時間を10.59時間という風に小数点以下の部分を
きちんと分にする方法ってありませんか。

今は

my(@time_temp) = split(/\./, $time);
$time_temp[1] = int(60 * $time_temp[1] / 100);
$time = $time_temp[0].'.'.$time_temp[1];

とかやってるのですがもう少しすっきり出来たら良いなあと。
0831nobodyさん03/08/10 22:27ID:???
10.99時間=10.59時間じゃないだろ
何がしたいのか意味不明
0832nobodyさん03/08/10 22:27ID:???
先程それではおかしいと言う事で表示側で
$time_temp[0]時間$time_temp[1]分
としたので三行目は無しで。
0833nobodyさん03/08/10 22:48ID:???
if(length($time_temp[1]) eq "1"){$time_temp[1] = $time_temp[1] * 10;}
これ加えたほうがいいかと
0834nobodyさん03/08/10 22:54ID:???
print "何時間?\n>";
$time =<>;
chomp($time);
my(@time_temp) = split(/\./, $time);
if(length($time_temp[1]) eq "1"){$time_temp[1] = $time_temp[1] * 10;}
$time_temp[1] = int(60 * $time_temp[1] / 100);
print "$time_temp[0]時間$time_temp[1]分\n";
0835nobodyさん03/08/10 22:56ID:???
$time = sprintf(qq{%02d\.%02d},int($time),($time - int($time))*60);
0836nobodyさん03/08/10 22:57ID:???
>>836
動かしてみ
083783603/08/10 22:58ID:???
ミスった。
>>835ね
0838nobodyさん03/08/10 23:00ID:???
>>828
http://perl.infoware.ne.jp/documents/perlboot.ja.html

>>830
$time = sprintf '%02d 時間 %02d 分', $time, ($time * 60) % 60, $time;
0839nobodyさん03/08/10 23:18ID:64afxySW
perlをダラダラ書いてたら、
一つのファイルで、1500 行
を超えてしまいました。
行数が多いと何か不都合は起きますでしょうか?
お教え下さい。
0840nobodyさん03/08/10 23:27ID:STOMuStS
素朴な疑問。なんで、
print qq|<a href="hoge">fuga</a>|;
ってやればコードが見やすいのに、
いちいち
print "<a href=\"hoge\">figa></a>";
ってやってる人が多いんですか?
qqのほうが、コーディングもよけいなことあんまり考えなくて、はやくすむと思うんだけど
0841nobodyさん03/08/10 23:30ID:???
>840
それを見やすいと思うのはPerlユーザーだけ。
俺は使い分けてるけどね。
0842nobodyさん03/08/10 23:30ID:???
>>838
最後の$time要らん。

>>839
そのスクリプトを保守する人間が困らないのなら別に問題無し。

>>840
最初に覚えた方法が一番分かり易いと思い込んでいる人は多い。
もちろんその方法しか知らない人も多い。
084384003/08/10 23:41ID:???
>>841-842 レスさんくす。
なるほどねー。
自分最初にPerlおぼえて、
そのあとちょっとPHPかじって、
Javaおぼえようかなーて思ってる程度だからなー。
0844nobodyさん03/08/10 23:42ID:???
>>841
C#にも@""構文があるのに。Perlユーザだけとは心外だな。
0845nobodyさん03/08/11 00:55ID:???
print "何時間?\n>";
$time =<>;
my(@time_temp) = split(/\./, $time);
chomp($time);
if(length($time_temp[1]) eq "1"){$time_temp[1] = $time_temp[1] * 10;}
time = sprintf '%02d 時間 %02d 分', $time, ($time * 60) % 60, $time;
print "<a href=\"hoge\">figa></a>";
$time_temp[1] = int(60 * $time_temp[1] / 100);
print "$time_temp[0]時間$time_temp[1]分\n";
0846あぼーんNGNG
あぼーん
0847あぼーんNGNG
あぼーん
0848nobodyさん03/08/11 00:59ID:???
#!/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 = srand;

# Player2
$kougeki2 = srand2;
0849nobodyさん03/08/11 00:59ID:???
srand;
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'};
}
0850nobodyさん03/08/11 01:00ID:???
srand2;
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;

($damage < 0) and ($damage = 0);
$defense->{'HP2'} -= $damage;
0851nobodyさん03/08/11 01:02ID:???
# 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>$kougeki1</big>のダメージを受けて混乱した。
<p>Player1は<big>$kougeki1</big>のダメージで野原でクソをし始めた。
<p>Player2は<big>>$kougeki2</big>のダメージを与えた。</p>
<p>Player2は<big>>$kougeki2</big>のダメージを受けて裸踊りを始めた。
<p>Player2は<big>>$kougeki2</big>のダメージで光浦なみの女にレイプし始めた。</p></p></body>\n";
print "</html>";
0852nobodyさん03/08/11 01:11ID:???
>>840
単に知らないからだと思うが。
0853nobodyさん03/08/11 10:23ID:???
 
0854nobodyさん03/08/11 12:01ID:???
>>839
長くなりすぎると動きません。500行以内じゃないと動きにくいです。
ちゃんと勉強しろ!オタクやろう!!
0855nobodyさん03/08/11 12:03ID:vd5Ibrol
             ________________
     ∧_∧∩ /
    ( ´∀`)/<真珠のPerlと何が違うんですか!?
 _ / /   /   \___________________
\⊂ノ ̄ ̄ ̄ ̄\
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
    .||          ||
0856nobodyさん03/08/11 12:04ID:???
      , ' s    \::::::::::::i
     /"""''/ーナ-t----|
.    /   ,.‐   ⌒    /ヘ
    {入|(・)  (・)    |||||||   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
      |⊂⌒◯-------9)  <    まだ、動かないぜ!ベイビー!!
      | |||||||||_    |    \_______
       \ ヘ_/ \ / ̄`\、
.        \、__ i⌒i/, -'"~  `ヽ、
       ,.‐'´   i--i        \
       `〈ヽ, -'"~T  ヽ、 , -'" ~ `ヽ、
       / ( ̄ T   iヽ、__     \.
     /    ( ̄T   |   `ヽ、    }
    く       ̄ `ヽ、/__        /
0857nobodyさん03/08/11 12:07ID:???
   ___________________
   || ($damage < 0) and ($damage = 0);
   || $defense->{'HP1'} -= $damage;はダメージ
   ||           ∧_∧   。
   ||         (  ^^ )/
    ̄ ̄ ̄ ̄ ̄ ̄ (    つ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                /  ̄ ̄ ̄ ./| lヽ──────────────
                | ̄ ̄ ̄ ̄| | | ダメージを受けると、糞をもらします
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|____|/ |
                        ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ∧ ∧    ∧,,∧   ∧ ∧
    (・,, ∧▲  ミ  ∧ ∧ (  ∧ ∧
  〜(_(  ∧ ∧_( ∧ ∧_ミ・д・∧ ∧
    @(_(,,・∀・)@ (   *)〜ミ_ (   ,,)
      @(___ノ 〜(___ノ    〜(___ノ
0858nobodyさん03/08/11 13:19ID:???
2chって、鯖/カテゴリ/.../dat/
でアクセスして表示しますよね?
これってこの全てのディレクトリの下にindex.htmlか.cgiかなにかを置いてあって、
それを表示してるってことですよね?
でも
鯖/カテゴリ/.../dat/
これでアクセスしたときと、
鯖/カテゴリ/.../dat/index.htmlでアクセスしたときと、
表示が微妙に違うんです。

どういう仕組みで表示させてるんでしょうか?
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:???
だな
レス数が900を超えています。1000を超えると表示できなくなるよ。