Если у вас есть тест, который вы знаете, что он будет выбрать одну ветвь в 99% случаев, это что-то изменить (производительность), чтобы написать его с этой отрасли в первую очередь?
В простой, если/другое дело (что тройная оператор), ответ нет. Порядок ветвей не имеет значения, условие будет выполняться каждый раз и выбирать, какая ветвь должна опускаться.
В случае if/elsif/else это имеет значение, так как существует несколько условных выражений для запуска. Ввод наиболее распространенного случая в первую очередь сделает вещи быстрее.
Если if/else выбирает заказ, который имеет наибольший смысл для читателя, и это обычно означает избежание негативов. $line =~ /^\-{2,}$/
легче читать, чем $line !~ /^\-{2,}$/
. $line =~ /^-{2,}$/
еще лучше (нет необходимости скрывать -
в регулярном выражении).
По крайней мере, он не должен иметь значения. Как с чем-то сложным, как Perl, лучше всего сравнить эти вещи. Немного хлопотно придумать что-то, что будет использовать процессор достаточно, чтобы не потеряться в нормальном джиттере бенчмаркинга. Не забудьте запустить это несколько раз с большим количеством итераций, прежде чем делать выводы.
use strict;
use warnings;
use v5.10;
use Benchmark qw(cmpthese);
my $Iterations = shift;
my $Threshhold = 100_000;
# I've picked something that isn't constant to avoid constant folding
sub a_then_b {
my $num = shift;
return $num > $Threshhold ? sqrt($num) + sqrt($num) ** 2
: $num + $num;
}
sub b_then_a {
my $num = shift;
return $num <= $Threshhold ? $num + $num
: sqrt($num) + sqrt($num) ** 2;
}
say "First one side";
cmpthese $Iterations, {
a_then_b => sub { a_then_b($Threshhold - 1) },
b_then_a => sub { b_then_a($Threshhold - 1) }
};
say "Then the other";
cmpthese $Iterations, {
a_then_b => sub { a_then_b($Threshhold + 1) },
b_then_a => sub { b_then_a($Threshhold + 1) }
};
В качестве окончательного примечания, чтобы воспользоваться преимуществом тройной функции, назначение должно идти влево. Тернар возвращает результат своей ветви.
$return .= $line =~ /^-{2,}$/ ? "\N{ZERO WIDTH SPACE}$line\n"
: "$line\n";
Эти круглые скобки не являются необходимыми, они делают вид, что что-то еще происходит. Легче читать без них. – Schwern
Предположительно, вы прочитали весь файл в '$ content', изменив' $/'? Если это так, вы можете просто оставить '$ /' как есть и прочитать файл по строкам. Это также имеет то преимущество, что вам не нужно добавлять новую строку в конец каждой выходной строки. – Borodin
Дефис '-' в шаблоне регулярного выражения не обязательно должен быть экранирован. – Borodin