我想使用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;
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>';
}
但我无法弄清楚如何将新项目附加到$ self-&gt; {log} - 我来自PHP土地,所以这有点痛苦。
如果我可以将日志记录为任何类型的数据,并将其转储出来,数组,散列或标量,那将是很好的...有没有办法做到这一点?
答案 0 :(得分:2)
哈希值必须是标量。如果要在哈希值中存储多个值,则需要找到一种在标量中放置多个值的方法。一种在这里运行良好的方法涉及在哈希值中存储对数组的引用:
$self->{log} = []; # Optional because of autovivification.
然后将多个值放在引用的数组中:
push @{ $self->{log} }, $log_info;
可以按如下方式迭代值:
for my $entry (@{ $self->{log} }) {
如果您想使用$i % 2
的索引,可以使用:
my $log = $self->{log};
for my $i (0..$#$log) {
my $entry = $log->[$i];
...
}
注意:自5.14.0起,
push $self->{log}, ...;
大致相当于
push @{ $self->{log} }, ...;
Perl 5.14非常新,所以你可能希望远离它,除非你只为自己编码。
答案 1 :(得分:1)
好像$self->{log}
是一个数组引用。从Perl 5.14.0开始,push
对数组引用是安全的,但是否则,你需要取消引用数组引用并执行:push(@{$self->{log}},$log_info);
。同样,您需要在执行@log
时分配到my @log=@{$self->{log}}
时取消引用(顺便说一句,您的脚本顶部有use strict;
和use warnings;
, ?)。
查看perldoc perlreftut
和perldoc perlref
。
您可能还会发现Data::Dumper
对于打印复杂的数据结构非常方便。如果你想知道日志中的所有内容,你可以在脚本的开头有use Data::Dumper;
,然后print Dumper($self->{log}) . "\n";
(无需取消引用!)。
答案 2 :(得分:1)
这个怎么样:
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";
}
}
答案 3 :(得分:1)
你可以use
autobox::Core
。
use autobox::Core;
...
$self->{log}->push( $log_info );
答案 4 :(得分:1)
你可以使用驼鹿。
package Logger;
use Moose; ### Enables strict/warnings
has '_log_ref' => => (
traits => ['Array'],
is => 'ro',
isa => 'ArrayRef[Str]',
default => sub { [] },
handles => {
_log_contents => 'elements',
log => 'push',
},
);
sub showlog {
my($self) = @_;
my $counter = 0;
print '<div id="log" class="_view _debug"><h1>Log Data</h1>';
for my $i ($self->_log_contents()) {
$counter++;
print '<div class="item',(($counter%2)?' alt':''),'"><em class="tag">',$counter,'</em><pre>';
print(Dumper($i));
print $i;
print '</pre></div>';
}
print '</div>';
}