• 締切済み

sortをscalarで評価すると

Wernerの回答

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

sort - perldoc.perl.org http://perldoc.perl.org/functions/sort.html に > In scalar context, the behaviour of sort() is undefined. って書いてあるので未定義なんでしょう。

関連するQ&A

  • 複数の配列の全ての組み合わせを表示する方法

    複数の配列が定義されており、その各々から一つづつ要素を選んで出来る組み合わせの全てを表示したいのですが、その際に、foreachを単にネストするのではなく、より効率的方法や関数は何かありませんでしょうか。 たとえば、 @list_a = qw(1 2 3 4) @list_b = qw(a b c d) @list_c = qw(x y z) の3つの配列の全て組み合わせ、例えば、 1ax 1ay 1az 1bx 1by 1bz 1cz ... 4dy 4dzを全て表示させるプログラムを作成したいと思っています。 foreach $a (@list_a){ foreach $b (@list_b){ foreach $c (@list_c){ ... のようにforeachをネストすればよいのですが、配列の数がとても多い場合を考えています。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Lispでマージソート

    Lisp初心者のものです。 Lispでマージソートはどのように書けばいいのでしょうか? 結果のリストは、二つの引数リストの要素すべてを含んでいなければならず、たとえば (marge ' (3 3 6 7) ' (2 5 8)) の答えは (2 3 3 5 6 7 8) です。

  • 複数の変数を持つ値のsort

    下記のようにx(\d+)y(\d+)z(\d)形式で構成されている値をもつリストがあった時に、期待値のように z x y の優先順でsortしたいのですが、よろしくお願いします。 @list = qw( x2048y2z3 x1024y2z5 x1024y4z2 x1024y4z3 x1024y2z2 ) ; 期待値の順 x1024y2z2 x1024y4z2 x1024y4z3 x2048y2z3 x1024y2z5

    • ベストアンサー
    • Perl
  • データの日付でソートをしたい

    データの日付でソートをしたい データの日付でソートをしたいと思ってますが、うまくいっていません。 $kuchikm2の内容 1,8,,説明文,2010/07/06-01:27,1,,,,,,, 2,8,,紹介文,2010/07/18-02:27,1,,,,,,, 3,8,,コメント,2010/05/19-03:27,1,,,,,,, 4,8,,文言,2010/06/20-04:27,1,,,,,,, ソートした結果@sorted 2,8,,紹介文,2010/07/18-02:27,1,,,,,,, 1,8,,説明文,2010/07/06-01:27,1,,,,,,, 4,8,,文言,2010/06/20-04:27,1,,,,,,, 3,8,,コメント,2010/05/19-03:27,1,,,,,,, (perlソース) 略 #sortロジック use warnings; my @lines = $kuchikm2; print @lines, " a\n"; my @sorted = map { $_->[4] } sort { $a->[0] <=> $b->[0]} map { [(split q{,}, $_)[4], $_] } @lines; print @sorted, " b\n"; (ここまで) 以前ソートで質問したときに、数字でないといけないと言われたような気がしています。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/usr/bin/perl use strict; my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files); # ハッシュの配列を静的に作る %a = ( '0' => [ qw(0) ], '1' => [ qw(1 1) ], '3' => [ qw(3 3 3) ], '7' => [ qw(7 7 7) ], '2' => [ qw(2) ], '4' => [ qw() ], '5' => [ qw() ], '6' => [ qw() ], '8' => [ qw(8 8) ], '9' => [ qw(9) ], ); @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a; #ハッシュのキーを数字順で表示 foreach (@keys){ print $_ ."\n"; } # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %a) { for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) { print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' '; } $allarray=scalar(@{$a{$i}})-1; print "No$i:kosuu:$allarray"; print "\n"; #配列の値の個数を調べその配列を作成 my($a_mumei) = $allarray; $a_mumei_ref = \$a_mumei; $files{"$i"}=($i,$a_mumei_ref); } #each関数で%filesの中身を表示 while ( ( $key , $value ) = each %files ){ print "key:$key value:$$value\n" ; } #試行錯誤 foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){ print "$x => $files->{$x}\n"; } @keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files; #@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files; #@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files; print "@keys2\n"; print "\n"; __END__; 私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、 どのようにすれば可能でございますか、ご教授願えませんでしょうか key:3 value:2・・・この場合valueは配列の個数 key:7 value:2 key:8 value:1 key:1 value:1 key:9 value:0 key:2 value:0 key:0 value:0 key:6 value:-1 key:4 value:-1 key:5 value:-1

    • ベストアンサー
    • Perl
  • ソートのテクニックについて

    お世話になります。 ソートのテクニックについて教えていただきたく質問しています。 ソートをするに、パタンが二つあると思います。 例示パタン1; 一人が5回の試技を行い、結果を記録したレコードがあり、 5回の試技を昇順に列べてからリストする。 レコード形式;名前、試技1、試技2、、、試技5、試技平均 例示パタン2; 一人が砲丸投げとやり投げを行い、結果を記録したレコードがあり、 砲丸投げと、やり投げ毎に記録の良い順にリストする。 レコード形式;名前、砲丸投げ記録、やり投げ記録 上記パタン1では、データを頭から読み出しながら試技をソートすれば良く、 ソートに要するスペース(メモリ?)は少なくて済む。 パタン2では、予め全レコードについてソートしてからリストする必要があるため、 スペースが要求されると思います。 ここで質問です。 パタン2のような場合、どのようなテクニックを使えばよいのでしょうか。 実際に動かしているのですが、パソコンでは問題なくても携帯電話で動かすと、 ”上限サイズを超えたので云々”とのエラーになります。 (シュワルツ変換というテクニックでソートしています。)   @lines = map {$_->[0]}      sort {$b->[11] <=> $a->[11] or $a->[1] <=> $b->[1]}      map {[$_, split /<>/]} @lines; 上記の場合、メモリに蓄えられてソートがされると思います。 一度外に書き出すようなテクニックの方が良いのでしょうか。 時間も掛からず、メモリも食わない方法が理想ですが、 そうも行かないと思います。 メモリを食わずに済む方法を教えてください。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • pythonの、ソートのプログラムを教えて下さい。

    この、リストをソートするプログラムなんですが、 ソートしても結果が「None」と出てソートされません。 どこがエラーは出ず結果が表示されないので 間違いの箇所が分からず困っています。 以下、リストをソートするプログラムです def sort(ls): size = len(ls) i = 1 while i < size: tmp = ls[i] j = i - 1 while j >= 0 and tmp < ls[j]: ls[j + 1] = ls[j] j -= 1 ls[j + 1] = tmp i += 1 ls = [5,8,3,7,4] print sort(ls) どうしたらいいのでしょうか。分かる方、お願いします

  • sortに関する質問

    いつもお世話になっております。 書籍でperlを独習しているものです。 質問内容が長くなってしまいますが、お付き合いいただければ幸いです。 @array=("bbb","aaa","ccc"); @list=sort @array; count=0; foreach $value(@list){ printf "%d":"[%s]\n",$count,$value; $count++; } このコードの9行目のprintfですが、 printの後の"f"の意味について教えて下さい。 今まで学んできたものは、全てprintとしか入力していなかったので、 何の説明もなしに出現して困惑しています。 又、printf以降の"%d":"[%s]\n",$count,$value; も理解できません。 コマンドプロンプトでの出力結果は 0:[aaa] 1:[bbb] 2:[ccc] となりました。 以上、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 配列のソートについて質問です。

    配列のソートについて質問です。 2つのキーで配列の中身をソートしたいのですが、スマートな書き方があれば教えてください。 そもそも間違っている、などのご指摘でもありがたいです。 @t1 = map {(split /,/)[1]} @data; @t2 = map {(split /,/)[2]} @data; @data = @data[sort {$t1[$a] <=> $t1[$b] or $t2[$a] <=> $t2[$b]} 0 .. $#t1]; @dataの内容 A,1,2 B,1,3 C,2,1 D,3,2 E,3,1 F,1,1 出力結果 F,1,1 A,1,2 B,1,3 C,2,1 E,3,1 D,3,2 よろしくお願いします。

    • ベストアンサー
    • Perl
  • クイックソートについて

    下記のソースプログラムのquick_sort_coreの部分がわかりません。 わかる方助けてください。 あとこのソースを降順にした場合の変更点も教えていただけると助かります。 #include <stdio.h> /* printf()利用のため */ #include <stdlib.h> /* rand()利用のため */ #include <time.h> /* clock()利用のため */ #define N 10 /* 整列対象要素数 */ /** * 配列の中身を表示する関数 * @param a 表示する配列 * @param n 配列の要素数 */ void print_array(const int a[], int n) { int i; for (i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); } /** * 整列されているかどうか確認する関数 * @param a 確認対象配列 * @param n 配列の要素数 */ void is_sorted(const int a[], int n) { int i; for (i = 0; i < n - 1; i++) { if (a[i] > a[i + 1]) { printf("昇順に整列されていません\n"); return; } } printf("昇順に整列されています\n"); } /** * クイックソートの本体 * @param a 整列対象配列 * @param l 対象の最初の要素番号 * @param r 対象の最後の要素番号 */ void quick_sort_core(int a[], int l, int r) { /* ここを実装する */ } /** * これまでの整列関数のインターフェースにあわせるクイックソート呼び出し関数 * @param a 整列対象配列 * @param n 配列の要素数 */ void quick_sort(int a[], int n) { quick_sort_core(a, 0, n - 1); } int main(void) { int i; int n = N; /* 整列対象要素数 */ int a[N]; clock_t start,end; /* 0からRAND_MAXの一様乱数をn個生成し、配列aに格納 */ for (i = 0; i < n; i++) { a[i] = rand(); /* 出力確認(print_array)するときは a[i]=rand()%100 としておくと見やすい */ } /* 昇順にソートされているか確認(デバッグ用) */ is_sorted(a, n); /* 配列の中身を確認(デバッグ用) */ print_array(a, n); /* 開始時刻の取得 */ start = clock(); /* クイックソート関数の呼び出し */ quick_sort(a, n); /* 終了時刻の取得 */ end = clock(); /* 配列の中身を確認(デバッグ用) */ print_array(a, n); /* 昇順にソートされているか確認(デバッグ用) */ is_sorted(a, n); /* 実行時間の表示 */ printf("%d 個の要素のクイックソートの実行に %f [秒]かかりました\n", n, (double)(end - start) / CLOCKS_PER_SEC); return 0; }