my $line = "file1.gz file2.gz file3.gz";
my @abc = split('', $line);
print "@abc\n";
Production attendue:
file1.gz
file2.gz
file3.gz
Je veux que la sortie soit file1.gz
dans $abc[0]
, file2.gz
dans $abc[1]
, et file3.gz
dans $abc[2]
. Comment diviser $line
?
Le fractionnement d'une chaîne par des espaces est très simple:
print $_, "\n" for split ' ', 'file1.gz file1.gz file3.gz';
Il s'agit en fait d'une forme spéciale de split
(car cette fonction prend généralement des modèles au lieu de chaînes):
Comme autre cas spécial,
split
émule le comportement par défaut de l'outil de ligne de commandeawk
lorsquePATTERN
est soit omis, soit une chaîne littérale composée d'un seul caractère espace (tel que' '
ou"\x20"
). Dans ce cas, tout espace blanc de début dansEXPR
est supprimé avant le fractionnement, et lePATTERN
est plutôt traité comme s'il était/\s+/
; en particulier, cela signifie que tout espace blanc contigu (et pas seulement un seul caractère d'espace) est utilisé comme séparateur.
Voici une réponse à la question d'origine (avec une simple chaîne sans espace):
Vous souhaitez peut-être vous séparer sur .gz
extension:
my $line = "file1.gzfile1.gzfile3.gz";
my @abc = split /(?<=\.gz)/, $line;
print $_, "\n" for @abc;
Ici, j'ai utilisé (?<=...)
construct, qui est assertion par derrière , faisant essentiellement une scission à chaque point de la ligne précédée de .gz
sous-chaîne.
Si vous travaillez avec l'ensemble d'extensions fixe, vous pouvez étendre le modèle pour les inclure toutes:
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;
Ayant $line
tel qu'il est maintenant, vous pouvez simplement diviser la chaîne en fonction d'au moins un séparateur d'espaces
my @answer = split(' ', $line); # creates an @answer array
ensuite
print("@answer\n"); # print array on one line
ou
print("$_\n") for (@answer); # print each element on one line
Je préfère utiliser ()
pour split
, print
et for
.