[過去ログ] Perlについての質問箱 64箱目 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
828: 2020/12/07(月)17:17 ID:VC6/tHTg(1) AAS
>>826
DateTimeモジュール使えば全て解決なんだが
クソデカくて重いという弱点が
829: 532 2020/12/07(月)21:57 ID:WG5ppFXF(1) AAS
Time::Pieceの弱点は
strptime()で作ったインスタンスのtimeゾーンをいじれないとこかな?
後1つなんか弱手あった気がするが忘れた
830: 2020/12/07(月)22:38 ID:UAiCPmDo(3/3) AAS
strptimeはpythonでもrubyでも同じだから、もう慣れなんだろうな
'YYYY-MM-DD' とかではあかんかったのか
831: 2020/12/08(火)04:35 ID:65P2yCaW(1/2) AAS
>>821
timeLocal()の年は1900引かない方がいいよ。これちょっとCのライブラリとは違うんだよ。詳しくはドキュメント読んで。
832: 2020/12/08(火)04:36 ID:65P2yCaW(2/2) AAS
あ。タイプミス。timelocal()ね。
833
(5): 2020/12/08(火)23:53 ID:VS4VHEi1(1) AAS
すみません、ソートで教えて欲しいんですが下記のようにみたいな枝番号が付いてる文字列をハッシュのキーとして
ハイフン前の数値でソートした後にハイフン後の数値でソートしたいのですが
普通に$a <=> $bだとハイフンの後の値がバラバラになって上手くいきません
キーを作る際に別々に作ってループ増やすくらいしか自分には解決方法が無いのですが、スマートに出来る方法は無いのでしょうか?
1-1
1-2
2-1
2-2
3-1
834
(1): 2020/12/09(水)00:31 ID:LWKBPFtb(1/7) AAS
>>833
シュワルツ変換で検索!

たとえば :
mapでソート用の値として、前の数字×10000+後ろの数字の値をつくって、それともとの値のペアにする。
それを<=>でソートする。
mapで、ソート結果からもとのデータ部分を取り出す。
835: 2020/12/09(水)00:39 ID:LWKBPFtb(2/7) AAS
要は、map{...} sort{...} map{...}となる。
変換のためのループが2回入る(map)が、記述としてはあっさりなので、特殊なソートをしたいときにはよく使われる有名な方法。

伝わるかな?w
836
(1): 2020/12/09(水)08:45 ID:UMU4oc+t(1/7) AAS
それで書けるなら、sort { } でも書けるよね
837
(2): 2020/12/09(水)09:35 ID:sn/SI4a+(1) AAS
>>833
こんな感じかな。デバッグはしていないが。
@newlist = sort compare @oldlist;

sub compare{
my ($ap, $bp) = @_;

($ap1, $ap2) = $ap=~/([0-9]+)\-([0-9]+)/;
($bp1, $bp2) = $bp=~/([0-9]+)\-([0-9]+)/;
return 1 if $ap1 > $bp1
return -1 if $ap1 < $bp1
# $ap1 == $bp1;
return 1 if $ap2 > $bp2;
return -1;
}
838: 2020/12/09(水)10:27 ID:LWKBPFtb(3/7) AAS
>>836>>837
それだと、要素の比較のたびに、値の変換処理が行われる。
比較は何度も行われるため、変換処理が軽くない場合、ソート全体としてかなり重くなりうる。
すくなくとも「スマート」とは言えない。

そこで、変換結果をキャッシュするような形になるのがシュワルツ変換。

知らんならググれ。
839: 2020/12/09(水)10:46 ID:zREBomTd(1) AAS
sort { s1($a) <=> s1($b) } keys %x;

sub s1 {
shift =~ /(¥d+)-(¥d+)/ && 100*$1+$2
}
sortならこんなかんじ
840: 2020/12/09(水)10:47 ID:UMU4oc+t(2/7) AAS
順番が変わるだけで処理量は変わらんでしょう
どっちにしろ重い

次にソートする時はソート対象が変わっているんだから、キャッシュできない

