Adicione informações de direitos autorais em lotes em Perl

Para todos os arquivos de entrada, adicione informações de direitos autorais se não houver informações de direitos autorais; caso contrário, não faça nada e faça backup do arquivo original com o final de .bak.

Para começar, uso o seguinte programa (certifique-se de fazer backup do arquivo de entrada antes de tentar):

1

2

3

4

5

6

7

8

9

10

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;

}

Resultado: os arquivos originais e de backup estão todos em branco, o que é uma droga. (Lembre-se de fazer um backup ao testar o programa no futuro).
Analise os motivos:

Principalmente devido ao uso incorreto de $^I. Vamos dar uma olhada em como $^I funciona:

$^I tem como padrão undef, o que não afeta o programa. Se for atribuída uma string (como ".bak" no programa), o programa executará a operação de backup e adicionará a string ao final do nome do arquivo original para se tornar a extensão do nome do arquivo de backup. Ao usar o operador diamante para abrir um arquivo, a operação do perl é primeiro alterar o nome do arquivo aberto para um nome de arquivo com uma extensão, depois criar um novo arquivo com o nome do arquivo original e, em seguida, ler a linha de conteúdo do arquivo por linha no programa e após fazer algumas alterações, ele será salvo em um novo arquivo. Isso equivale a modificar o conteúdo do arquivo e fazer backup do arquivo antigo. Obviamente, se o valor for undef, não será feito backup dos arquivos antigos.

Porque $^I = ".bak"; é colocado na frente no programa acima, mas há duas operações de leitura de arquivo atrás dele. Supondo que o arquivo lido seja file.pl, o primeiro while(<>) altera o arquivo original para file.pl.bak. Em seguida, crie um novo arquivo vazio e nomeie-o como arquivo.pl; mas o novo arquivo só será gravado no disco quando o programa terminar, portanto, quando a segunda operação de leitura do arquivo while (<>) for realizada, o arquivo em branco.pl torna-se file.pl.bak, que cobre o primeiro arquivo de backup e, em seguida, cria um novo arquivo em branco file.pl. Neste momento, tanto o arquivo original quanto o arquivo de backup estão em branco.

Depois de entender como $^I funciona, o programa é fácil de modificar:

Basta colocar $^I = ".bak"; antes da última operação de leitura do arquivo while(<>), como segue:

1

2

3

4

5

6

7

8

9

10

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;

}

Acho que você gosta

Origin blog.csdn.net/jh035/article/details/128141615
Recomendado
Clasificación