Perl 将字符串作为类变量引用
我试图将对字符串的引用保存在类变量中。 我希望通过取消引用来访问此变量。 例如,在例程Perl 将字符串作为类变量引用,perl,oop,class,object,class-variables,Perl,Oop,Class,Object,Class Variables,我试图将对字符串的引用保存在类变量中。 我希望通过取消引用来访问此变量。 例如,在例程getHeaders中,不使用: my $fileContentsRef = $this->getFileContent; my $fileContentsRef1 = $$fileContentsRef; $fileContentsRef1 =~ /Spaltenname.*?Datentyp.*?---\n(.*?)\n\n/gsmi; 我想使用: my $fileContentsRef = $t
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;
打开文件“a1.bad”;
$file_contents.=do{local$/;};
关闭文件;
我的$log=auswerter->new(\$file\u内容);
#-----------------------------------------------------------------
#潜艇
#-----------------------------------------------------------------
#建造师
次新
{
my$fileRef=$\u1];
我的$self={};
祝福自我;
$self->initialize();
如果($fileRef){$self->{fileRef}=$fileRef;}
返回$self;
}
子初始化
{
#-----------------------------------------------------------------
#配置
#-----------------------------------------------------------------
我的$this=shift;
}
子集合文件{
我的$this=shift;
$this->{file}=shift;
}
子getFileContent
{
我的$this=shift;
返回$this->{fileRef};
}
子GetHeader
{
打印“标题…\n”;
我的$this=shift;
我的@headers=();
my$fileContentsRef=$this->getFileContent;
my$fileContentsRef=$$fileContentsRef;
$fileContentsRef1=~/Spaltenname.*?Datentyp.*-\n(.*?)\n\n/gsmi;
@页眉=拆分(“\n”,$1);
foreach(@headers)
{
$\=~s/^(.*?\s.*/$1/;
}
返回\@头;
}
子getErrList
{
打印“错误列表…\n”;
我的$this=shift;
我的@errors=();
my$fileContentsRef=$this->getFileContent;
my$fileContentsRef=$$fileContentsRef;
$fileContentsRef1=~/Spaltenname.*(Satz.*)ORA.*?^Tabelle/gsmi;
如果!$1,则返回\@错误;
@错误=拆分(“\n\n”,$1);
foreach(@errors)
{
$\*/~s/*Spalte(.*?\…*/$1/msgi;
}
返回\@错误;
}
子条目
{
我的$this=shift;
我的@entries=();
my$fileContentsRef=$this->getFileContent;
my$fileContentsRef=$$fileContentsRef;
$fileContentsRef1=~/.=\n(.*)/gsmi;
@分录=拆分(“\n”,$1);
返回\@个条目;
}
子sqlldrAnalyze
{
我的$this=shift;
我的$token=shift;
my$errRef=$this->getErrList();
如果$#$errRef<0,则返回“”;
my$headersRef=$this->getHeaders();
my$entriesRef=$this->getEntries();
我的$i=0;
我的$str=“”;
$str=”“;
$str=”;
$str=”;
foreach(@$headersRef)
{
$str.=''.$\'';
}
$str=”;
foreach(@$entriesRef)
{
我的@errOffset=grep{$headersRef->[$\]=~$errRef->[$i]}0..$\$headersRef;
my@entries=split($token,$);
$str=”;
foreach(my$j=0;$j当使用filename参数调用class->new(…)
构造函数时,new
子例程将类名作为第一个参数,将filename作为第二个参数
在构造函数中,只需将$\u1]
(文件名)的值复制到$self->{FileRef}
,但该值不是引用
因此,当您访问它时,不需要使用双信号来解除对值的引用
运行所有代码时,应在顶部显示以下两行,这将为您捕获许多错误(包括在字符串不是引用时尝试使用字符串作为引用):
这两行代码基本上将Perl从快速的一行程序模式转移到更适合大型开发的模式(改进的类型安全性、静态变量名检查等)
根据更新:如果您的代码在复制字符串时工作正常,但在直接取消引用它时工作不正常,那么听起来您可能遇到了保留最后匹配位置的字符串引用问题(g
标志)
尝试运行以下命令:
my $fileContentsRef = $this->getFileContent;
pos($$fileContentsRef) = 0; # reset the match position
$$fileContentsRef =~ /Spaltenname.*?Datentyp.*?---\n(.*?)\n\n/gsmi;
当使用filename参数调用class->new(…)
构造函数时,new
子例程将类名作为第一个参数,将filename作为第二个参数
在构造函数中,只需将$\u1]
(文件名)的值复制到$self->{FileRef}
,但该值不是引用
因此,当您访问它时,不需要使用双信号来解除对值的引用
运行所有代码时,应在顶部显示以下两行,这将为您捕获许多错误(包括在字符串不是引用时尝试使用字符串作为引用):
这两行代码基本上将Perl从快速的一行程序模式转移到更适合大型开发的模式(改进的类型安全性、静态变量名检查等)
根据更新:如果您的代码在复制字符串时工作正常,但在直接取消引用它时工作不正常,那么听起来您可能遇到了保留最后匹配位置的字符串引用问题(g
标志)
尝试运行以下命令:
my $fileContentsRef = $this->getFileContent;
pos($$fileContentsRef) = 0; # reset the match position
$$fileContentsRef =~ /Spaltenname.*?Datentyp.*?---\n(.*?)\n\n/gsmi;
您好,Erik,谢谢您的快速回复。我调用它时引用了字符串作为参数(请参见编辑的问题)。还有一个问题…我如何取消引用$self->{fileRef},以便能够在get方法中使用pos()=0?提前感谢您好,Erik,谢谢您的快速回复。我调用它时引用了字符串作为参数(请参阅已编辑的问题)。还有一个问题…如何取消引用$self->{fileRef}以便能够在get方法中使用pos()=0?请提前感谢