Interpolating a non-interpolated passed string inside a subroutine in Perl

Viewed 351

I am looking to parse a tab delimited text file into a nested hash with a subroutine. Each file row will be keyed by a unique id from a uid column(s), with the header row as nested keys. Which column(s) is(are) to become the uid changes (as sometimes there isn't a unique column, so the uid has to be a combination of columns). My issue is with the $uid variable, which I pass as a non-interpolated string. When I try to use it inside the subroutine in an interpolated way, it will only give me the non-interpolated value:

    use strict;
    use warnings;

    my $lofrow = tablehash($lof_file, '$row{gene}', "transcript", "ENST");

    ##sub to generate table hash from file w/ headers
    ##input values are file, uid, header starter, row starter, max column number
    ##returns hash reference (deref it)
    sub tablehash   { 
        my ($file, $uid, $headstart, $rowstart, $colnum) = @_;
        if (!$colnum){ # takes care of a unknown number of columns
            $colnum = 0;
        }
        open(INA, $file) or die "failed to open $file, $!\n";
        my %table; # permanent hash table 
        my %row; # hash of column values for each row
        my @names = (); # column headers
        my @values = (); # line/row values
        while (chomp(my $line = <INA>)){ # reading lines for lof info
            if ($line =~ /^$headstart/){
                @names = split(/\t/, $line, $colnum);
            } elsif ($line =~ /^$rowstart/){ # splitting lof info columns into variables
                @values = split(/\t/, $line, $colnum);
                @row{@names} = @values;
                print qq($uid\t$row{gene}\n); # problem: prints "$row{gene} ACB1"
                $table{"$uid"} = { %row }; # puts row hash into permanent hash, but with $row{gene} key)
            }
        }
        close INA;
        return \%table;
    }

I am out of ideas. I could put $table{$row{$uid}} and simply pass "gene", but in a couple of instances I want to have a $uid of "$row{gene}|$row{rsid}" producing $table{ACB1|123456}

1 Answers
Related