私は、タブ区切りのテキストファイルをサブルーチンでネストされたハッシュに解析することを考えています。各ファイル行には、uid列の一意のIDと、ヘッダー行がネストされたキーとしてキーされます。どの列がuidの変更になるのですか(時には一意の列がないため、uidは列の組み合わせでなければなりません)。私の問題は、$uid
という変数で補間されていない文字列として渡します。私はアイデアをしていますPerlのサブルーチン内で補間されていない渡された文字列を補間する
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;
}
:私は、補間方法でサブルーチン内でそれを使用しようとすると、それだけで私に非補間値が得られます。私は$table{$row{$uid}}
を入れて、単に"gene"
を渡すが、インスタンスのカップルに私はPerlのパーサの特徴である$uid
$table{ACB1|123456}
おかげで、機能が完全に働きました。 chompのために、私は余分な改行を加えて警告を出させようとしましたが、字句ファイルハンドルの有無にかかわらず問題はないようです。それはちょうどバージョンの違い(私たちのサーバーはv5.10.1を実行している)であることですか? – dragon951
@ dragon951されていないようです。私は5.8.9,5.10.1、5.24.1の警告を次のコードで表示します: 'perl -e '警告を使用します。 while(chomp(my $ line = <>)){} '/ dev/null' – melpomene