Perl コーディング初心者質問コーナー Part27
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/08/14 06:06ID:xOc/6R60【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
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
0301nobodyさん
03/08/20 15:26ID:???0303nobodyさん
03/08/20 15:45ID:ynfrwlt/readdir()で取得したリスト@file_listを
for($i = 0;$i < @file_list;$i++){
$time[$i] = (stat("$file_list[$i]"))[9];
}
で取得した最終更新日でソートしたいのですが。
@timeをソートした時に、同じ順番で@file_listもソートするような事は
どうしたらいいでしょうか?
お願いします。
0304nobodyさん
03/08/20 15:59ID:???ファイルリスト取得時から根本的に変えると
my @file = map { name => $_, time => (stat $_)[9] }, readdir DIR;
map { scalar localtime $_->{'time'}, " $_->{'name'}\n" }
sort { $a->{'time'} <=> $b->{'time'} }
@file;
0305303
03/08/20 16:34ID:???動いております。並び換えられているようです。
しかしながら、map童貞には、何故動いてるかわからんです(まだ1行目を理解しただけ)。
正直おっかないですw
0306303
03/08/20 16:57ID:???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:???@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:???mapはforeachの亜種と思えば良いとおもう。
覚えとくと便利。手放せない。まじ。
基本的には右側の配列を順番に回してるだけ。
@array1 の要素を「:」で区切って2次元配列にする↓
@array2 = map { [ split ':', $_ ] } @array1;
と
foreach ( @array1 ) {
push(@array2, [ split ':', $_ ]);
}
がおんなじ。
0309nobodyさん
03/08/20 21:49ID:Loi9JQvi現在、
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:???参考になるかどうか分からんが。
http://search.cpan.org/author/AUTRIJUS/OurNet-BBS-1.65/
0311nobodyさん
03/08/21 01:12ID:???とりあえず入力ルーチンを入れろ。
それと一回ファイルを削除して、復元しろ。わからないところ、間違っているところが表示される。
0312nobodyさん
03/08/21 01:13ID:???# 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:???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:???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:???$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:???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";
}
}
という関数をつくったのですが、(長いので次のレスに続きます)
0321320
03/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";
}
}
という関数をつくったのですが、(長いので次のレスに続きます)
0322320
03/08/21 12:41ID:DAq1ln5wみたいにしてクッキーをセットすると、
ネスケでは、180日有効なクッキーがセットされるのですが、
IEだと、セッションクッキー(ブラウザを閉じると削除されるクッキー)に
なってしまいます。
どこがおかしいのでしょうか?
0323320
03/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例えば
10×1.05 をやると 10.5
になるのですがこれの小数点以下を切り捨てたいのですが、どうすれ
ば良 いのでしょう。number_format関数を使えば小数点以下の修正が
行なえるというのは知っているのですが、number_format関数を使うと
1000などの数値の時、1,000となり","(カンマ)が表示されてしまい、数
値として認識しなくなってしまいます。
この計算の後にもさらに計算をしたいので、数値として認識させなけれ
ばならないので、こまっています。
どうぞご指導をよろしくおねがいします。
0325nobodyさん
03/08/21 15:32ID:???ここPerlだしPHPよく知らんけど、
$formated_number と $number と別にすればいいんでないの?
0326nobodyさん
03/08/21 15:34ID:???floatだっけか忘れた。
0327nobodyさん
03/08/21 15:42ID:pPohBqhp※ちなみに$numberと$formated_numberを使ってみたところfatal error
になっちゃいました。
すみません。迷惑かけました。ありがとうございました。
0328nobodyさん
03/08/21 17:56ID:DAq1ln5wという文字列に対して、全角数字を半角数字に置換したいのですが、
どうすればいいのでしょうか?
(文字列も、スクリプト自体も、文字コードはEUCです)
0329nobodyさん
04/03/26 19:55ID:???■ このスレッドは過去ログ倉庫に格納されています