Рекурсивно печатая структуры данных в Perl

Почти все предыдущие короткие методы генерируют недопустимые шестнадцатеричные коды (пять цифр). Я сталкивался с подобной техникой только без этой проблемы здесь :

"#"+("000"+(Math.random()*(1<<24)|0).toString(16)).substr(-6)

Test

Попробуйте это в консоли:

for(i = 0; i < 200; i++) {
    console.log("#" + ("000" + (Math.random()*(1<<24)|0).toString(16)).substr(-6));
}

5
задан Péter Török 28 June 2010 в 15:46
поделиться

6 ответов

  1. Всегда используйте use strict ;
  2. Чтобы быть хорошим мальчиком, используйте также используйте предупреждения .
  3. Имена, которые вы используете для подпрограммы должны делать очевидным, что делает подпрограмма. "recurseErrors" нарушает этот принцип. Да, это рекурсивно. Но какие ошибки?
  4. В первой строке каждой подпрограммы вы должны объявить и инициализировать любые параметры. recurseErrors сначала объявляет $ str, а затем объявляет его параметры.
  5. Не смешивайте shift и = @_, как в str ()
  6. Вы можете подумать о том, чтобы разделить то, что сейчас называется recurseErrors, на специализированные процедуры для обработки массивов и хэшей.
  7. Нет необходимости заключать переменные в кавычки. как в строках 99 и 109.

Кроме того, я думаю, что у вашего инструктора был плохой день в тот день.

8
ответ дан 18 December 2019 в 06:03
поделиться

Если вы новичок в Perl, я ' Я рекомендую запускать ваш код через perl-critical (есть также сценарий, который вы можете установить из CPAN, обычно я использую его как тест, поэтому он запускается из командной строки всякий раз, когда я выполняю команду «make test») . В дополнение к его выводам вы можете захотеть еще немного разбить свои функции. У recurseErrors есть три случая, которые можно разделить на подфункции (или даже поместить в хэш типа ref для подфункции ref).

Если бы это было производственное задание, я бы использовал Data :: Dumper ,

6
ответ дан 18 December 2019 в 06:03
поделиться

возможно, Data :: Dumper - это то, что вам нужно:

use Data::Dumper;

$str = Dumper($foo);
print($str);
7
ответ дан 18 December 2019 в 06:03
поделиться

Вот один простой пример, почему ваш код не легко читается:

$delimiter = "\n--------------------------------------------" unless (defined $delimiter);

Вы можете использовать оператор defined или :

$delimiter //= "\n" . '-' x 44;

Если вас беспокоят более ранние Perls:

defined $delimeter or $delimeter = "\n" . '-' x 44;

Условные выражения, выходящие за правое поле, достаточно выключения, чтобы я не читал остальную часть кода.

3
ответ дан 18 December 2019 в 06:03
поделиться

Я предполагаю, что ему не нравится, что вы

  1. ожидаете хэш в функции str .
  2. вызывают одну и ту же функцию для печати массивов в виде хэшей, несмотря на то, что, похоже, между ними нет общей функции.
  3. позволяют различными способами вызывать str , но это никогда не влияет на конечный результат.
  4. позволяют передавать настраиваемое пространство в корневую функцию, но в рекурсивной функции жестко запрограммирована вкладка.
  5. опускать неопределенные значения, которые фактически занимают место в массивах

Это проблемы, которые я могу увидеть довольно быстро.

1
ответ дан 18 December 2019 в 06:03
поделиться

Вы могли бы разделить блоки кода, которые имеют дело с массивами, и хешами.

sub recurse{
  ...
  recurse_A(@_) if $ref eq 'ARRAY';
  recurse_H(@_) if $ref eq 'HASH';
  ...
}

sub recurse_A{ ... }
sub recurse_H{ ... }

Я бы порекомендовал начать свои подпрограммы вот так, если только у вас нет серьезной причины поступить иначе.

sub example{
  my( $one, $two, $three, $optional_four ) = @_;

(Если вы сделаете это так, то Komodo , по крайней мере, сможет определить аргументы вашей подпрограммы)

Редко есть причина помещать переменную в строку, содержащую только переменную.

"$var" eq $var;

Единственный раз, когда я могу думать, что когда-либо сделаю это, - это когда Я использую объект с перегруженной функцией "" , и я хочу получить строку без получения объекта.

package My_Class;
use overload
  '""' => 'Stringify',
;
sub new{
  my( $class, $name ) = @_;
  my $self = bless { name => $name }, $class;
  return $self;
}
sub Stringify{
  my( $self ) = @_;
  return $self->{name};
}

my $object = My_Class->new;
my $string = "$object";
1
ответ дан 18 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: