Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re^2: Sort alphabetically from file

by edujs7 (Novice)
on Jun 15, 2019 at 08:33 UTC ( [id://11101386]=note: print w/replies, xml ) Need Help??

in reply to Re: Sort alphabetically from file
in thread Sort alphabetically from file

Original contents:

thanks I tried the below and no errors but nothing happens, sure it's me though.
if ($ARGV[0] eq "-a") { open (INFILE, "$ARGV[1]") or die "$ARGV[1] cannot be openned : $!"; my %hash; while ($source_file =~ /(\d)\s+(\d)\s+(\d)\s+(\w+)/) { push @{$hash{$4}}, $1, $2, $3; } print "@{$hash{$_}}[0..2] $_\n" for sort keys %hash; }
BTW I should've mentioned I must call my program as follows:$ARGV[0]) option($ARGV[1]) mytextfile.txt($ARGV[-1]) I'm using this for assigning the text file to a variable $source_file = "$ARGV[-1] hence using $source_file to call the text file but now working. am I missing something?
Thanks - will try this out. :)

2019-06-17 Athanasius restored original contents and added code tags around the program call

Replies are listed 'Best First'.
Re^3: Sort alphabetically from file
by soonix (Canon) on Jun 15, 2019 at 09:50 UTC
    • open (INFILE, "$ARGV[1]") or die "$ARGV[1] cannot be openned : $!"; while ($source_file =~ /(\d)\s+(\d)\s+(\d)\s+(\w+)/)
      Maybe (probably) in your head there's a connection between INFILE and $source_file, but not in your script.
      For Perl, they're unrelated…
    • if ($ARGV[0] eq "-a")
      How do you know your $ARGV[0] really equals "-a"?
      What happens if it doesn't?
      I recommend to add an else block with a print "whatever\n", at least while you're still experimenting.
    • Many of the suggestions to your questions include using strict and warnings. Although this seems to impede or slowing down one's development, I recommend it, too:
      • Yes, the time it takes before your script "runs", will be longer
      • The time until your script works correctly, will be shorter
      One of strict's messages is confusing for beginners:
      Global symbol "$x" requires explicit package name
      should read
      Do you really want "$x" to be a global symbol? Better declare it with my
    If you are new to Perl, you might like diagnostics, which won't throw more errors, but messages that (hopefully) are more informative. So, your script(s) should start with
    use strict; use warnings; use diagnostics;
      noted. Thank you very much for your support.

        Also, if your on Windows like me, I open($file, '<', shift) or die "$!"; and then immediately binmode($file);.

        Commands or parameters or filenames added to the command line when calling the script get put into an array called @ARGV and when you call shift it increments $ARGV[0] to $ARGV[1] to $ARGV[2] and so on for each shift used.

        So, if you used C:\path\to\script\perl file_1.txt outfile.txt then you could use shift again to open() (use three arg open) and instead of printing it to the console window, you can write the output to $outFile.

        use strict; use warnings; my %hash; open (my $inFile, '<', shift) or die "$!"; open (my $outFile, '>', shift) or die "$!"; binmode($inFile); binmode($outFile); while (<$inFile> =~ /(\d)\s+(\d)\s+(\d)\s+(\w+)/){ push @{$hash{$4}}, $1, $2, $3; } print $outFile "@{$hash{$_}}[0..2] $_\n" for sort keys %hash;
        Usage: C:\path\to\script\perl inFile.txt outFile.txt

        Also, please note this also removes one space from each column per row. As long as that does not corrupt your data set it should be fine. It actually may save you some hard drive space. :)

        EDITED: fixed typo in matching patterns, thanks haukex

        EDITED: changed and made obvious that the individual needs to make absolutely certain that this does not corrupt anything in their data set.

        EDITED: had to add a new paragraph so my second EDIT looked ok.

Re^3: Sort alphabetically from file
by bliako (Abbot) on Jun 15, 2019 at 09:29 UTC

    It is better to open the file using open INFILE, "<", $ARGV[1] or, even better, open $inFILE_HANDLE, "<", $ARGV[1]. It is not causing you a problem now because open() opens for reading (called the "mode") without explicitly setting mode (e.g. reading: "<")

    There is a problem reading the file. First you open a file using open(), for that you get a fileHANDLE, e.g. the INFILE or $inFILE_HANDLE. Then you loop reading from the FILE-HANDLE using the diamond operator while(<$inFILE_HANDLE>){ print $_ } and then you close the file(HANDLE): close $inFILE_HANDLE;. You can't read any file contents from a variable which just stores the fileNAME.

    In the case your input is not unique wrt the fourth column you will miss input, all similar column-four lines will go to the hash keyed on column-four overriding any previous line with same column-four key. One solution is not to use a hash but an array of arrays (these are formed in exactly the same way as you do now with the regex) and sort works on arrays.

    See Re^3: Sort alphabetically from file and Re^3: Sort alphabetically from file, they already gave you hints for file open/read problems.

      > In the case your input is not unique wrt the fourth column you will miss input,

      That's my biggest problem with this hash approach! Thanks for pointing it out. :)

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Log In?

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

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (2)
As of 2024-06-19 03:34 GMT
Find Nodes?
    Voting Booth?

    No recent polls found

    erzuuli‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.