Arrays 在perl中,如何将字符串附加到存储在对象中的数组中?

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;

我想使用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>';
  }
使用警告;
严格使用;
使用诊断;
包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
的一个元素)。你到底想干什么