Ajouter des informations de copyright sur les droits d'auteur par lots en Perl

Pour tous les fichiers d'entrée, ajoutez des informations de droit d'auteur s'il n'y a pas d'informations de droit d'auteur, sinon ne faites rien et sauvegardez le fichier original avec la fin de .bak.

Pour commencer, j'utilise le programme suivant (assurez-vous de sauvegarder le fichier d'entrée avant d'essayer) :

1

2

3

4

5

6

7

8

9

dix

11

12

13

14

15

16

17

18

19

20

21

22

#!usr/bin/perl -w

$^I = ".bak";

my %do_these;

foreach (@ARGV){

  print $_;

 $do_these{ $_} = 1;

}

while(<>){

 if(/^## Copyright/){

  delete $do_these{ $ARGV};

 }

}

@ARGV = sort keys %do_these;

while(<>){

 if(/^#!/){

  $_ .= "## Copyright (C) 2011 by yujianjun";

 }

 print;

}

Résultat : les fichiers d'origine et de sauvegarde sont tous vierges, ce qui est nul. (N'oubliez pas de faire une sauvegarde lorsque vous testerez le programme à l'avenir).
Analysez les raisons :

Principalement dû à une mauvaise utilisation de $^I. Voyons comment fonctionne $^I :

$^I est par défaut undef, ce qui n'affecte pas le programme. Si une certaine chaîne lui est attribuée (telle que ".bak" dans le programme), le programme effectuera l'opération de sauvegarde et ajoutera la chaîne à la fin du nom de fichier d'origine pour devenir l'extension du nom du fichier de sauvegarde. Lorsque vous utilisez l'opérateur Diamond pour ouvrir un fichier, l'opération de Perl consiste d'abord à changer le nom du fichier ouvert en un nom de fichier avec une extension, puis à créer un nouveau fichier avec le nom de fichier d'origine, puis à lire la ligne de contenu du fichier. par ligne dans le programme et après avoir apporté quelques modifications, il sera enregistré dans un nouveau fichier. Cela équivaut à modifier le contenu du fichier et à sauvegarder l'ancien fichier. Bien entendu, si la valeur est undef, les anciens fichiers ne seront pas sauvegardés.

Parce que $^I = ".bak"; est placé au premier plan dans le programme ci-dessus, mais il y a deux opérations de lecture de fichier derrière. En supposant que le fichier lu est file.pl, le premier while(<>) change le fichier d'origine en file.pl.bak. Créez ensuite un nouveau fichier vide et nommez-le file.pl ; mais le nouveau fichier ne sera écrit sur le disque qu'à la fin du programme, donc lorsque la deuxième opération de lecture du fichier while(<>) sera effectuée, le fichier vide.pl sera enregistré. pl devient file.pl.bak, de sorte que le premier fichier de sauvegarde soit écrasé, puis un nouveau fichier vierge file.pl est créé. À ce stade, le fichier d'origine et le fichier de sauvegarde sont vides.

Une fois que vous avez compris comment fonctionne $^I, le programme est facile à modifier :

Mettez simplement $^I = ".bak"; avant la dernière opération de lecture de fichier while(<>), comme suit :

1

2

3

4

5

6

7

8

9

dix

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#!usr/bin/perl -w

my %do_these;

@ARGV = ("sinx.pl","nvidia.pl","changeName.pl");

foreach (@ARGV){

  print $_;

 $do_these{ $_} = 1;

}

while(<>){

 if(/^## Copyright/){

  delete $do_these{ $ARGV};

 }

}

@ARGV = sort keys %do_these;

$^I = ".bak";

while(<>){

 if(/^#!/){

  $_ .= "## Copyright (C) 2011 by yujianjun";

 }

 print;

}

Guess you like

Origin blog.csdn.net/jh035/article/details/128141615