2016-06-27 5 views
0

私のコードのあるセクションではうまくいくが、別のセクションではうまく機能しない変数があります。私は非常に長いコードを切り詰めて、何が起こっているのかを理解しようとします。問題の変数には単に「$ QuestionableVariable」という名前を付けます。Perl:変数がSCALAR(0x7faf2b804240)として表示されます

#!/usr/bin/perl 
    use warnings; 
    use strict; 

    my $QuestionableVariable = LongSubroutine("file.txt"); 
    my $WindowSize = 16; 
    my $StepSize = 1; 
    my %hash =(); 

    for ( 
      my $windowStart = 0; 
      $windowStart <= 140; 
      $windowStart += $StepSize 
    ) 
    { 
    my $Variable_1 = substr($$QuestionableVariable, $windowStart, $WindowSize); #here $QuestionableVariable works well 
    my $Variable_2 = 'TAGCTAGCTAGCTAGC'; 
    my $dist = AnotherLongSubroutine($Variable_1, $Variable_2); 
    $hash{$dist} = $Variable_1; 

ここでは、読みやすさのために長いサブルーチンを省略します。私は彼らがエラーなしに私の期待される出力を生成すると信じているので、私は彼らがこの問題を解決するのに役立たないと仮定しています。 $ QuestionableVariableは上のコードセクションではうまくいきますが、私はプログラムがうまく動作しないサブルーチンが出現した後にそれを表示します。

my @keys = sort {$a <=> $b} keys %hash; 
    my $BestMatch = $hash{keys[0]}; 

    print "Distance_of_Best_Match: $keys[0] Sequence_of_best_match: $BestMatch", "\n", "$QuestionableVariable", "\n"; 

コードがエラーなしで実行されますが、$ QuestionableVariableの値の代わりに私がSCALAR(0x7faf2b804240)を取得します。 代わりに変数の値を取得するにはどうすればよいですか? ありがとう

+0

ところで、 'my%hash =();'は冗長です。単に 'my%hash;'と書くことができます。 – melpomene

答えて

1

"working"行にはではなく$$QuestionableVariableが使用されています。

ここでは、読みやすさのために長いサブルーチンを省略します。私は彼らがこの問題を解決するのに役立たないと仮定しています。

悪い仮定。明らかにLongSubroutineは、平易な文字列ではなく、スカラへの参照を返します。だからこそ、あなたはSCALAR(0x7faf2b804240)を出力します:それは、印刷されたときの参照の様子です。

$$QuestionableVariable内容を取得するための参照を参照していますが、正常に動作しているようです。あなたは

print "Distance_of_Best_Match: $keys[0] Sequence_of_best_match: $BestMatch\n", "$$QuestionableVariable\n"; 

にあなたの最後の行を変更する場合は、期待どおり

それが動作するはずです。

+0

お返事ありがとうございます。 – Rob

+3

それは完全に間違ったソリトンです。 'LongSubroutine'は、文字列への参照ではなく文字列を返すように変更する必要があります。 – ikegami

+0

@ikegami「LongSubroutine」が何であるか、それがなぜそのように書かれたのか(例えば、CPANモジュールから来るかもしれない)によって異なります。 – melpomene

関連する問題