web-dev-qa-db-fra.com

Fractionner une chaîne en tableau en Perl

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?

8
Rahul Reddy

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 commande awk lorsque PATTERN 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 dans EXPR est supprimé avant le fractionnement, et le PATTERN 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;
15
raina77ow

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.

10
Ring Ø