トップページphp
329コメント113KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/08/14 06:06ID:xOc/6R60
いらっしゃーい、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
030530303/08/20 16:34ID:???
>>304さん、ありがとです。
動いております。並び換えられているようです。
しかしながら、map童貞には、何故動いてるかわからんです(まだ1行目を理解しただけ)。
正直おっかないですw
030630303/08/20 16:57ID:???
for($i = @time;$i != 1;$i--){
  for($j = 0;$j < (@time - 1);$j++){
    if($time[$j] < $time[($j + 1)]){
      $tmp = $time[$j];
      $time[$j] = $time[($j + 1)];
      $time[($j + 1)] = $tmp;

      $tmp = $list[$j];
      $list[$j] = $list[($j + 1)];
      $list[($j + 1)] = $tmp;
    }
  }
}
結局こんなのを書いて逃げてしまう漏れは駄目ぽです。
>>304さん、こちらでとりあえずお茶濁しときます。
perlらしい書き方も勉強せねばならんです。イキナリ読めなくなる。
0307nobodyさん03/08/20 17:44ID:???
>>306
@file と @time でやるなら

my @file = readdir DIR;
my @time = map { (stat $_)[9] } @file;

# 添え字を時刻昇順でソート
foreach (sort { $time[$a] <=> $time[$b] } 0..$#file) {
 print(scalar localtime $time[$_], " $file[$_]\n");
}

こういうのは Perl 的な慣用句だけど、難しい事はしてないから
関数リファレンス片手に順番に読み解けばすぐ理解できるよ。
0308nobodyさん03/08/20 20:13ID:???
>>303
mapはforeachの亜種と思えば良いとおもう。
覚えとくと便利。手放せない。まじ。
基本的には右側の配列を順番に回してるだけ。
@array1 の要素を「:」で区切って2次元配列にする↓
@array2 = map { [ split ':', $_ ] } @array1;

foreach ( @array1 ) {
push(@array2, [ split ':', $_ ]);
}
がおんなじ。
0309nobodyさん03/08/20 21:49ID:Loi9JQvi
telnetで接続できるBBSをPerlで書こうと思っています。
現在、
http://x68000.startshop.co.jp/~68user/net/echo-3.html
のechoサーバを参考に作っているところなのですが、
いかにしてキー入力を取得するかで悩んでいます。

現在、標準入力からそのまま取得しているのですが
これでは、BSやDELが効きません。
#入力された文字列がそのまま表示されてしまうため
#パスワードの入力にも使えません。

sub lineinput {
my ($mes) = @_;

print CLIENT $mes;
my $line = <CLIENT>;

$line =~ s/\x0D?\x0A?$//;
return $line;
}

どなたか、このような場合の一行入力ルーチンを
ご存知の方はいらっしゃいませんか?
0310nobodyさん03/08/20 22:13ID:???
>>309
参考になるかどうか分からんが。
http://search.cpan.org/author/AUTRIJUS/OurNet-BBS-1.65/
0311nobodyさん03/08/21 01:12ID:???
>>306
とりあえず入力ルーチンを入れろ。
それと一回ファイルを削除して、復元しろ。わからないところ、間違っているところが表示される。
0312nobodyさん03/08/21 01:13ID:???
#!/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;
0313nobodyさん03/08/21 01:13ID:???
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'};
}
0314nobodyさん03/08/21 01:13ID:???
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'};
}
0315nobodyさん03/08/21 01:14ID:???
($damage < 0) and ($damage = 0);
$defense->{'HP1'} -= $damage;

