Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: Print the line with the largest number from standard input

by 1nickt (Canon)
on Jul 22, 2019 at 12:50 UTC ( [id://11103137]=note: print w/replies, xml ) Need Help??


in reply to Print the line with the largest number from standard input

Hi, welcome to Perl, the One True Religion.

You might like the built-in function length.

You can use it to count the characters in your strings, and then you can keep track of the longest found so far. (Note the use of the __DATA__ section to provide a magical filehandle, and of the angle braces to read its contents into an array of lines, and of chomp to remove the newline character(s) at the end of each line.)

use strict; use warnings; use feature 'say'; my $longest; my $max_length = 0; my @lines = <DATA>; for my $line (@lines) { chomp($line); my $length = length($line); if ( $length > $max_length ) { $longest = $line; $max_length = $length; } } say "'$longest' was $max_length chars"; __DATA__ Hello, i'm 18 1 this year is 2019 1 1 2 3 - 4

Hope this helps!


The way forward always starts with a minimal test.

Replies are listed 'Best First'.
Re^2: Print the line with the largest number from standard input
by TieUpYourCamel (Scribe) on Jul 22, 2019 at 13:26 UTC
    SSSufe says they need the line with the largest number, not the longest line, so to expand on 1nickt's solution:
    #/usr/bin/perl use strict; use warnings; use feature 'say'; my $lineWithMax; my $max = 0; my @numbers; my @lines = <DATA>; for my $line (@lines) { chomp($line); @numbers = $line =~ /(\d+)/g; foreach my $number (@numbers) { if ( $number > $max ) { $lineWithMax = $line; $max = $number; } } } say "Line with highest number is '$lineWithMax'"; __DATA__ Hello, i'm 18 1 this year is 2019 1 1 2 3 - 4
    The code works with your sample data, but consider the following: If two or more lines contain the same highest number, it will output only the first one. If a line contains a negative number, it will be treated as a positive one (the "-" will be ignored). Only integers are considered. Numbers written with scientific notation, for example, will not be treated correctly (4 x 105 would be considered less than 40) and decimals would be truncated and the remaining digits treated as a new number.

    Today I learned that captured groupings from a regex can be put in an array.

      ... captured groupings from a regex can be put in an array.

      And they don't even have to be captured. Try
          @numbers = $line =~ /\d+/g;


      Give a man a fish:  <%-{-{-{-<

      Oh, hahah, I guess I did a really really bad job of reading the OP. Well I hope the comment was helpful, this seems far more so!


      The way forward always starts with a minimal test.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11103137]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (3)
As of 2024-04-19 05:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found