有効な局面もあるんだろうけど、今回に関してはトリッキーなだけでメリットがない
841
(1): 2020/12/09(水)10:51 ID:UMU4oc+t(3/7) AAS
次のソートじゃなくて、1回のソート内部の複数の比較に対してか
あー、確かに速くなりそうな気がする
処理系が気を利かせて変わらない気もする
842: 2020/12/09(水)11:29 ID:LWKBPFtb(4/7) AAS
>>841
ソートの内部処理が想像できんのか?
もとの並び方にはよるが、ふつうは大きく異なる。
「処理系」とやらが気を利かせられる範疇ではない。

比較処理にsayでもいれて試してみろっつーんだよ。
843
(1): 2020/12/09(水)12:58 ID:UMU4oc+t(4/7) AAS
内部の話だからsayでは判らんだろ

関数で評価しないといけないと判っていて、動的に処理する必要も無いんだから、
評価済みのテーブルを内部に持たせようというのは自然な発想
844: 2020/12/09(水)13:12 ID:/81rDyGm(1) AAS
>>843
試してから言え。
きっと、想像以上の出力が出てきて驚くから。
845
(2): 2020/12/09(水)13:44 ID:UMU4oc+t(5/7) AAS
判ってないのかな

処理速度に配慮した処理系があっても不思議ではないという話
手元で試して遅かったとしても、全ての処理系に対する証明にはならない
846: 2020/12/09(水)14:16 ID:AA5LXV3h(1) AAS
>>845
痛々しいからもうやめとけ
847: 2020/12/09(水)14:32 ID:LWKBPFtb(5/7) AAS
>>845
Perlの「全ての処理系」て。w
848
(1): 2020/12/09(水)15:17 ID:UMU4oc+t(6/7) AAS
そもそも重いかどうかが疑問で、どっちでやっても一瞬で終わるのが普通
それなら読みやすい方が優れている
重くて困ってから対策を考えればいい
849
(5): 2020/12/09(水)16:44 ID:qaSCdqDS(1) AAS
map {
$_->[0];
} sort {
$a->[1] <=> $b->[1] || $a->[2] <=> $b->[2];
} map {
[$_, /(\d+)/g ];
}

読みにくい…かなあ?
850
(1): 2020/12/09(水)17:06 ID:8NKLSi5o(1) AAS
>>849
他の言語の人が見たら発狂しそう
851
(2): 2020/12/09(水)18:15 ID:UMU4oc+t(7/7) AAS
別に短く書かなくていいんだよ

@r = sort s2 @a;

sub s1 {
  my $str = shift;
  $str =~ /(\d+)\-(\d+)/;
  return $1 * 100 + $2;
}

sub s2 {
  return s1($a) <=> s1($b);
}
852: 2020/12/09(水)18:16 ID:xAMitlRd(1) AAS
発狂しない人が使えば良いよ
853: 2020/12/09(水)19:43 ID:LWKBPFtb(6/7) AAS
>>848
おまえ、ハードな処理を実装したことがないやろ?w

慣れたPerl使いはわざわざ>>851みたいなコードは書かない。
遅いし、くどくて逆に読みにくいからな。
854: 2020/12/09(水)19:45 ID:LWKBPFtb(7/7) AAS
>>850
C#でも、タプルが使えるようになったので、似たようなコードは書く。
LINQなぶんだけPerlより読みやすいけど。
855: 2020/12/09(水)22:17 ID:rsuX7ND7(1) AAS
ハッシュテーブルにs1($val)の戻り値を保存して、そのハッシュテーブルを使って比較関数を呼び出すとかするのが普通でしょ。
856
(1): 849 2020/12/10(木)06:03 ID:+FxPMgzN(1) AAS
読みやすい優れたコードが >>851 か。
自分のコードを出してくれた点は評価するが
$1 * 100 + $2
って何?
857
(1): 2020/12/10(木)16:08 ID:smJEm1Fb(1) AAS
2桁前提なんだろうな
1-
あと 145 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.015s