Chaque ligne de sortie consiste en une liste de mots

Ces lignes doivent être triés à l'aide une liste alphabétique de commande qui utilise la sous-chaîne à partir du mot clé. Le mot clé commence après la colonne 50, donc nous avons besoin d'une routine genre particulier d'assistance qui choisit ces sous-chaînes. La routine de tri est similaire à la numeric_sort illustré précédemment. Elle s'appuie sur la Convention que, avant la routine est appelée, les variables globales $ a et $ b aura été attribué les deux éléments de données (dans ce cas, les lignes de rapport) qui doivent être comparés.

sous by_keystr (my $ str1 = substr ($ a, 50); ma $ str2 = substr ($ b, 50); if ($ str1 lt $ str2) (return -1;) elsif ($ str1 eq $ str2) ( return 0;) else (return 1;))
  

Ce sous-programme requiert des variables locales pour stocker les deux sous-chaînes. Perl autorise la déclaration de variables dont la portée est limitée à l'organe d'une fonction (ou, portée à un bloc interne dans lequel elles sont déclarées). Ces variables sont déclarées avec le mot-clé my, ici la fonction d'aide de tri a deux variables locales $ str1 et str2 $. Ceux-ci contiennent des sous-chaînes de caractères commençant à la position 50 à partir de deux lignes de produits. Le lt eq et les comparaisons effectuées sur ces chaînes pourraient être simplifiées en utilisant l'opérateur cmp Perl (c'est une version de chaîne de l'opérateur mentionné dans le contexte de la fonction de tri numérique helper). Le corps de la boucle principale alors que les travaux en scindant la ligne d'entrée en une liste de mots, puis du traitement de cette liste.

while ($ title = ) (Chomp ($ titre); @ Title = split / /, $ titre, ... foreach $ i (0 .. $ # Titre) ($ Word = Titre $ [$ i]; ... ))

Chaque mot doit être testé pour déterminer s'il s'agit d'un mot clé. Cela peut être fait en utilisant un simple match expression régulière. Le motif de cette expression régulière précise qu'il doit y avoir une lettre majuscule au début de la chaîne dans $ Word: if ($ word = ~ / ^ [AZ] /) (... ) L'opérateur = ~ est l'expression régulières de Perl opérateur de correspondance, ce qui est utilisé pour invoquer la comparaison de la valeur de $ Word et le / ^ [AZ] / modèle. Si le mot courant est classé comme un mot clé, puis les mots avant qu'il ne sont combinées pour former la chaîne de départ, et les mots clés et mots restants sont combinées pour former une chaîne fin. Ces chaînes peuvent ensuite être combinées pour produire une ligne pour la sortie finale. Ce résultat est obtenu en utilisant la fonction sprintf (le même que celui de la bibliothèque stdio C). La fonction sprintf crée une chaîne dans la mémoire, le retour de cette chaîne en tant que son résultat. Comme printf, sprintf prend une chaîne de format et d'une liste d'arguments. Les lignes de sortie indiquées peuvent être produites avec la déclaration:

$ line = sprintf "% 50s-50s% fin \ n", $ start, $;

Le programme complet est:

#! / usr / bin / perl sous by_keystr (my $ str1 = substr ($ a, 50); ma $ str2 = substr ($ b, 50); if ($ str1 lt $ str2) (return -1;) elsif ($ str1 eq $ str2) (return 0;) else (return 1;)
) @ Collection = (); while ($ title = ) (Chomp ($ titre); @ Title = split / /, $ titre, $ start = ""; foreach $ i (0 .. $ # Titre) ($ Word = Titre $ [$ i]; if ($ Word = ~ / ^ [AZ] /) ($ end = ""; for ($ i = $ j; $ j 

En Perl, il ya toujours une autre façon! Une autre façon d'établir la liste $ end pourrait utiliser Perl's join fonction:

$ end = join 'title' [$ i .. $ # Titre];

Perl fonction join (documentées dans perlfunc) a deux arguments - une expression et une liste. Il construit une chaîne en joignant les chaînes distinctes de la liste, et la valeur de l'expression est utilisée comme un élément séparateur. Perl est livré avec les bibliothèques de plusieurs milliers de sous-programmes, souvent la majorité de votre travail peut être fait en utilisant les routines existantes. Toutefois, vous devrez définir votre propre sous-programme - si tout simplement pour ranger votre code et éviter de trop grands programmes d'intérêt général. Routines Perl sont définies comme suit:

sub nom du bloc

Une routine a une valeur de retour, ce qui est soit la valeur de la dernière instruction exécutée ou une valeur spécifiée dans une instruction return explicite. Arguments passés à une routine sont combinés en une liste unique - @ _. Arguments individuels mai être isolé par l'indexation dans cette liste, ou en utilisant un littéral de liste comme une lvalue. Comme illustré à la fonction de tri helper dans la dernière partie, sous-routines peuvent définir leur propre portée locale détails variables.Many plusieurs des sous-programmes sont donnés dans la partie perlsub de la documentation. Parenthèses sont totalement optionnels dans les appels sous-programme:

Traiterjonnees ($ arg1, $ arg2, arg3 $), est le même que traiterjonnees $ arg1, $ arg2, arg3 $;

Une définition d'une telle routine est la suivante:

sous octal (my $ str = $ _ [0]; my $ code = 0; for (my $ i = 1; $ i 

Cette routine peut être invoquée:

rwxr $ str = "-x ---"; $ AccessCode octal = $ str;

Pour un deuxième exemple, considérons un sous-programme afin de déterminer si une chaîne est particulièrement présent dans une liste:

(membre élément, liste);

Comme indiqué plus haut, les arguments pour une routine sont combinés en une liste unique, ils doivent être répartis à part dans la routine. Le traitement comporte une boucle foreach qui vérifie si le prochain membre de la liste est égal à la chaîne souhaitée:

membre sub (my ($ entry, @ list) = @ _; # séparer les arguments $ memb foreach (@ list) (if (eq $ memb $ entry) (return 1;))
return 0;)

En fait, il ya une autre façon. Il n'est pas nécessaire d'inventer une sous-routine membres parce que Perl possède déjà une version généralisée dans sa routine grep. Datalist match_criterion grep Lorsqu'ils sont utilisés dans un contexte de liste, grep produit une sous-liste de références à ces membres de datalist qui satisfont à l'essai. Lorsqu'il est utilisé dans un contexte scalaire, retourne grep le nombre de membres du DataList qui satisfont aux exigences.

un article présenté par Jorge Martinez


Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite.
Important: Cet article «Chaque ligne de sortie consiste en une liste de mots» a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.


Online: 298 users browsing the articles directory