Hi, I tried to make some changes to my script, but it still does not work. Here is a better explanation:
this script that is executed like this: ./colstat.pl -f <filename> -e ; (specify what to use in the split function in order to divide the columns) I would like to put each line from the input file into an array, and I want to put this array into a hash, where the column number equals to the hash key/pointer, so the print would look somehow like this: nr 1: 34 67 927 536 8 92 nr 2: 4 563 1 56789 983 nr 3: 43 02 903 63 73 893 . . . . . Following is the script I got this far, this does not print out the output I just described, but an output looking like this: 1: 34 4 78 1 5463 The part with the probem: while ( $line = <FILE> ) { chomp $line; @dataarray = split /$var/,$line; $column = $dataarray[$c]; push(@array,$column); $hash{$c + 1} = [ @array ]; } for my $nr ( keys %hash ) { print sort "$nr: @{ $hash{$nr}}\n"; } The whole script: colstat.pl #!/usr/bin/perl # Needed pkg use Getopt::Std; use strict "vars"; # Global variables my $VERBOSE = 0; my $DEBUG = 0; ################################################################ # handle flags and # Example: c == "-c", c: == "-c argument" my $opt_string = 'hvdf:e:'; getopts( "$opt_string", \my %opt ) or usage() and exit 1; # exit other than 0 = error!! # print help message if -h is invoked if ( $opt{'h'} ){ usage(); exit 0; } $VERBOSE = 1 if $opt{'v'}; $DEBUG = 1 if $opt{'d'}; my $FILE = $opt{'f'}; my $DELIMITER = $opt{'e'}; # main program content # the actual code shuld run her open (FILE, "$FILE") or die ("ERROR $!\n"); my @array; my %hash = (); my $column; my @dataarray; my $line; my $counter; my $var = $DELIMITER; my $counter; my $c; while ( $line = <FILE> ) { chomp $line; @dataarray = split /$var/,$line; $column = $dataarray[$c]; push(@array,$column); $hash{$c + 1} = [ @array ]; } for my $nr ( keys %hash ) { print sort "$nr: @{ $hash{$nr}}\n"; } ########################################## # Helper routines sub usage { # print the correct use of this script print "Usage:\n"; print "-h Usage\n"; print "-v Verbose\n"; print "-d Debug\n"; print "-f Input file\n"; print "-e Delimiter\n"; } sub verbose { print $_[0] if ( $VERBOSE or $DEBUG ); } sub debug { print $_[0] if ( $DEBUG ); } Pastebot is powered by POE. Den 27. mars 2010 kl. 10.09 skrev Shlomi Fish: > Hi alekto! > > A few comments on your code based on your excerpt. > > On Saturday 27 Mar 2010 00:08:31 alekto wrote: >> Hi, >> I got this script that is executed like this: ./colstat.pl -f <filename> -e >> ; (specifywhat to use in the split function in order to divide the >> columns) I would like to put each line from the input file into an array, >> and I want to put this array into a hash, where the column number equals >> to the hash key/pointer, so the print would look somehow like this: >> >> nr 1: 34 67 927 536 8 92 >> nr 2: 4 563 1 56789 983 >> nr 3: 43 02 903 63 73 893 >> . >> . >> . >> . >> . >> >> Following is the script I got this far, this does not print out the output >> I just described, but an output looking like this: 6: 34 4 78 1 5463 >> >> The part with the probem: >> >> >> while ( $line = <FILE> ) { >> chomp $line; >> @dataarray = split /$var/,$line; >> $column = $dataarray[$c]; >> push(@array,$column); >> $counter++; >> >> } > > 1. Add "use strict;" and "use warnings;" and fix all their errors and > warnings. You need to declare variables using "my". > > 2. Don't use bareword filehandles - see > http://www.perlfoundation.org/perl5/index.cgi?ancient_perl > >> $hash{$counter + 1} = [ @array ]; >> > > Why are you populating the hash after the loop? Don't you want to have every > line in a separate record? Furthermore, if you're using integer keys, > shouldn't you be using an array instead? > >> for my $nr ( keys %hash ) { >> print sort "$nr: @{ $hash{$nr} }\n"; >> } > > You cannot sort a single string. Do you want to sort @{ $hash{$nr} }. If so, > you can use: > > {{{ > sort { $a <=> $b } @{ $hash{$nr} } > }}} > > Or: > > {{{ > sort { $a cmp $b } @{ $hash{$nr} } > }}} > > Regards, > > Shlomi Fish > > -- > ----------------------------------------------------------------- > Shlomi Fish http://www.shlomifish.org/ > The Case for File Swapping - http://shlom.in/file-swap > > Deletionists delete Wikipedia articles that they consider lame. > Chuck Norris deletes deletionists whom he considers lame. > > Please reply to list if it's a mailing list post - http://shlom.in/reply .