Вам не нужно запускать команду npm pack
, чтобы создать тарбол.
Просто используйте пакет tar
:
const tar = require('tar');
const fstream = require('fstream');
function pack({ path, target }) {
fstream
.Reader({ path, type: 'Directory' })
.pipe(tar.Pack({ noProprietary: true }))
.pipe(fs.createWriteStream(target));
}
const name = 'your-folder-package';
pack({
path: path.join(__dirname, 'packages', name),
target: path.join(__dirname, 'dist/packages', `${name}.tar`),
});
$x =~ s/^\s+|\s+$//g;
или
s/^\s+//, s/\s+$// for $x;
Мой первый вопрос состоит... в том почему? Я не вижу ни одного из единственных-regexp решений быть больше читаемым, чем regexp, с которого Вы запустили. И они уверенный не в какой-либо степени как быстро.
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(:all);
my $a = 'a' x 1_000;
my @x = (
" $a ",
"$a ",
$a,
" $a"
);
cmpthese(-5,
{
single => sub {
for my $s (@x)
{
my $x = $s;
$x =~ s/^\s+|\s+$//g;
}
},
double => sub {
for my $s (@x)
{
my $x = $s;
$x =~ s/^\s+//;
$x =~ s/\s+$//;
}
},
trick => sub {
for my $s (@x)
{
my $x = $s;
s/^\s+//, s/\s+$// for $x;
}
},
capture => sub {
for my $s (@x)
{
my $x = $s;
$x =~ s/\A\s*(.*?)\s*\z/$1/
}
},
kramercap => sub {
for my $s (@x)
{
my $x = $s;
($x) = $x =~ /^\s*(.*?)\s*$/
}
},
}
);
дает результаты на моей машине:
Rate single capture kramercap trick double single 2541/s -- -12% -13% -96% -96% capture 2902/s 14% -- -0% -95% -96% kramercap 2911/s 15% 0% -- -95% -96% trick 60381/s 2276% 1981% 1974% -- -7% double 65162/s 2464% 2145% 2138% 8% --
Править: runrig является правильным, но мало измениться. Я обновил код для копирования строки перед модификацией, которая, конечно, замедляет вещи. Я также принял во внимание brian d предложение foy в другом ответе для использования более длинной строки (хотя миллион походил на излишество). Однако это также предлагает, чтобы перед выбором стиля приема Вы выяснили то, на что Ваши длины строки похожи - преимущества приема уменьшены с более короткими строками. Во всех длинах я протестировал, тем не менее, двойные победы. И это еще легче на глазах.
Tanktalus показывает сравнительный тест для очень маленьких строк, но проблемы ухудшаются, поскольку строки становятся больше. В его коде я изменил главную часть:
my $a = 'a' x 1_000_000;
my @x = (
" $a ",
"$a ",
$a,
" $a"
);
Я получаю эти результаты:
Rate single capture trick double
single 2.09/s -- -12% -98% -98%
capture 2.37/s 13% -- -98% -98%
trick 96.0/s 4491% 3948% -- -0%
double 96.4/s 4512% 3967% 0% --
Поскольку строка становится больше, с помощью "приема" и "дважды" является почти тем же, и общее решение, что большинство людей идет для, "сингл" (включая меня, потому что я не могу повредить ту привычку даже при том, что я знаю это), действительно начинает сосать.
Каждый раз, когда Вы смотрите на сравнительный тест, думайте о том, что он говорит Вам. Чтобы видеть, понимаете ли Вы это, измените данные и попробуйте еще раз. Делайте массивы долго, скаляры большой, и так далее. Сделайте циклы, власти, или regexes находят материал в запуске, середина и конец. Посмотрите, соответствуют ли новые результаты Вашему прогнозу. Фигура, какова тенденция. Производительность поправляется и лучше, приближается к пределу, пик затем начинают уменьшаться, или что-то еще?
Забавный необходимо поднять это!
Я недавно прочитал статью, анализируя выполнение двенадцати (!) различных реализаций для обрезки.
Хотя статья конкретно использует JavaScript regex реализация, это использует синтаксис Perl, таким образом, я думаю, что это кстати к этому обсуждению.
Утверждение от еретического, почему делают это вообще? Все вышеупомянутые решения "корректны" в этом, они обрезают пробел с обеих сторон строки в одной передаче, но ни один не ужасно читаем (ожидайте, возможно, этого). Если аудитория для Вашего кода не состоит из опытного уровня кодеры Perl, у каждого из вышеупомянутых кандидатов должен быть комментарий, описывающий, что они делают (вероятно, хорошая идея так или иначе). В отличие от этого, эти две строки выполняют то же самое, не используя предвидения, подстановочные знаки, midichlorines или что-либо, что не сразу очевидно для программиста умеренного опыта:
$string =~ s/^\s+//;
$string =~ s/\s+$//;
Существует (возможно) хит производительности, но, пока Вы не обеспокоены несколькими микросекундами при выполнении, добавленная удобочитаемость будет стоить того. По моему скромному мнению.
Я обычно делаю это как это:
($foo) = $foo =~ /^\s*(.*?)\s*$/;
Все между ведущими пробелами и конечными пробелами сгруппировано и возвращено, таким образом, я могу присвоить его той же старой переменной.