Arrays 在perl中,如何将字符串附加到存储在对象中的数组中?
我想使用obj->log($msg)函数来存储字符串,然后在以后转储它们 更新:Arrays 在perl中,如何将字符串附加到存储在对象中的数组中?,arrays,perl,Arrays,Perl,我想使用obj->log($msg)函数来存储字符串,然后在以后转储它们 更新: use warnings; use strict; use diagnostics; package obj; sub log{ my($self,$log_info) = @_; push(@{$self->{log}},$log_info); } sub showlog{ my($self) = @_; my $counter = 0;
use warnings;
use strict;
use diagnostics;
package obj;
sub log{
my($self,$log_info) = @_;
push(@{$self->{log}},$log_info);
}
sub showlog{
my($self) = @_;
my $counter = 0;
my @log= @{$self->{log}};
print '<div id="log" class="_view _debug"><h1>Log Data</h1>';
foreach my $i (@log) {
$counter++;
print '<div class="item',(($counter%2)?' alt':''),'"><em class="tag">',$counter,'</em><pre>';
print(Dumper($i));
print $i;
print '</pre></div>';
}
print '</div>';
}
使用警告;
严格使用;
使用诊断;
包obj;
子日志{
我的($self,$log\u info)=@;
推送(@{$self->{log}},$log\u info);
}
子显示日志{
我的($self)=@;
我的$counter=0;
my@log=@{$self->{log};
打印“日志数据”;
foreach my$i(@log){
$counter++;
打印“”,$counter“”;
打印(翻车机($i));
打印$i;
打印“”;
}
打印“”;
}
但我不知道如何将新项附加到$self->{log}——我来自PHP领域,所以这有点痛苦
如果我可以让日志成为任何类型的数据,并将其转储为数组、散列或标量,那就太好了。。。有办法做到这一点吗?看起来好像
$self->{log}
是一个数组引用。从Perl 5.14.0开始,将推送到数组引用上是安全的,但是,否则,您将希望取消对数组引用的引用并执行:推送(@{$self->{log},$log\u info)代码>。类似地,在分配给@log
时,通过执行my@log=@{$self->{log}
(顺便说一句,脚本顶部有use strict;
和use warnings;
,对吗?)
看一看,然后
您可能还会发现打印出复杂的数据结构非常方便。如果您想知道日志中的所有内容,您可以让use Data::Dumper代码>在脚本的开头,然后执行打印转储程序($self->{log})。“\n”
(无需取消引用!)。看起来好像$self->{log}
是一个数组引用。从Perl 5.14.0开始,将推送到数组引用上是安全的,但是,否则,您将希望取消对数组引用的引用并执行:推送(@{$self->{log},$log\u info)代码>。类似地,在分配给@log
时,通过执行my@log=@{$self->{log}
(顺便说一句,脚本顶部有use strict;
和use warnings;
,对吗?)
看一看,然后
您可能还会发现打印出复杂的数据结构非常方便。如果您想知道日志中的所有内容,您可以让use Data::Dumper代码>在脚本的开头,然后执行打印转储程序($self->{log})。“\n”代码>(无需取消引用!)。哈希值必须是标量。如果要在哈希值中存储多个值,则需要找到一种将多个值放置在标量中的方法。在这里工作良好的一种方法是在散列值中存储对数组的引用:
push @{ $self->{log} }, $log_info;
然后将多个值放置在引用的数组中:
for my $entry (@{ $self->{log} }) {
可以按如下方式迭代这些值:
my $log = $self->{log};
for my $i (0..$#$log) {
my $entry = $log->[$i];
...
}
如果要对$i%2
使用索引,可以使用:
push $self->{log}, ...;
注:自5.14.0起
push @{ $self->{log} }, ...;
基本相当于
package Logger;
# create a logger object
sub new {
my ($class) = @_;
my @messages;
my $self = {
log => \@messages,
};
bless $self, $class;
return $self;
}
# add a message to the log
sub append {
my $self = shift;
my $message = shift;
push ( @{$self->{log}}, $message );
}
# print the log
sub printlog {
my $self = shift;
foreach my $msg ( @{$self->{log}} ){
print "$msg\n";
}
}
Perl 5.14是一个非常新的版本,因此您可能不想使用它,除非您只是为自己编写代码。哈希值必须是标量。如果要在哈希值中存储多个值,则需要找到一种将多个值放置在标量中的方法。在这里工作良好的一种方法是在散列值中存储对数组的引用:
push @{ $self->{log} }, $log_info;
然后将多个值放置在引用的数组中:
for my $entry (@{ $self->{log} }) {
可以按如下方式迭代这些值:
my $log = $self->{log};
for my $i (0..$#$log) {
my $entry = $log->[$i];
...
}
如果要对$i%2
使用索引,可以使用:
push $self->{log}, ...;
注:自5.14.0起
push @{ $self->{log} }, ...;
基本相当于
package Logger;
# create a logger object
sub new {
my ($class) = @_;
my @messages;
my $self = {
log => \@messages,
};
bless $self, $class;
return $self;
}
# add a message to the log
sub append {
my $self = shift;
my $message = shift;
push ( @{$self->{log}}, $message );
}
# print the log
sub printlog {
my $self = shift;
foreach my $msg ( @{$self->{log}} ){
print "$msg\n";
}
}
Perl 5.14是一个非常新的版本,因此您可能希望暂时不要使用它,除非您只是为自己编写代码。这个怎么样:
use autobox::Core;
...
$self->{log}->push( $log_info );
这个怎么样:
use autobox::Core;
...
$self->{log}->push( $log_info );
您可以使用
您可以使用
你可以用驼鹿
包记录器;
使用驼鹿启用严格警告/警告
有“\u log\u ref”=>=>(
traits=>['Array'],
is=>“ro”,
isa=>ArrayRef[Str],
默认值=>sub{[]},
句柄=>{
_日志内容=>“元素”,
log=>“推送”,
},
);
子显示日志{
我的($self)=@;
我的$counter=0;
打印“日志数据”;
对于我的$i($self->\u log\u contents()){
$counter++;
打印“”,$counter“”;
打印(翻车机($i));
打印$i;
打印“”;
}
打印“”;
}
你可以用驼鹿
包记录器;
使用驼鹿启用严格警告/警告
有“\u log\u ref”=>=>(
traits=>['Array'],
is=>“ro”,
isa=>ArrayRef[Str],
默认值=>sub{[]},
句柄=>{
_日志内容=>“元素”,
log=>“推送”,
},
);
子显示日志{
我的($self)=@;
我的$counter=0;
打印“日志数据”;
对于我的$i($self->\u log\u contents()){
$counter++;
打印“”,$counter“”;
打印(翻车机($i));
打印$i;
打印“”;
}
打印“”;
}
看起来不太正确,$self->{log}是数组引用吗?如果是这样,您应该使用@{$self->{log}这看起来不太正确,$self->{log}是数组引用吗?如果是这样的话,您应该使用{$self->{log}好的,请确保,因为我没有在代码段中出现@log
的第一个位置看到我的@log
。)嗯,我想在日志中有一个数组、散列或标量,并使用转储程序来呈现它们,但我想用一个pre标记和一些html类来包装输出,我没有幸运地将数组传递给我的日志函数是的,仔细看看show_log
,我不确定你所说的$。%2
。不,循环变量是$i
(它是@log
的一个元素)。你到底想干什么