1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Data::Dumper;
use Scalar::Util qw(looks_like_number);
my $text = '1-20,1,1,1,2,4,5,8,9,3-4';
my $list = &_text_to_list($text);
print Dumper $list;
exit;
sub _text_to_list
#
{
my @list = split( ',', shift );
my %hash;
for ( 0 .. $#list ) {
if ( $list[$_] =~ /(.*)-(.*)/ ) {
$hash{$_} = 1 for $1 .. $2;
next;
}
$hash{ $list[$_] } = 1 if looks_like_number( $list[$_] );
}
@list = ();
push @list, $_ for keys %hash;
return \@list;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $text = '1-20,1,1,1,2,4,5,8,9,3-4';
my $list = _text_to_list( $text );
print Dumper $list;
sub _text_to_list {
my $text = shift;
my %numbers;
my @list = split /,/, $text;
for (@list) {
my @range = split /-/;
$range[1] = defined $range[1] ? $range[1] : $range[0];
$numbers{$_} = 1 for $range[0] .. $range[1];
}
return [sort {$a <=> $b} keys %numbers];
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#!/usr/bin/perl use strict; use warnings; use diagnostics; use Data::Dumper; my $text = '3,6-10,16,23'; my $list = &_text_to_list($text); print Dumper $list; exit; sub _text_to_list { my @list = split( ',', shift ); my @expanded = map { /^(\d+)-(\d+)$/ ? ($1 .. $2) : /^(\d+)$/ ? ($1) : () } @list; my %hash = map { $_ => 1 } @expanded; @list = sort { $a <=> $b } keys %hash; return \@list; }
QuoteWonach kann ich googeln? gibt es dafür einen Fachbegriff?
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/perl use strict; use warnings; use 5.010; my $string = '1-3,5,9,2-4,11-22,5,7'; # Ersetze Bereich durch einzelne Zeichen # benutzt Ausführung von Perl in Ersetzungsteil des Regex $string =~ s/((\d+)-(\d+))/join ',', $2..$3/ge; # da numerisch nacheinadner gedruckt werden soll: my @array = sort {$a <=> $b} split ',', $string;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
my @array = sort { $a <=> $b } split ',', $string =~ s/ # fange die Bereichsangabe als zwei Gruppen bestehend aus Ziffern ((\d+)-(\d+)) / # ersetze durch Zeichenkette # erzeugt durch join mit Komma join ',', # aus der Liste des ersten bis zweiten matches $2..$3 /rgex;
Quote'3,6-10,16,23' in (3,6,7,8,9,10,16,23) umwandeln
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#!/usr/bin/perl use warnings; use strict; sub text_to_list { my $a = shift; my @b = split(/,/, $a); my ($i, $u); my (@c, @d); for $i (@b) { if ($i =~ /-/) { @c = split(/-/, $i); for $u ($c[0] .. $c[1]) { push(@d, $u); } next; } push(@d, $i); } return @d; } # (3,6,7,8,9,10,16,23) my $i; my @result = text_to_list("3,6-10,16,23"); for $i (@result) { print "$i\n"; }
$str =~ s/^\s+|\s+$//g
2019-08-23T18:18:22 mixxerWieder mal ein schöner Beweis für TIMTOWTDI :)oh yeah!
Danke für den tatkräftigen Gedankentransfer...
2019-08-23T18:18:22 mixxer...
@Gustl
ok, da bin ich davon ausgegangen, dass eine Typkonvertierung "Zeichenkette"->"Zahl" entsprechende Ungenauigkeiten automatisch erschlägt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#!/usr/bin/perl use strict; use warnings; my $text = ' ,,, 1,3, , ,5-7,,0011,0015-19-22,A12q,ü,, - ,'; print join ",", @{ &_text_to_list($text) }; sub _text_to_list # { my $string = shift; my ( @list, %hash ); $string =~ s/\s+//g; @list = split( ',', $string ); @list = map { # /^(\d+)-(\d+)$/ ? ( $1 .. $2 ) : # /^0*(\d+)$/ ? ($1) : # () } @list; %hash = map { $_ => 1 } @list; @list = sort { $a <=> $b } keys %hash; return \@list; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
sub _text_to_list # { my $string = shift; my @list; $string =~ s/\s+//g; @list = split( ',', $string ); @list = map { # /^(\d+)-(\d+)$/ ? ( $1 .. $2 ) : # /^0*(\d+)$/ ? ($1) : # () } @list; # anonHash anstatt realHash: @list = sort { $a <=> $b } keys %{ { map { $_ => $_ } @list } }; return \@list; }
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 ) } } ] }; }
2019-08-23T23:45:17 mixxerUpdate2: 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 17sub _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 ) } } ] }; }
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 ) } } ]; }