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

【Perl】初心者コーナー Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/02/09 00:24ID:s0tpWWxg
初めに→「perl」その物のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

あとは>>2-10。
0412nobodyさん03/02/23 19:16ID:???
>>410
放置に限ります。
0413nobodyさん03/02/23 21:20ID:???
>>402-403
スクリプトは間違ってなかったのですが
鳥の仕様でスタ(cgi-bin以下のファイルは操作できない)

婆茶とかハイマしか触ったこと無かったので分からなかった(;´Д`)
0414nobodyさん03/02/23 21:22ID:???
>>411
whileで回しつつ、unshiftしていけば?
0415nobodyさん03/02/23 21:26ID:???
>>414
それじゃ最終的にファイル全部を配列に入れるわけだから同じだよ。
まあ、100KBぐらいだったら気にせずreverseでいいんでない?
0416nobodyさん03/02/23 21:57ID:???
>>411
ttp://www.din.or.jp/~ohzaki/perl.htm#File_Reverse
これはどうか。
0417nobodyさん03/02/23 22:21ID:???
>>414-416
レスありがとうございます。
平均100KBくらいなんですが、気にしなくてもいいのかもしれませんね・・
ちょっと>>416さんのところ、詳しく見させてもらいます。
ありがとうございました。
0418nobodyさん03/02/23 22:24ID:???
どうせ一気読みするならforで後ろから逆順に読んでいった方がreverseするより軽いと思われ。
0419nobodyさん03/02/23 23:49ID:???
まわす数が分かっている場合。
$n = 10;
for(1..$n){ 処理; }
と、しているのですがもっとベターなやり方はありますでしょうか?
0420nobodyさん03/02/23 23:50ID:???
全部読むなら、foreachの方が速くなるかも。特化しているから。
0421nobodyさん03/02/24 00:00ID:???
>>420さんありがとうです。
昔はforeachを使っていたのですが、何時の間にか短いforを使うようになってしまいました。
0422nobodyさん03/02/24 01:33ID:???
>>420 特化ってどのへんで?
for と foreach って常に置き換え可能じゃない?
0423nobodyさん03/02/24 08:38ID:???
>>422
しかも今回は逆さに参照。
0424nobodyさん03/02/24 08:45ID:cCE/Sh/G
自作のオブジェクト指向なCGIフレームワークを、公開前にmod_perl環境にも対応させたいです。
mod_perlを極めるためのおすすめ本・サイトを教えてください。
お願いします。
0425nobodyさん03/02/24 09:34ID:???
>>424
・・・・気持ち悪いやつ
0426nobodyさん03/02/24 10:50ID:???
cryptで暗号化しておいた文字列を
ユーザに入力して貰ったデータと照合する処理を実現したいのですが
何度試してみても結果がNGで戻ってきてしまいます
尚、照合処理は下記の様なシンプルなものです

if ($savedata[0] eq substr($chkiddata[1], 0, length($savedata[0]))) {
if (crypt($chkpassdata[1], $savedata[1]) eq $savedata[1]) {
print "password check OK...<br><br>\n";
$flg = 1;
}
}

$chkiddata[0] はユーザ入力にてIDが、$chkpassdata[1] はユーザにて入力されたパスワード文字列(平文)が格納されております
$savedata[0] は保存されているIDが、$savedata[1] は保存されている暗号化済みのパスワード文字列が格納されております
また $flg に 1 が格納されている場合は、check OK の HTML を書き出す処理をおこなっています

因みに、パスワード暗号化を行う処理は、別のPerlスクリプトで行っておりますが、これも何か関係がありますでしょうか

宜しくお願い致します

0427nobodyさん03/02/24 12:20ID:???
>>426
> if ($savedata[0] eq substr($chkiddata[1], 0, length($savedata[0]))) {
$chkiddata[1] は、なんなのさ?
if ($savedata[0] =~ /^$chkiddata[0]/) {
ぢゃなぁぃ?
0428nobodyさん03/02/24 12:27ID:???
>>426
変数が間違っている。
042942403/02/24 12:48ID:???
比較的有用と思われるHTML::Template、CGI::Lite、Apache::Sessionなどを
使い易く統合して機能追加したパッケージを作っいるので、
それがmod_perl環境でも動くように改良したいと思ってるんですが…。
気持ち悪いですか。うあああ。
0430nobodyさん03/02/24 12:59ID:???
>>429
気持ち悪い
043142603/02/24 14:55ID:???
申し訳ないです、記述間違ってました
$chkiddata[1] の方にユーザで入力されたアカウント名が入っています、でした

今しがた print をIDチェック部分に噛ませて実行してみた所
ID 部分のチェックは問題なく認識できている様なのですが
どうしても暗号化パスワードとの比較が NG で戻ってきてしまいます...
0432nobodyさん03/02/24 15:01ID:???
URLエンコードとデコードはきちんとしてる?
043342603/02/24 15:09ID:???
>>432
はい、拾ってくれたデータも print で書き出しテストしてみましたが
問題なく元データとして保持されておりました
0434nobodyさん03/02/24 16:41ID:???
改行コードが付いてるとか。
chop $savedata[1];
043543403/02/24 16:42ID:???
chompでした。
0436nobodyさん03/02/24 17:43ID:???
>>431
目玉開いてよーく見てから、直したの貼って見れ。各変数に何が入っているか説明する事。
0437nobodyさん03/02/24 18:02ID:???
先生いいでつか?

windows2000
Active perl 5.6.1 build 633
APACHE 1.3.27
の環境ですが

exec (又はsystem) で外部プログラムを呼び出したとき
コマンドライン上で実行した場合外部プログラムは問題なく起動するのに
ブラウザから呼び出した場合外部プログラムが起動する場合と
起動しない場合があるのは何故なんでしょう??

hoge.cgi
#!/usr/local/bin/perl
print "Content-type: text/html;charset=euc-jp\n\n"; #コマンドラインから呼び出す場合は要らない
system("program.exe");

外部プログラムはどのような物でも問題なく起動 c:>perl hoge.cgi
起動するものと起動しないものがある http://127.0.0.1/cgi-bin/hoge.cgi
0438nobodyさん03/02/24 18:37ID:???
>>437
起動する場合としない場合の違いを説明する事。
まずはpathが通っているかをチェックしる。

> 先生いいでつか?
このスレに代議士はいない。・・・はず?
0439nobodyさん03/02/24 20:28ID:???
path を通しても同じです。フルパスで指定しても一緒。
違いは今のところパターンが把握できては居ませんが
どうやら何かしらのメッセージを標準出力に出力しないものは
起動していないような気がする。

例えば
system("dir");は
perl hoge.cgi
http://127.0.0.1/cgi-bin/hoge.cgi
共に問題なく動く

system("wmplayer");はブラウザから呼び出したときは動かない(起動しない)。
0440nobodyさん03/02/24 21:04ID:???
標準出力先が違うからね。
Apacheに理解できない出力したらいかんよ。
0441nobodyさん03/02/24 21:26ID:38CGzi2z
現在より nヶ月前の年を算出したいのですがどのように書けばいいでしょうか?

$year = $thisyear + int(( $thismon-1 ) /12 );

で nヶ月後は算出できるのですが…。
0442nobodyさん03/02/24 21:38ID:???
>>441
引き算知ってる?
0443nobodyさん03/02/25 00:21ID:???
http://www.mac68k.com/php/pafiledb3/pafiledb.php?action=file&id=33
ここで落としたphpBB2.0.4をXREAに設置したのですが、
書き込み時に「"」が「?」に、「>」や「<:」が「&」になってしまいます。
phpをいじったの自体初めてで、どうすればいいのやらさっぱりです。
既知の不備等、ご存じの方がおりましたらご教授下さい。
0444nobodyさん03/02/25 00:24ID:???
>>443
ここは作る人用の板。消えろ。
044544303/02/25 03:31ID:???
>>444
大変申し訳ありませんでした。
0446nobodyさん03/02/25 06:42ID:???
phpってのがミソですかな
0447nobodyさん03/02/25 07:17ID:???
どこかで「CGIはこのスレ」とでも誘導してるのか?
理解できん。
0448nobodyさん03/02/25 07:56ID:???
>>447
Web制作
http://pc2.2ch.net/hp/

k
0449nobodyさん03/02/25 11:40ID:???
>448
板にはともかくスレに誘導はしてないだろうよ…
045043703/02/25 15:57ID:???
パターンと原因が掴めなかったので
perlからtelnetで接続させて起動させるように書きました。
まあ、目的は達成できたのでヨシとします。
暇なときにでも勉強するでス。
ありがとう。

余談だがwin9x系だとtelnetdにろくな物が無いのに愕然とした(涙
0451nobodyさん03/02/25 17:11ID:wR5lMZNW
WIN2000+anhttpdでCGIとして動かしています。

systemでファイルのコピー等を行った場合に、「○個のファイルをコピーしました」
などのsystemの返り文字が表示されますが、これをスクリプト上で
非表示にする方法はないものでしょうか。
___________
$from="コピー元パス";
$to="コピー先パス";
system("copy $copyfrom/A $copyto");
→1個のファイルをコピーしました。
___________

ご存知の方いましたらお願いします。
045245103/02/25 17:13ID:wR5lMZNW
訂正:
system("copy $copyfrom/A $copyto"); → system("copy $from/A $to");
0453nobodyさん03/02/25 20:06ID:???
>>451
system("copy $from/A $to > nul.txt");
とかでダミーファイルにリダイレクトするってのはどう。
0454nobodyさん03/02/25 20:33ID:???
ダミーじゃなくても、> nul にリダイレクトだけでいいはずだけど、
anhttpdって、クライアント側への表示を勝手にしちゃうの?
って、気づけばここperlスレだった…。
045545303/02/25 20:57ID:???
/dev/nulでだめだったので使えないのかと思った。
/devディレクトリないからあたりまえか。
0456nobodyさん03/02/25 21:47ID:???
>>455
nulはデバイスだよ。ファイルとかディレクトリじゃないからパス名はつけられない。
逆にパス名つけたらただのファイルになっちゃう。

0457nobodyさん03/02/25 23:06ID:???
>>456
rem >null
dir
してみ
0458nobodyさん03/02/25 23:55ID:???
>>456
455はUNIXと間違えたと思われ。
UNIXはデバイスファイルという概念を持っていて、デバイスをファイルのように扱う。
そしてパスが/dev/nul。
0459nobodyさん03/02/26 01:07ID:???
っていうか、copyコマンドなんて使うなよ

use File::Copy;
copy("file1","file2");
046045103/02/26 10:45ID:JNJUfkpu
>459
最終的にはお客さんの環境に入れ込むのですが、
perlのバージョンが5.0な事とモジュールをこちらで入れる権限がないので
こんな遠回りな事になってしまってるんです・・(涙

system("copy $from/A $to > nul.txt");
は構文ミスになってしまいました。
つかDOS勉強しないとよくわからないって事なんですね・・。

とりあえず応急処置として<!-- -->で囲んでおく事にして、
引き続き調べてみます。

#これってperlの質問じゃなかった・・?すみません
0461nobodyさん03/02/26 11:07ID:???
system("$ENV{COMSPEC} /c copy /A /-Y $from $to >nul")
046245103/02/26 13:31ID:???
>461
うはー!!できましたっ!
$ENV{COMSPEC}なんて初めて見ました。これなら違う環境でも安心して動かせますね。
本当にありがとうございました。
今夜は2ちゃんに足を向けて眠れませんです。
0463nobodyさん03/02/26 15:07ID:WD8DDVVN
ある変数の値(例えば$test)で条件文を作りたいのですが
値が一個の場合は(例えば $test=first)
if($first eq ""){
処理;
}
として、
カンマ区切りで複数の場合は(例えば $test=first,second)
if(($first eq "") || ($second eq "")....$testに入ってる値の数だけorで追加..){
処理;
}

という処理をやりたくて

今は$testをカンマで分割して配列にいれて(例えば @x)
$testの値が複数だったばあいは

foreach $i (@x);
if($x[$i] = ""){
処理
}
}
という感じで回して処理してます。動作は問題なくするのですが、
もっとスマートないい方法ないでしょうか?
アドヴァイスをよろしくお願いします
0464nobodyさん03/02/26 15:10ID:???
>>463
正規表現使え。
0465まる03/02/26 17:30ID:T5eWammJ
一部のタグを有効にする掲示板を作っています。
配列で有効にするタグの中身を設定して、それに合致しないものは
gt;などで文字化する、というふうに考えたのですが、これでは
有効になるはずのタグまで文字化されてしまいました。
どう書けば動くようになるでしょうか。
#もっとスマートな書き方もあるような気がするけど・・(^-^;

#設定項目
@tag = "('b'.'/b'.'i'.'/i'.'u'.'/u'.'s'.'/s')";

#タグ無効処理
sub tag {
$value =~ s/</>/g;
$value =~ s/>/</g;
}
0466まる03/02/26 17:31ID:T5eWammJ
#タグ有効処理
sub decode{
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("本文が長すぎます"); }
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

# S-JISコード変換
&jcode'convert(*value,'sjis');

# タグ処理
if ($value ne "<@tag(.*)>") { &tag; }

#改行処理
$value =~ s/\r\n/<br>/g;
$value =~ s/\r/<br>/g;
$value =~ s/\n/<br>/g;

#削除情報
if ($name eq "del") { push(@DEL,$value); }
$FORM{$name} = $value;
}
}
0467まる03/02/26 17:32ID:T5eWammJ
しかもタグ要素の <〜style:="***"> までとおることになる・・
この書き方だと・・(って動かないうちにいっててもしょうがないって)
0468nobodyさん03/02/26 18:43ID:???
すり抜けを防ぐために、禁止するものを書き換えるではなく、全部書き換えて許可するものだけ戻せ。
0469nobodyさん03/02/26 19:14ID:h/xtR2PF
http://www.url-battle.com/cgi/

これを和鳥に設置したいのですがどういじっても表示されません。
設置自体が不可能なら諦めますが、もし方法があるならお教えいただけませんでしょうか。
0470nobodyさん03/02/26 19:20ID:???
perlとなんの関係が?
0471nobodyさん03/02/26 20:23ID:???
>>465
文字修飾タグだけならspanタグだけ通るようにしてみるとか。

$value =~ s/\t//g; # [TAB]が含まれていたら削除する(これを'<','>'の代用にするため)

if (($value =~ s{(<b[^>]*>)}{$1}g) != ($value =~ s{</b>}{$1}g)){
# 開始タグと終了タグの数が一致しないので鰓。
print qq{タグ鰓};
}
else {
# < を \tに、 > を \t\t に。
$value =~ s{<(b[^>]*)>}{\t$1\t\t}g;
$value =~ s{</b>}{\t/b\t\t}g;
}
上記を<i><u><s>分処理する。(ハシュを使ってループするなり・・・)

# 他のタグは無効と言うことで・・・
$value =~ s/</</g;
$value =~ s/>/>/g;

# \t\t,\tを復元。
$value =~ s/\t\t/>/g;
$value =~ s/\t/</g;

あーあほらしくなってきた鬱。
0472nobodyさん03/02/26 20:31ID:???
>>471
&amp;忘れてた鬱。

$value =~ s/</</g;
$value =~ s/>/>/g;
↓
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
0473nobodyさん03/02/26 20:46ID:???
>>465
タグの無効処理、一部有効処理は正規表現スレにいけ。
最近でも出た話題だからすぐに見つかるはず。

>>463
どうでもいいが、根本的に考え方がずれてるんだと思われ。
その処理で一体何がしたいのか言ってみるのもあり。
別のもっとスマートなやり方がみつかるかも。

>>469
CGIの設置は、
1.そのCGIを配布しているサイト
2.そのCGIを設置したいサイトのサポート
の順で方法を調べて、それでもさらにわからないなら諦めるのが普通。
それでも諦めきれない未練がましい人間なら、そうだな、
CGIスレに行けばもしかしたらいけるかも知れない。
1も2も失敗しているのなら、いける可能性はほとんどないだろうが。
0474nobodyさん03/02/26 21:23ID:???
質問なのですが、
CGIをperlで作成しているのですが
ゲームのロビーサーバーの代わりを ホームページ上で作成しようと考えているのですが、
ホームページを参照している クライアントに
TCP-IP、ポート指定 でデータを直接送ることはできるのでしょうか?
ホームページは、フリーでCGIが使えるます。

流れ的にこんな感じです。

0.各クライアントが ゲームを起動しておく。
1.ホームページでログイン処理.
2.ログインしたクライアントのIPアドレスを取得しておく.
3.ホームページ上でゲームの対戦相手を決める.
4.相手が決まったら CGIから各クライアントに
ログインしたときに取得したIPアドレス、ゲーム専用のポートに
対戦相手のIPアドレス、対戦相手の情報を送信して
ピアツーピア接続で 対戦させる。

どうでしょうか 可能ですか?




0475nobodyさん03/02/26 22:37ID:???
>>474
Perlで作ってればどんなことでもこのスレに書いていいというわけじゃないぞ。
0476nobodyさん03/02/26 23:02ID:???
可能かどうか聞いてるだけだしまぁいいんじゃないの。
可能。詰まったらまたおいで。
0477nobodyさん03/02/26 23:04ID:???
>>474
HTMLとブラウザを使っている限り、サーバー側からの情報の送りつけはまず無理と考えろ。
これはPerlとかに限らない話なので、これ以上はスレ違いになるので詳しい説明はしない。

文意を汲み取るならば、>>474のやりたいことは、
ユーザーがブロードバンドであることを前提にして、
鯖を用意し、ユーザーにJavaサーブレットやHSPで作ったexeなどを使ってもらうのが一番現実的だと思う。個人レベルでは。

なので、本気でやる気ならばそれぞれ専用のスレに移動しろ。
0478nobodyさん03/02/27 11:20ID:SWu201Ch
push(@array,"a");
push(@array,"b");
push(@array,"a");
push(@array,"c");
foreach $value (@array){ print "$value\n"; }
これを実行すると、a b a cとなります。
aは1回目に既に配列の中にあるので2回目のaは入れたくないのですが、
どうすればいいのでしょうか。
0479nobodyさん03/02/27 11:35ID:???
>>478
push(@array,"a");
push(@array,"b");
#push(@array,"a");
push(@array,"c");
0480nobodyさん03/02/27 11:42ID:???
入れる前に処理するのと入れた後に処理するのが有りそうな予感
0481nobodyさん03/02/27 12:02ID:???
>>479
ワロタ
0482nobodyさん03/02/27 12:33ID:???
>>478
入れるデータを変数で渡して正規表現で分岐ってのが一番分り易いんでない?
0483nobodyさん03/02/27 12:38ID:???
>>478
# 先に重複をチェックする方法
$append = sub { push(@array, $_[0]) if index("@array", $_[0]) == -1 };
$append->("a");
$append->("b");
$append->("a");
$append->("c");

# ハッシュを使って後からキーを取り出す方法
$hash{"a"} = "";
$hash{"b"} = "";
$hash{"a"} = "";
$hash{"c"} = "";
map { print "$_\n" } sort keys %hash;
0484nobodyさん03/02/27 14:19ID:???
>>473

> >>463
> どうでもいいが、根本的に考え方がずれてるんだと思われ。
> その処理で一体何がしたいのか言ってみるのもあり。
> 別のもっとスマートなやり方がみつかるかも。

テキストボックスの名前を羅列したファイルを参照して
フォームメール中の対応するテキストボックスを未入力不可にするスクリプトで

氏名とか住所とかはテキストボックスが複数にわかれてるので
firstNAME,familyNAMEと設定ファイルに書くと
orで条件わけしようと思ったんですが
よく考えたらorにする必要なかったです
氏名の場合なら単純に
firstName
familyName
と設定ファイルに書いて
一個ずつ条件分岐させればよかった話でした。

そもそも未入力不可のテキストボックスを指定する方法があまりよくない気がしてきだした…
0485nobodyさん03/02/27 16:01ID:???
>483
下のやり方でうまくいきました
有難うございます
0486nobodyさん03/02/27 18:06ID:???
西暦→和暦の関数白根?ぎぼんぬ
0487nobodyさん03/02/27 19:13ID:???
<?php
#IN:$seireki 西暦
#OUT:$val[0] 元号 $val[1] 年
function wareki($seireki) {
$gengo=array(
'1989'=>'平成',
'1926'=>'昭和',
'1912'=>'大正',
'1868'=>'明治'
#後は自分で
);
while(list($nen, $gen) = each($gengo)) {
if($seireki >= $nen) {
$val[0] = $gen;
$val[1] = $seireki - $nen + 1;
return($val);
}
}
exit;
}
?>
048848703/02/27 19:18ID:???
Perlスレでした
すまん
0489nobodyさん03/02/27 19:31ID:???
>>486
ここにあった
ttp://cgikon.com/
049048603/02/27 21:39ID:???
>487-489
さんこす
0491nobodyさん03/02/28 08:20ID:nTu2mU2W
すいません。
キー1=値1
キー2=値2
みたいなフォーマットのファイルを扱うクラスがどこかにあったと思うのですが、
名前を教えて下さい。
0492nobodyさん03/02/28 08:24ID:???
初心者は暮らすなんか使ってはいけません。
0493nobodyさん03/02/28 08:37ID:0F+7IAI5
そんなこと言わずに教えてください。
use Class;
my $class = new Class();
$class->method();
$class = undef;
クラスの使い方なんか、たったこれだけじゃなかとですか。
0494nobodyさん03/02/28 11:28ID:???
>>493
んぢゃ自分で作れば?
0495nobodyさん03/02/28 13:08ID:???
もっともやね >494
0496nobodyさん03/02/28 14:41ID:6S1ggN3l
自分で書いたクラスはあります。
ただ、標準モジュールにそういうクラスがあるなら、配布しなくていいからそっちのほうがいいです。
0497nobodyさん03/02/28 18:05ID:???
>>496
こんなところでレス書いていないでCPANで探すのが吉。
無駄な労力はストレスの要因ですよ(^o^)
0498nobodyさん03/02/28 19:27ID:???
>>493
new Class()で返ってきたのは、おそらく、オブジェクトなので$classという変数名は不適切。
変数を破棄する場合は、undefを代入するよりも、undef $hoge;の方が意味がわかりやすい。
0499nobodyさん03/02/28 19:49ID:???
>>496
AnyDBM
0500nobodyさん03/02/28 20:15ID:???
標準では無いと思う。
0501nobodyさん03/03/01 12:50ID:???
>>496
SGBMでもGDBMでもDBでもNDBMでもなんでもいいじゃん。
0502nobodyさん03/03/01 21:02ID:???
質問です。
ファイルのリスト @files を、更新が古い順に並べ替えたいんですが…
一応自分でも考えてみました。

@new = ();

foreach (@files){
push @new, (stat $_)[9] . "<>" . $_;
}

@files = ();

foreach (reverse(sort @new)){
my(undef, $x) = split /<>/;
push @files, $x;
}

これでできそうなんですが、もっといい方法があるような気がします。
もっといい方法があれば教えて下さい
お願いします。
050350203/03/01 21:25ID:???
ageさせてもらいますね
0504nobodyさん03/03/01 21:49ID:???
my @file;
my %hash;
foreach(@new){
$hash{(-M $_)} = $_;
}
foreach(sort{$b <=> $a} keys %hash){
push(@file, $hash{$_});
}

うーん…。
0505nobodyさん03/03/01 21:58ID:???
sort {(stat $a)[9] <=> (stat $b)[9]} @files;
でいけるかな
0506nobodyさん03/03/02 02:50ID:???
>>504
同時刻のファイルが消される。

>>505
比較の度に stat を呼ぶのはマズい。

手っ取り早くやるならこう。
@files =
 map $_->[0],
 sort { $b->[1] <=> $a->[1] || $a->[0] cmp $b->[0] }
 map [ $_, -M ],
 @files;
0507nobodyさん03/03/02 11:30ID:???
エレガントだ。
0508nobodyさん03/03/02 12:17ID:???
>>507
何でもかんでも1行にまとめるのがエレガント?
じゃあ俺ほとんどのCコードを10行以内にまとめられるけど。
050950403/03/02 12:33ID:???
>>506
確かに同時刻のファイルが消されます。
忘れてました。

シュワルツ変換(Schwartzian Transform)ですね。
やっぱり覚えた方がいいかな。。
0510nobodyさん03/03/02 13:14ID:???
tr/\n//d;
0511nobodyさん03/03/02 15:00ID:???
>>509
Schwartzian Transform はデリファレンスのオーバーヘッドがあるんで、
同じ事をより効率良くやるには地道に作業変数を作ってソートした方が
いいらしい。

{
 my @time;
 push @time, -M for @file;
 @file = @file[
  sort {
   $time[$b] <=> $time[$a] || $file[$a] cmp $file[$b]
  } 0..$#file
 ];
}

>>508
1行(と言うか1文)に詰め込む云々より、この作業変数の為にブロックが
増える所がエレガントでないとは思うがな。
■ このスレッドは過去ログ倉庫に格納されています