Update Добавлен еще один способ, это один в соответствии с посланной подходом.
Приращение каждого номера в строке, изменение строки на месте. Повтори это. Ниже приведены два способа сделать это. Еще один метод читает отдельные числа и печатает после целых последовательностей.
(1) С регулярными выражениями. Он также подходит в одном слое
echo "1 2 3 4 5" | perl -e '$v = <>; for (1..5) { print $v; $v =~ s/(\d+)/$1+1/eg; }'
Это печатает желаемый результат. Но лучше положить его в сценарий
use warnings;
use strict;
my $file = 'numbers.txt';
open my $fh, '<', $file or die "can't open $file: $!";
while (my $line = <$fh>) {
# Add chomp($line) if needed for some other processing.
for (1..5) {
print $line;
$line =~ s/(\d+)/$1+1/eg;
}
}
/e
Модификатор имеет решающее значение для этого. Он заставляет заменяющую сторону регулярного выражения оцениваться как код, а не как строку с двумя кавычками. Таким образом, вы можете фактически выполнить код там, и здесь мы добавим к захваченному номеру, $1+1
, для каждого совпадающего числа, поскольку /g
перемещается по строке. Это изменяет строку, поэтому следующая итерация for (1..5)
увеличивает и т. Д. Я сопоставляю несколько цифр, \d+
, что не обязательно в вашем примере, но имеет более общий смысл.
(2) Via split
+ map
+ join
, неоднократно меняя линию в месте
while (my $line = <$fh>) {
for (1..5) {
print $line;
$line = join ' ', map { $_+1 } split '\s+', $line;
}
}
split
получает список номеров из $line
и подает его на map
, которая увеличивает каждый, подавая свой вывод список - join
. Объединенная строка присваивается обратно $line
, и это повторяется. Я разделил на \s+
, чтобы разрешить несколько пробелов, но это делает его очень «расслабленным» в том, какой формат ввода он принимает, см. perlrecharclass
. Если вы знаете, что это одно место, пожалуйста, измените это на ' '
.
(3) Возьмите число за раз и напечатайте целую последовательность, начиная с нее.
open my $fh, '<', $file or die "can't open $file: $!";
local $/ = ' ';
while (my $num = <$fh>) {
print "$_ " for $num..$num+4;
print "\n";
}
Волшебное 4
могут быть закодированы с помощью предварительной обработки всей линии, чтобы найти длину последовательности, скажем,
my $len =() = $line =~ /(\d+)/g;
или путем split
-ную в массив и с его scalar
, а затем с помощью $len-1
.
Дополнительные комментарии.
Я рекомендую три аргумента, открытый open my $fh, '<', $file
При просмотре вызова Распечатайте эту ошибку, die "Your message: $!"
, чтобы увидеть причину неудачи. Если вы решите бросить, if ($bad) { die "Got $bad" }
, то вам может не понадобиться $!
. Но когда внешний вызов не сработает, вы не знаете, поэтому вам нужна подходящая переменная ошибки, чаще всего $!
.
Пожалуйста, смотрите [ 'Что я должен делать, если кто-то ответит на мой вопрос?'] (Http://stackoverflow.com/help/someone-answers) Маркировка ответы (как вы видите он подходит) важно для того, как работает этот сайт, для пользователей, которые ищут позже. – zdim