in reply to Sorting text-number values

Use a regex with captures, making the string part optional. Simply sorting by packed string then final number it is possible to get the numbers only lines at the start.

johngg@shiraz:~/perl/Monks > perl -Mstrict -Mwarnings -E ' my @data = qw{ this_5_string_12 some_12_garbage_23 this_5_string_8 17 this_5_string_23 some_12_garbage_6 102 this_5_string_19 5 this_5_string_101 }; my $width = 50; say for map { substr $_, 54 } sort map { do { no warnings qw{ uninitialized }; pack qq{A${width}NA*}, m{(.*\D)?(\d+)$}, $_; } } @data;' 5 17 102 some_12_garbage_6 some_12_garbage_23 this_5_string_8 this_5_string_12 this_5_string_19 this_5_string_23 this_5_string_101

To get the numbers only lines at the end involves substituting a "high values" string for the missing string part.

johngg@shiraz:~/perl/Monks > perl -Mstrict -Mwarnings -E ' my @data = qw{ this_5_string_12 some_12_garbage_23 this_5_string_8 17 this_5_string_23 some_12_garbage_6 102 this_5_string_19 5 this_5_string_101 }; my $width = 50; say for map { substr $_, 54 } sort map { do { m{(.*\D)?(\d+)$}; pack qq{A${width}NA*}, ( $1 ? $1 : qq{\x7f} x $width ), $2 +, $_; } } @data;' some_12_garbage_6 some_12_garbage_23 this_5_string_8 this_5_string_12 this_5_string_19 this_5_string_23 this_5_string_101 5 17 102

Sorting by final number then string mixes the numbers only lines in with the rest.

johngg@shiraz:~/perl/Monks > perl -Mstrict -Mwarnings -E ' my @data = qw{ this_5_string_12 some_12_garbage_23 this_5_string_8 17 this_5_string_23 some_12_garbage_6 102 this_5_string_19 5 this_5_string_101 }; my $width = 50; say for map { substr $_, 54 } sort map { do { no warnings qw{ uninitialized }; pack qq{NA${width}A*}, reverse( m{(.*\D)?(\d+)$} ), $_; } } @data;' 5 some_12_garbage_6 this_5_string_8 this_5_string_12 17 this_5_string_19 some_12_garbage_23 this_5_string_23 this_5_string_101 102

I hope this is helpful.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: Sorting text-number values
by merrymonk (Hermit) on Nov 30, 2016 at 09:22 UTC
    As the first part of johngg’s suggestion gave what I wanted, I copied the Perl into a file and ran this in an MSDOS window.

    my @data = qw{ this_5_string_12 some_12_garbage_23 this_5_string_8 17 this_5_string_23 some_12_garbage_6 102 this_5_string_19 5 this_5_string_101 }; my $width = 50; say for map { substr $_, 54 } sort map { do { no warnings qw{ uninitialized }; pack qq{A${width}NA*}, m{(.*\D)?(\d+)$}, $_; } } @data;
    Perl ran but sadly did not give the sorted data at the end.

    Can you tell me where it is stored and how to store this in an array? I did add lines to print out @data but that, probably as expected, gave me the what was stored with the ‘qw’ at the beginning of the code.

    I have used Perl for many years but I have never got to grips with this sort of coding!

      So, what did Perl output?

        Without the addtional print nothing.