5 ответов:
Разбить строку на пробелы очень просто:
print $_, "\n" for split ' ', 'file1.gz file1.gz file3.gz';Это специальная форма
splitНа самом деле (поскольку эта функция обычно принимает шаблоны вместо строк):Как еще один частный случай,
splitэмулирует поведение по умолчанию инструмент командной строкиawk, КогдаPATTERNлибо опущен, либо является литералом строка, состоящая из одного пробела (например,' 'или"\x20"). В этом случае любой начальный пробел вEXPRравен удаляется до того, как произойдет расщепление, иPATTERNвместо этого рассматривается как если бы это было/\s+/; в частности, это означает, что любое смежное в качестве разделителя используется пробел (а не один символ пробела).
Вот ответ на исходный вопрос (с простой строкой без пробелов):
Возможно, вы хотите разделить на
.gzрасширение:my $line = "file1.gzfile1.gzfile3.gz"; my @abc = split /(?<=\.gz)/, $line; print $_, "\n" for @abc;Здесь я использовал
(?<=...)конструкцию, которая является скрытым утверждением , в основном делая расщепление в каждой точке линии перед подстрокой.gz.Если вы работаете с фиксированным набором расширений, вы можете расширить шаблон, чтобы включить их все:
my $line = "file1.gzfile2.txtfile2.gzfile3.xls"; my @exts = ('txt', 'xls', 'gz'); my $patt = join '|', map { '(?<=\.' . $_ . ')' } @exts; my @abc = split /$patt/, $line; print $_, "\n" for @abc;
Имея
$lineкак сейчас, вы можете просто разделить строку на основе по крайней мере одного разделителя пробеловmy @answer = split(' ', $line); # creates an @answer arrayЗатем
print("@answer\n"); # print array on one lineИли
print("$_\n") for (@answer); # print each element on one lineЯ предпочитаю использовать
()дляsplit,for.
Просто используйте /\s+ / against " в качестве разделителя. В этом случае все "лишние" заготовки были удалены. Обычно требуется именно такое поведение. Итак, в вашем случае это будет:
my $line = "file1.gz file1.gz file3.gz"; my @abc = split(/\s+/, $line); for my $i in (@abc) { print "$i\n"; }
Я нашел, что это очень просто!
my $line = "file1.gz file2.gz file3.gz"; my @abc = ($line =~ /(\w+[.]\w+)/g); print $abc[0],"\n"; print $abc[1],"\n"; print $abc[2],"\n";Вывод:
file1.gz file2.gz file3.gzЗдесь взгляните на этот учебник, чтобы найти больше о регулярном выражении Perl и прокрутите вниз до раздела More matching.
У вас уже есть несколько ответов на ваш вопрос, но я хотел бы добавить еще один незначительный, который может помочь добавить что-то.
Для просмотра структур данных в Perl можно использовать
Data::Dumper. Для печати строки можно использоватьsay, который добавляет символ новой строки"\n"после каждого вызова вместо того, чтобы добавлять его явно.Я обычно использую
\s, который соответствует символу пробела. Если вы добавляете+, он соответствует одному или нескольким символам пробела. Вы можете читать подробнее об этом здесьperlre.#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use feature 'say'; my $line = "file1.gz file2.gz file3.gz"; my @abc = split /\s+/, $line; print Dumper \@abc; say for @abc;
Comments