($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>$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>";
0316nobodyさん03/08/21 01:15ID:???
>>306

2行目に
open (IO,"+<$logfile");
5行目に
while (<IO>){
 if ($_ =~ /<>$ip/){
  @y2=split(/<>/,$_);
  if ($y2[6] ne $ip){
   push(@log,$_);
  }else{
   $y2[0] = 'All Clear (^-^)v';
   $y2[5] = 'All Clear (^-^)v';
   push(@log,"$y2[0]<>$y2[1]<>$y2[2]<>$y2[3]<>$y2[4]<>$y2[5]<>$y2[6]<>$y2[7]<>\n");
  }
 }else{
  push(@log,$_);
 }
}
を入れろ。
0317nobodyさん03/08/21 01:16ID:???
      ____
     /∵∴∵∴\             彡川川川三三三ミ〜
    /∵∴∵∴∵∴\             川|川/  \|〜 プゥ〜ン
   /∴.-=・=-  -=・=-|           ‖|‖ ◎---◎|〜
   |∵∵/  | |  \|           川川‖    3  ヽ〜
   |∵ /    (・・)    |          川川    ∴)д(∴)〜
   |∵ |    ∈∋   |           川川      〜 /
    \|        /           川川‖    〜 /
      \____/            川川川川___/
             目障りだから失せろ
    ┏━━━━┓───────→┏━━━━━┓ 
    ┃ 塔   矢 ┃               ┃ Perlオタ  ┃ 
    ┗━━━━┛←───────┗━━━━━┛ 
     ↑ │    あまり関わりたくない   ↑  │
     │ │            .          │  │
     │ │実は馬鹿に    死んでほしい│  │
     │ │している。     くたばれ   │  │
     │ └──→ ┏━━━━┓───┘  │
     │.       ┃ 真  世 ┃          │
     └─────┗━━━━┛←────┘
     どうでもいい   ____    Perlオタは死ね!!
              /:::::::::::::::::::::::\   
             /::::::::::::::::::::::::::::::::::\
            /::::/ .ヽ:::::::::::::::::::::::::::::|
           │::ノ   ヽヽヽヽヽ ヽ |
            (6   -=・=-  -=・=-│
            │     .| |     |   
            |       (・・)     | 
             \    ∈∋   /
               \____/        
0318nobodyさん03/08/21 01:18ID:???
  ふざけた質問してんじゃねーぞ!!このクソオタ野郎
  てめーのIP調べてやっからな!!
  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ∧_∧
      (・∀・ ) ≡≡≡3        シィィィイイッ!? ジィ゙ィ゙ィ゙ィ゙ィ゙ィ゙ィ゙ィ゙ィ゙ィ゙ッ゙!!?
   ⊇○⊆と  ) __ ≡≡≡3    ハギャァーーーーーッ!! ドメ゙デェ゙ェ゙ェ゙ッ゙!!
   ,ー//(⌒( ノニ二,ーヽ、 ̄'ヽ.,, (´⌒;;                 ,;(´(´⌒;"'
  ( (i(@ij)~ロ(_ノ国((=(@ij)≡≡(´⌒ー-、.,    ,∧,λ∩,,,,,≡≡≡(´⌒;(´⌒;;"≡≡3
  ヽ.,_,.ノ,; .・ , ; ': ヽ.,_,.ノ,.;ツ (´;⌒(´⌒;;' ~ヽ⊂》(#>;0<)← >>303;;;;;;;;つ,.;ツ:(´(´⌒;;,'≡≡≡≡3
  ブロロロロロロ・・・    ゛ ' '"; '; ・        ゙゙゙'゛""゙゙゙''; (´⌒;,(´,(´⌒;;'"
                              ズザザザザザザザザザザザザザーーーーッ

    マターリ厨の偽モナーや偽モララーは一緒に制裁だからな
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ∧_∧
              (・∀・ ) ≡≡≡3              ヤメロー!
           ⊇○⊆と  ) __ ≡≡≡3           な、何でオレまでーーーーーっ!!
           ,ー//(⌒( ノニ二,ーヽ、 ̄'ヽ.,, (´⌒;;                 ,;(´(´⌒;"'
          ( (i(@ij)~ロ(_ノ国((=(@ij)≡≡(´⌒ー-、.,    ,∧_λ∩,,,,,≡≡≡(´⌒;(´⌒;;"≡≡3
          ヽ.,_,.ノ,; .・ , ; ': ヽ.,_,.ノ,.;ツ (´;⌒(´⌒;;' ~ヽと》(# >∀・);;;;;;;;つ,.;ツ:(´(´⌒;;,'≡≡≡≡3
          ブロロロロロロ・・・    ゛ ' '"; '; ・        ゙゙゙'゛""゙゙゙''; (´⌒;,(´,(´⌒;;'"
                                    ズザザザザザザザザザザザザザーーーーッ
0319nobodyさん03/08/21 03:26ID:???
中途半端に荒しやがって。
どうせならどんと荒してアク禁になれよな。
0320nobodyさん03/08/21 12:36ID:DAq1ln5w
#=============================================================================
# クッキー書き込み
# &cookie_regist(クッキー名, データ, 日数);
# ・クッキー名 ⇒ クッキーの名称、半角英数字
# ・データ ⇒ キー!値,キー!値,キー!値 の書式で整えられたデータ
# ・日数 ⇒ 保存しておく日数(ただし、sessionと入力すると、
#  セッションクッキーとなる(ブラウザを閉じたらクッキーは削除される)
# ★注!:キー値に「!と=と;は使わないこと」
#例文:
#&cookie_regist("session","sessionid!246",1/24);
#-----------------------------------------------------------------------------
sub cookie_regist(){
local($cookiename, $cookievalue, $cookiedate) = @_;


($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + 60*60*24* $cookiedate );
@mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
$date_gmt = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT",
$week[$wday], $mday, $mons[$mon], $year+1900, $hour, $min, $sec);
if ($cookiedate ne "session"){
print "Set-Cookie: $cookiename=$cookievalue; expires=$date_gmt\n";
} else{
print "Set-Cookie: $cookiename=$cookievalue\n";
}
}
という関数をつくったのですが、(長いので次のレスに続きます)
032132003/08/21 12:38ID:DAq1ln5w
すいません、タブを全角スペースにするの忘れたので見づらいので、書き直します。
#=============================================================================
# クッキー書き込み
# &cookie_regist(クッキー名, データ, 日数);
# ・クッキー名 ⇒ クッキーの名称、半角英数字
# ・データ ⇒ キー!値,キー!値,キー!値 の書式で整えられたデータ
# ・日数 ⇒ 保存しておく日数(ただし、sessionと入力すると、
#  セッションクッキーとなる(ブラウザを閉じたらクッキーは削除される)
# ★注!:キー値に「!と=と;は使わないこと」
#例文:
#&cookie_regist("session","sessionid!246",1/24);
#-----------------------------------------------------------------------------
sub cookie_regist(){
    local($cookiename, $cookievalue, $cookiedate) = @_;
    

     ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + 60*60*24* $cookiedate );
    @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
    $date_gmt = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT",
     $week[$wday], $mday, $mons[$mon], $year+1900, $hour, $min, $sec);
    if ($cookiedate ne "session"){
        print "Set-Cookie: $cookiename=$cookievalue; expires=$date_gmt\n";
    } else{
        print "Set-Cookie: $cookiename=$cookievalue\n";
    }
}
という関数をつくったのですが、(長いので次のレスに続きます)
032232003/08/21 12:41ID:DAq1ln5w
&cookie_regist("hoge_session","hoge_sessionid!".$in{cust_code},180);
みたいにしてクッキーをセットすると、
ネスケでは、180日有効なクッキーがセットされるのですが、
IEだと、セッションクッキー(ブラウザを閉じると削除されるクッキー)に
なってしまいます。

どこがおかしいのでしょうか?
032332003/08/21 13:29ID:???
すいません、自己レス。いつのまにか、
@mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
のあとの
@week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
を消してしまっていたことが原因でした。

しかし、ネスケでexpireを強引に認識してくれて、IEだと無視されるとは・・・
(逆なら納得いくんだが)

ともかく解決しました。すみません。
0324nobodyさん03/08/21 15:29ID:pPohBqhp
PHPの質問で数値の表示方法についての質問なんですが、数値の計算で
例えば
10×1.05 をやると 10.5
になるのですがこれの小数点以下を切り捨てたいのですが、どうすれ
ば良 いのでしょう。number_format関数を使えば小数点以下の修正が
行なえるというのは知っているのですが、number_format関数を使うと
1000などの数値の時、1,000となり","(カンマ)が表示されてしまい、数
値として認識しなくなってしまいます。
この計算の後にもさらに計算をしたいので、数値として認識させなけれ
ばならないので、こまっています。
どうぞご指導をよろしくおねがいします。
0325nobodyさん03/08/21 15:32ID:???
>>324
ここPerlだしPHPよく知らんけど、

$formated_number と $number と別にすればいいんでないの?
0326nobodyさん03/08/21 15:34ID:???
なんでPHPの質問板でしないの?
floatだっけか忘れた。
0327nobodyさん03/08/21 15:42ID:pPohBqhp
ごめんなさい。間違えました!
※ちなみに$numberと$formated_numberを使ってみたところfatal error
になっちゃいました。
すみません。迷惑かけました。ありがとうございました。
0328nobodyさん03/08/21 17:56ID:DAq1ln5w
"私は39歳のオヤジで2人の子供がいます。"
という文字列に対して、全角数字を半角数字に置換したいのですが、
どうすればいいのでしょうか?
(文字列も、スクリプト自体も、文字コードはEUCです)
0329nobodyさん04/03/26 19:55ID:???
タイムスリップ記念
■ このスレッドは過去ログ倉庫に格納されています