только отладочная подпрограмма, печатающая первую запись в массиве хэшей в perl - PullRequest
0 голосов
/ 25 января 2020

У меня есть отладка, которая только что отправила меня на дикий гусейз в Perl. Я исправил свою первоначальную проблему, но теперь я озадачен тем, почему мой отладчик не работает. У меня есть следующий код:

sub debug {
   my ($msg) = @_;
   print $DBGFILE "DBG: $msg\n" if $dbg;
}

В одном месте у меня есть вызов, чтобы напечатать массив хэшей следующим образом:

debug "v----------- parsed variables: -------------";
debug Dumper @knownVars;
debug "^----------- parsed variables: -------------";

Это, кажется, выводит только первое из закрытия до 200 записей в массиве:

DBG: v----------- parsed variables: -------------
DBG: $VAR1 = {
      'local' => 1,
      ...
      'op' => ':=',
    };
DBG: ^----------- parsed variables: -------------

Если я использую отладчик и выполняю

p Dumper @knownVars

в этой строке, он выводит весь массив. Массив большой (170 записей по 40-200 строк в каждой), поэтому мне интересно, допустил ли я синтаксическую ошибку в этом или это какое-то ограничение размера буфера. (примечание perl 5.22.0)

1 Ответ

2 голосов
/ 25 января 2020

В качестве предисловия аргументы, передаваемые (и возвращаемые) функции, могут быть только одной вещью: списком скалярных значений. Вы не можете передать массив или переменную ha sh, кроме как взяв ссылку на них, которая является скалярным значением. Подробнее об этом см. http://altreus.blogspot.com/2011/08/lists-and-things-made-of-lists.html.

debug Dumper @knownVars;

. Передача содержимого @knownVars в виде списка в Dumper. Согласно документации , Dumper будет возвращать список строк в контексте списка, поэтому он будет возвращать одну строку для каждого элемента. Этот список строк затем передается в вашу функцию отладки, которая действует только на первый элемент, переданный в списке аргументов.

debug Dumper \@knownVars;

Передавая ссылку на массив вместо списка содержимого, это дает Dumper только один элемент для преобразования в одну строку, которую затем получит ваша функция отладки.

Кроме того, вы можете обновить свою функцию отладки до l oop through и воздействовать на все строки, переданные в @_, как печать делает в общей идиоме: print Dumper @items;

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