Как я могу добавить строку в массив, хранящийся в объекте, в Perl? - PullRequest
0 голосов
/ 13 сентября 2011

Я хочу использовать функцию obj-> log ($ msg) для хранения строк, а затем вывести их на дамп

ОБНОВЛЕНИЕ:

<code>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 '
'; } печать ''; }

но я не могу понять, как добавлять новые элементы в $ self -> {log} - я пришел из земли PHP, так что это немного больно.

Было бы неплохо, если бы я мог иметь в журнале какие-либо данные, и просто выгрузить их, массив, хэш или скаляр ... есть ли способ сделать это?

Ответы [ 5 ]

2 голосов
/ 13 сентября 2011

Значения хэшей должны быть скалярами. Если вы хотите хранить несколько значений в хеш-значениях, вам нужно найти способ размещения нескольких значений в скаляре. Способ, который будет хорошо работать здесь, включает сохранение ссылки на массив в хеш-значении:

$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 голос
/ 13 сентября 2011

Вы можете использовать лося.

<code>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 '
'; } печать ''; }
1 голос
/ 13 сентября 2011

Вы можете useautobox::Core.

use autobox::Core;
...
$self->{log}->push( $log_info );
1 голос
/ 13 сентября 2011

Как насчет этого:

  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";
    }
  }
1 голос
/ 13 сентября 2011

Похоже, что $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"; (не нужно отменять ссылку!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...