Dzielenie ciąg spacjami jest bardzo prosta:
print $_, "\n" for split ' ', 'file1.gz file1.gz file3.gz';
Jest to szczególna forma split
faktycznie (jak funkcja ta trwa zwykle wzory zamiast strun):
W innym szczególnym przypadku , split
emuluje domyślne zachowanie narzędzia z wiersza poleceń awk
, gdy PATTERN
jest albo pominięte, albo literał ciąg złożony z pojedynczej spacji (takie jak ' '
lub "\x20"
). W tym przypadku, wszelkie poprzedzające białe spacje w EXPR
są usuwane przed usunięciem, a PATTERN
jest traktowane jako , jeśli było to /\s+/
; w szczególności oznacza to, że każda ciągła spacja (nie tylko pojedynczy znak spacji) jest używana jako separator.
Oto odpowiedź do pierwotnego pytania (z prostym ciągiem bez spacji):
Może chcesz podzielić na .gz
rozszerzenia:
my $line = "file1.gzfile1.gzfile3.gz";
my @abc = split /(?<=\.gz)/, $line;
print $_, "\n" for @abc;
Tutaj użyłem (?<=...)
skonstruować, czyli look-behind assertion, zasadniczo dokonując podziału w każdym punkcie linii poprzedzonym podciąganiem .gz
.
Jeśli pracujesz z ustalonym zestawem rozszerzeń, można wydłużyć wzór ich wszystkich to:
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;
Cóż, nie język programowania może czytać w twoich myślach '' „” podział dzieli się na poszczególnych znaków Jeśli wszystkie nazwy plików rozpoczynające się od 'f.. ile ... ', wtedy' split/(? = file)/'działałoby, ale nie ma ogólnego rozwiązania – amon
@aragaer Twój komentarz jest błędny. ['split'] (http://perldoc.perl.org/functions/split.html) przyjmuje argumenty jako wzór, łańcuch, limit. Twoje zamówienie jest nieprawidłowe. A "print" @abc \ n "' działałoby poprawnie, pod warunkiem, że '$" eq "\ n" '(' $ "' jest zwykle spacją). – amon