while (<>) { next if /^ID/; chomp; # if $ARGV = 'tab1.txt', $table will = 'tab1' # unless $table is already initiallized. # $table is uninitiallized on the first read # and after end of file for every file # (see below: $table = '' if eof;) ($table = fileparse $ARGV) =~ s/\.txt$// unless $table; # If the column count for this table is not already # stored, then use the transliteration operator to count # the number of pipes (# of columns) and store it. $col_cnt{$table} ||= tr/|//; my ($gene, $cols) = split /\s*\|\s*/, $_, 2; # Here columns are not stored in an array, but in a string # if the data is: # gene 3 | value 3.1 | value 3.2 # then $cols would be: # 'value 3.1 | value 3.2' $data{$gene}{$table} = $cols; $table = '' if eof; }