2011-07-11 18 views
0

クラス変数の文字列への参照を保存しようとしています。 この変数に逆参照することでこの変数にアクセスしたいと考えています。代わりに使用しての日常getHeadersで例えば :クラス変数としての文字列への参照

my $fileContentsRef = $this->getFileContent; 
my $fileContentsRef1 = $$fileContentsRef; 
$fileContentsRef1 =~ /Spaltenname.*?Datentyp.*?---\n(.*?)\n\n/gsmi; 

私が使用したい:

my $fileContentsRef = $this->getFileContent; 
$$fileContentsRef =~ /Spaltenname.*?Datentyp.*?---\n(.*?)\n\n/gsmi; 

は、詳細については、あなたが最後にコードが表示されるはずです。 私の問題は、コピーを使用していないとき(つまり、$fileContentsRef1を使用していないとき)にプログラムが動作しないということです。私は何をしていますか、間違っていますか?私が記述した方法で目標に到達することは可能ですか?いくつか私に手がかりを与えることができますか?

open FILE, "a1.bad"; 
$file_contents .= do { local $/; <FILE> }; 
close FILE; 
my $log = auswerter->new(\$file_contents); 


#----------------------------------------------------------------- 
# Subs 
#----------------------------------------------------------------- 

# CONSTRUCTOR 
sub new 
{ 
    my $fileRef = $_[1]; 
    my $self = {}; 
    bless $self; 
    $self->initialize(); 
    if($fileRef) { $self->{fileRef} = $fileRef; } 
    return $self; 
} 
sub initialize 
{ 
#----------------------------------------------------------------- 
# Configuration 
#----------------------------------------------------------------- 
    my $this = shift; 
} 
sub setFile { 
    my $this = shift; 
    $this->{file} = shift; 
} 
sub getFileContent 
{ 
    my $this = shift; 
    return $this->{fileRef}; 
} 
sub getHeaders 
{ 
    print "HEADERS...\n"; 

    my $this = shift; 
    my @headers =(); 
    my $fileContentsRef = $this->getFileContent; 
    my $fileContentsRef1 = $$fileContentsRef; 

    $fileContentsRef1 =~ /Spaltenname.*?Datentyp.*?---\n(.*?)\n\n/gsmi; 
    @headers = split ("\n", $1); 
    foreach (@headers) 
    { 
    $_ =~ s/^(.*?)\s.*/$1/; 
    } 
    return \@headers; 
} 
sub getErrList 
{ 
    print "ERR LIST...\n"; 
    my $this = shift; 
    my @errors =(); 
    my $fileContentsRef = $this->getFileContent; 
    my $fileContentsRef1 = $$fileContentsRef; 

    $fileContentsRef1 =~ /Spaltenname.*?(Satz.*)ORA.*?^Tabelle/gsmi; 
    return \@errors if !$1; 

    @errors = split ("\n\n", $1); 
    foreach (@errors) 
    { 

      $_ =~ s/.*Spalte (.*?)\..*/$1/msgi; 
    } 
    return \@errors; 
} 
sub getEntries 
{ 
    my $this = shift; 
    my @entries =(); 
    my $fileContentsRef = $this->getFileContent; 
    my $fileContentsRef1 = $$fileContentsRef; 
    $fileContentsRef1 =~ /.*==\n(.*)/gsmi; 
    @entries = split ("\n", $1); 
    return \@entries; 
} 
sub sqlldrAnalyze 
{ 
    my $this = shift; 
    my $token = shift; 
    my $errRef =$this->getErrList(); 
    return "" if $#$errRef < 0 ; 

    my $headersRef = $this->getHeaders(); 
    my $entriesRef = $this->getEntries(); 
    my $i = 0; 
    my $str = ""; 
    $str = "<html>"; 
    $str .= "<table rules=\"all\">"; 
    $str .= "<tr>"; 
    foreach (@$headersRef) 
    { 
     $str .= "<th>".$_."</th>"; 
    } 
    $str .= "</tr>";  
    foreach (@$entriesRef) 
    { 
     my @errOffset = grep { $headersRef->[$_] =~ $errRef->[$i] }0..$#$headersRef ; 
     my @entries = split($token, $_); 
     $str .= "<tr>"; 
     foreach (my $j =0; $j <= $#entries;$j++) 
     { 
     $str .= "<td nowrap"; 
     $str .= " style=\"background-color: red\"" if $j == $errOffset[0];; 
     $str .= ">"; 
     $str .= "<b>" if $j == $errOffset[0]; 
     $str .= $entries[$j]; 
     $str .= "</b>" if $j == $errOffset[0]; 
     $str .= "</td>";   
    } 
    $str .= "</tr>\n"; 
    $i++; 
    } 
    $str .= "</table>"; 
    $str .= "</html>"; 
    return $str; 
} 
return 1; 

答えて

3

filename引数を使用してclass->new(...)コンストラクタを呼び出すと、newサブルーチンは最初の引数、第二引数としてファイル名としてクラス名を取得します。

コンストラクタでは、$_[1](ファイル名)の値を$self->{FileRef}にコピーしていますが、その値は参照ではありません。

これにアクセスすると、値を逆参照するために二重の記号を使用する必要はありません。

あなたが(彼らは言及しない場合に参照として文字列を使用しようとしているを含む)あなたのために多くのエラーをキャッチれる、上部に次の2行ですべてのコードを実行する必要があります。

use strict; 
use warnings; 

これらの基本的に2行はPerlを高速の1ライナーモードから、大規模な開発(型安全性の向上、静的変数名のチェックなど)に適したモードに移行します。更新毎


:文字列をコピーするときに、あなたが持っているコードが正しく動作しているが、直接それを逆参照しない場合は、あなたが最後にマッチした位置を維持する文字列参照の問題に実行していることも同じように、それが聞こえる場合(gフラグ)。

は、次のことを実行してみましょう:

my $fileContentsRef = $this->getFileContent; 
pos($$fileContentsRef) = 0; # reset the match position 
$$fileContentsRef =~ /Spaltenname.*?Datentyp.*?---\n(.*?)\n\n/gsmi; 
+0

こんにちはエリックは、迅速な応答をありがとうございました。私は引数として文字列を参照して呼び出す(編集された質問を参照)。 –

+0

こんにちは、エリック、もう一度感謝します。それはうまく動作します! –

+0

もう1つ質問... getメソッドでpos()= 0を使用できるようにするには、どうすれば$ self - > {fileRef}を逆参照できますか? ありがとうございます –

関連する問題