Thread '3,6-10,16,23' in (3,6,7,8,9,10,16,23) umwandeln (12 answers)
Opened by mixxer at 2019-08-22 22:28

haj
 2019-08-26 18:41
#190400 #190400
User since
2015-01-07
527 Artikel
BenutzerIn

user image
2019-08-23T23:45:17 mixxer
Update2: Anonyme Listen auch noch dazu. Nach meinem Geschmack jedoch viel schlechter zu lesen...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub _text_to_list
  #
{
    my $string = shift;
    $string =~ s/\s+//g;
    return \@{
        [
            sort { $a <=> $b } keys %{
                {
                    map { $_ => $_ }
                      map { /^(\d+)-(\d+)$/ ? ( $1 .. $2 ) : /^0*(\d+)$/ ? ($1) : () }
                      split( ',', $string )
                }
            }
        ]
    };
}

Ganz richtig: Da gibt es individuell verschiedene Grenzen, wie weit man die "funktionale Programmierung" hier strapazieren will.
Man verliert dabei die Möglichkeit, den Zwischenergebnissen sinnvolle Variablennamen zuzuweisen: Während bei sort klar ist, dass das Ergebnis eine sortierte Liste ist, sagt map nicht wirklich, was es mit den Listen treibt. Wenn man da Jahre später feststellt, dass Fälle wie '09-10,09' nicht wie gewünscht behandelt werden und sich nochmal reinwühlen muss... :)

Ein Satz Klammern kann übrigens wegfallen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub _text_to_list
  #
{
    my $string = shift;
    $string =~ s/\s+//g;
    return
        [
            sort { $a <=> $b } keys %{
                {
                    map { $_ => $_ }
                      map { /^(\d+)-(\d+)$/ ? ( $1 .. $2 ) : /^0*(\d+)$/ ? ($1) : () }
                      split( ',', $string )
                }
            }
        ];
}

View full thread '3,6-10,16,23' in (3,6,7,8,9,10,16,23) umwandeln