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

时间:2011-09-12 22:28:02

标签: 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;
    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土地,所以这有点痛苦。

如果我可以将日志记录为任何类型的数据,并将其转储出来,数组,散列或标量,那将是很好的...有没有办法做到这一点?

5 个答案:

答案 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 perlreftutperldoc 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>';
}