Почти все предыдущие короткие методы генерируют недопустимые шестнадцатеричные коды (пять цифр). Я сталкивался с подобной техникой только без этой проблемы здесь :
"#"+("000"+(Math.random()*(1<<24)|0).toString(16)).substr(-6)
Попробуйте это в консоли:
for(i = 0; i < 200; i++) {
console.log("#" + ("000" + (Math.random()*(1<<24)|0).toString(16)).substr(-6));
}
use strict
; также используйте предупреждения
. Кроме того, я думаю, что у вашего инструктора был плохой день в тот день.
Если вы новичок в Perl, я ' Я рекомендую запускать ваш код через perl-critical (есть также сценарий, который вы можете установить из CPAN, обычно я использую его как тест, поэтому он запускается из командной строки всякий раз, когда я выполняю команду «make test») . В дополнение к его выводам вы можете захотеть еще немного разбить свои функции. У recurseErrors есть три случая, которые можно разделить на подфункции (или даже поместить в хэш типа ref для подфункции ref).
Если бы это было производственное задание, я бы использовал Data :: Dumper ,
возможно, Data :: Dumper - это то, что вам нужно:
use Data::Dumper;
$str = Dumper($foo);
print($str);
Вот один простой пример, почему ваш код не легко читается:
$delimiter = "\n--------------------------------------------" unless (defined $delimiter);
Вы можете использовать оператор defined или
:
$delimiter //= "\n" . '-' x 44;
Если вас беспокоят более ранние Perls:
defined $delimeter or $delimeter = "\n" . '-' x 44;
Условные выражения, выходящие за правое поле, достаточно выключения, чтобы я не читал остальную часть кода.
Я предполагаю, что ему не нравится, что вы
str
. str
, но это никогда не влияет на конечный результат. Это проблемы, которые я могу увидеть довольно быстро.
Вы могли бы разделить блоки кода, которые имеют дело с массивами, и хешами.
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";