Comment puis-je ajouter des lignes en haut et en bas d'un fichier en Perl?
Je veux ajouter une ligne en haut et en bas du fichier. Je peux le faire de la manière suivante.
open (DATA, "</usr/old") || die "cant open old\n"; #file to which line has to be added
my @body=<DATA>;
close(DATA);
open (FILE, ">/usr/new") || die "cant open new\n"; #file after stuff has been added
print FILE "9 431";
print FILE "\n";
my $body=@body;
for (my $i=0; $i<$body;$i++){
print FILE "$body[$i]";#not using for loop leads to addition of spaces in new file
}
print FILE "(3,((((1,4),(7,6)),(2,8)),5),9)";
Depuis que j'ai l'exécution d'un grand nombre de fichier ce processus peut prendre beaucoup de temps. N'Perl a aucune fonctionnalité spécifique qui est utilisé pour ajouter des lignes en haut et en bas d'un fichier?
Il n'y a pas une telle chose comme l'ajout de lignes sur le dessus, vous avez besoin d'une sorte de tampon pour enregistrer ce que vous voulez écrire sur le fond, il peut être une chaîne de caractères, mais je préfère le fichier temp. Si vous écrivez/ajout du haut vers le bas. Il n'y a pas d'autre moyen.
pas vrai. Vous pouvez ajouter une ligne au début du fichier avec un simple test:
votre exemple crée un nouveau fichier, écrit le saut de ligne, puis écrit le contenu du fichier d'origine. Le fait que le newfile extrémités d'une liaison avec le même nom que l'original ne change pas le fait que c'est un fichier différent.
Ah, je vois. Bon point. @WilliamPursell
pas vrai. Vous pouvez ajouter une ligne au début du fichier avec un simple test:
perl -pi -e 'print "This will appear before the original first line\n" if $. == 1' inFile.txt
à Partir de stackoverflow.com/a/4388309/48082votre exemple crée un nouveau fichier, écrit le saut de ligne, puis écrit le contenu du fichier d'origine. Le fait que le newfile extrémités d'une liaison avec le même nom que l'original ne change pas le fait que c'est un fichier différent.
Ah, je vois. Bon point. @WilliamPursell
OriginalL'auteur shubster | 2009-08-05
Vous devez vous connecter pour publier un commentaire.
De perlfaq5's réponse à Comment puis-je modifier, supprimer ou insérer une ligne dans un fichier, ou d'ajouter au début du fichier?
Comment puis-je modifier, supprimer ou insérer une ligne dans un fichier, ou d'ajouter au début du fichier?
(contribution de brian d foy)
L'idée de base de l'insertion, la modification ou la suppression d'une ligne d'un fichier texte implique la lecture et l'impression du fichier à l'endroit que vous voulez faire le changement, le changement, puis de la lecture et de l'impression, le reste du fichier. Perl n'est pas de fournir un accès aléatoire aux lignes (surtout depuis l'entrée d'enregistrement séparateur, $/, est sujette au changement), bien que des modules tels que le Tie::File peut faux.
Un programme en Perl pour faire ces tâches prend la forme de base de l'ouverture d'un fichier, d'impression de ses lignes, puis de la fermeture du fichier:
À l'intérieur de cette forme de base, ajouter les pièces que vous avez besoin d'insérer, de modifier ou de supprimer des lignes.
À ajouter des lignes au début, l'impression de ces lignes avant d'entrer dans la boucle qui imprime les lignes existantes.
De changer les lignes, insérer le code à modifier les lignes à l'intérieur de la boucle while. Dans ce cas, le code est tous mis en minuscule versions de "perl" et majuscules. Le phénomène se produit pour chaque ligne, alors assurez-vous que vous êtes censé faire que sur chaque ligne!
Changer seulement une ligne en particulier, la ligne de saisie du numéro, $., est utile. D'abord de lire et d'imprimer les lignes jusqu'à celui que vous voulez modifier. Ensuite, lisez la seule ligne que vous voulez modifier, de le modifier, et de l'imprimer. Après cela, lire le reste de l'lignes et imprimer ces:
À sauter des lignes, utilisez la boucle de contrôle. La prochaine dans cet exemple, ignore les lignes de commentaires, et le dernier s'arrête tous les traitements une fois qu'elle rencontre soit FIN ou DONNÉES.
Faire le même genre de chose pour supprimer une ligne en cliquant sur suivant pour sauter les lignes que vous ne voulez pas afficher dans la sortie. Cet exemple saute à chaque cinquième ligne:
Si, pour une raison étrange, vous voulez vraiment voir l'ensemble du dossier à la fois plutôt que de les traiter ligne par ligne, vous pouvez slurp (aussi longtemps que vous pouvez équiper toute chose dans la mémoire!):
Des Modules tels que des Fichiers::Slurp et Tie::File pouvons aussi vous aider. Si vous le pouvez, toutefois, éviter de lire l'ensemble du dossier à la fois. Perl ne vous donnera pas de mémoire pour le système d'exploitation jusqu'à ce que le processus se termine.
Vous pouvez également utiliser Perl one-liners de modifier un fichier en place. Les modifications suivantes à tous les 'Fred' à 'Barney' dans inFile.txt en écrasant le fichier avec le nouveau contenu. Avec le commutateur-p, Perl enroule une boucle while autour du code que vous spécifiez avec-e, et je tourne sur la modification sur place. La ligne actuelle est dans $. Avec -p, Perl imprime automatiquement la valeur de $ à la fin de la boucle. Voir perlrun pour plus de détails.
De faire une sauvegarde de inFile.txt, donnez -je une extension de fichier à ajouter:
De changer seulement la cinquième ligne, vous pouvez ajouter un test de vérification de $., la ligne de saisie, puis seulement effectuer l'opération lorsque le test passe:
Pour ajouter des lignes avant une certaine ligne, vous pouvez ajouter une ligne (ou des lignes!) avant de Perl imprime $_:
Vous pouvez même ajouter une ligne au début d'un fichier, depuis la ligne courante imprime à la fin de la boucle:
Pour insérer une ligne après on déjà dans le fichier, utilisez le commutateur-n. C'est comme -p sauf qu'il n'a pas print $_ à la fin de la boucle, de sorte que vous avez à faire vous-même. Dans ce cas, print $_ abord, puis imprimer la ligne que vous souhaitez ajouter.
À supprimer les lignes, d'imprimer uniquement ceux que vous souhaitez.
OriginalL'auteur brian d foy
Perl ne peut pas insérer au début d'un fichier en raison de quelques systèmes d'exploitation le permettent. Vous avez besoin d'une réécriture d'opération de type que vous avez ici.
Un possible problème que vous pourriez avoir avec ce code est vraiment de gros fichiers qui ne rentre pas dans votre espace d'adressage.
Par la lecture de l'intégralité du fichier, puis l'écrire, vous risquez de rencontrer des problèmes de mémoire. Ce que j'aurais fait:
Ce sera rapide et efficace de la mémoire.
Bien sûr, si vos fichiers sont suffisamment petits pour tenir dans la mémoire, coller avec ce que vous avez. C'est assez bon.
Mise à jour:
Assez de gens semblent être en vertu de la méconnaissance que je défends un script shell que je pensais ensemble des droites. Vous pouvez faire toutes les choses ci-dessus à partir de l'intérieur indigène de Perl.
Mais vous pouvez envisager si cela est nécessaire à l'utilisation de Perl. Une commande comme:
fera l'affaire tout aussi bien (et probablement tout aussi rapide).
Bien sûr, si vous besoin Perl, puis il suffit de les ignorer cette mise à jour comme les divagations d'un vieil homme 🙂
vous devriez regarder le code source sous Tie::File voir ce qu'il fait 🙂 Alors laissez-moi savoir comment c'est mieux à partir d'un rendement de POV.
parfois, c'est ok pour le commerce de performance pour le programmeur de commodité. En fait, jetez un oeil à l'ensemble de l'histoire de l'informatique.
OriginalL'auteur paxdiablo
Utilisation Tie::File qui vous donne accès à des lignes d'un fichier du disque par l'intermédiaire d'un Perl tableau. Il est livré avec la distribution standard.
Exemple à partir de la documentation:
OriginalL'auteur zakovyrya
Trois réponses ont été donné que perpétuer la très mauvaise pratique de:
Non seulement cela, le code est cassé puisque vous n'êtes pas ouvrir le fichier pour l'écriture, mais pour la lecture.
Lors de l'ouverture échoue, vous pouvez indiquer à l'utilisateur pourquoi il a échoué. Merci de prendre l'habitude de s'y compris $! dans le message d'erreur. Aussi, utilisez les trois argument forme de
open
pour séparer la mode du nom:(Ce n'est pas la réponse à votre question, mais je suis en train de faire une réponse plutôt qu'un commentaire est ajouté accent, et pour que je puisse l'examiner comme il est assez long qui jaillissent.)
OriginalL'auteur
Il y a de nombreuses façons que vous pouvez le faire, par exemple avec un simple script shell la façon @Pax mentionné. Vous pouvez également remplacer votre tableau et une boucle avec un join():
OriginalL'auteur sunny256
Ma modification ghostdog74 est que le descripteur de fichier doit dans les instructions d'impression, et le fichier doit être fermé après la deuxième instruction print.
OriginalL'auteur user121455
vous pouvez le faire
sur la ligne de commande
OriginalL'auteur ghostdog74
Je n'ai pas vraiment parler de Perl, mais peut-être que cela fonctionne pour certaines situations:
Qui est, ouvrez le fichier dans le paragraphe mode (une ligne), et de remplacer le début de la ligne avec votre nouveau texte, en faire un lieu de réécriture.
Probablement pas efficace pour de nombreux fichiers volumineux.
OriginalL'auteur Steve Bennett
Comme Pax dit, il n'est pas intégré dans la façon de le faire. Mais si vous voulez le faire avec une seule ligne de commande perl à partir de votre shell, vous pouvez utiliser:
OriginalL'auteur Nikhil