12
votes

Utiliser Perl pour diviser une ligne pouvant contenir des espaces

D'accord, j'utilise donc Perl pour lire dans un fichier contenant des données de configuration générales. Ces données sont organisées en en-têtes en fonction de ce qu'ils veulent dire. Un exemple suit: xxx

objectif: en utilisant la première ligne comme exemple "$ var = 10;", j'aimerais utiliser la fonction divisée dans Perl pour créer un tableau contenant le tableau Caractères "$ var" et "10" comme éléments. En utilisant une autre ligne comme exemple: xxx

Ceci est nécessaire car je vais émettre ces valeurs dans un nouveau fichier (lequel une pièce de code C ++ différente va lire) pour instancier le dictionnaire objets. Juste pour vous donner un peu de goût de ce que cela pourrait ressembler (ce qui en fait juste comme je vais): xxx

oh, et voici le code que j'ai actuellement sur avec ce qu'il fait (incorrectement): xxx

Pour répondre à une question, pourquoi je n'utilise pas config :: Simple, est que je ne savais pas ce que mon fichier de configuration ressemblerait à ce que je voulais faire. Compte tenu de même que je suis allé - au moins ce qui me semblait judicieux - et en utilisant Perl pour analyser le fichier.

Le problème est que j'ai un code C ++ qui chargera les informations du fichier de configuration, mais que l'analyse de C ou C ++ est :( J'ai décidé d'utiliser Perl. C'est aussi un bon exercice d'apprentissage pour moi depuis Je suis nouveau dans la langue. C'est donc la chose, ce code Perl n'est pas vraiment en dehors de ma candidature, cela facilite simplement le code C ++ de lire les informations. Et, il est plus lisible (à la fois le fichier de configuration et Le fichier généré). Merci pour les commentaires, cela a vraiment aidé.


2 commentaires

N'utilisez pas de prototypes à moins d'être nécessaires. Même alors, pensez à trois fois. perdoc.perl.org/perlsub.html#prototypes C'est tout ce qui est très puissant, bien sûr, et ne devrait être utilisé que de modération pour rendre le monde meilleur.


S'il vous plaît voir la réponse de FM. Vous ne devriez vraiment pas écrire votre propre analyseur de fichiers pour effectuer un travail aussi courant et standard - Utilisez un CPAN et concentrez-vous sur votre logique d'application.


5 Réponses :


2
votes

On dirait que tu l'as eu. Stripez les espaces bleus avant la division.

sub makeref($)
{
    s/\s+//g;
    my @line = (split(/=/)); # gets ["verbose", "true"]
}


6 commentaires

Ahh c'est tellement évident maintenant. Merci, je suis nouveau à Perl et c'est une langue vraiment cool.


Curieusement, Chomomp ne chante pas de blouses!


Vous avez raison, j'y ai pensé et la solution de regex est meilleure, passez avec ça.


Veuillez noter la sélection de la syntaxe en désordre.


@Tommy Lire perdoc -f chomp pour savoir ce que chomp fait chomp .


J'espère que vos paramètres et vos valeurs n'ont pas d'espaces: couleur de fond = rouge foncé



1
votes

Ce code fait l'astuce (et est plus efficace sans renverser). XXX


3 commentaires

Vous pouvez ajouter un 'g' à la fin de la regex pour l'obtenir pour remplacer plus d'une apparence supplémentaire d'espaces. I.e. s / ^ \ s + // g;


Veuillez noter la sélection de la syntaxe en désordre.


Il existe de nombreux modules qui gèrent des sections de configuration, des lignes de continuation, des variables avec plusieurs valeurs, etc., etc. sur CPAN. Utilisez l'un d'entre eux une fois que vous avez terminé d'apprendre. J'aime config :: std . @Fm a signalé config :: simple .



3
votes

Split code> se divise sur une expression régulière, vous pouvez simplement mettre le blancheur autour du = code> Connexion dans sa regex:

$line =~ s/^\s+//;
$line =~ s/\s+$//;


4 commentaires

Veuillez noter la sélection de la syntaxe en désordre.


C'est pourquoi j'ai tendance à utiliser s {...} {...} lors de la publication sur SO.


S / ^ \ S + // est légèrement plus efficace.


Oui, s'il y a zéro caractères blancheurs, s / ^ \ s * // ne remplace rien avec rien - pourquoi déranger?



6
votes

Si vous faites cette analyse comme un exercice d'apprentissage, c'est bien. Cependant, CPAN a plusieurs modules qui feront beaucoup de travail pour vous.

use Config::Simple;
Config::Simple->import_from( 'some_config_file.txt', \my %conf );


2 commentaires

Ouais, je dois vraiment demander pourquoi l'OP utilise ce qui est très similaire à un format de fichier de configuration standard, mais n'utilise pas les modules de lecteur de fichier de configuration standard facilement disponibles et très bien testés. (YAML est un autre bien à regarder si config :: simple ne correspond pas tout à fait le format souhaité.)


95% Time C'est ce qui serait recherché. J'ai des raisons (l'apprentissage, pas tout mon code est à Perl) qui facilite la tâche de le faire différemment.



0
votes

Vous avez probablement tout compris, mais je pensais ajouter un peu. Si vous

 this is a parameter         =      all sorts of stuff here


0 commentaires