Aparentemente, use strict
deve (deve) ser usado quando você deseja forçar o perl a codificar apropriadamente, o que poderia estar forçando uma declaração, sendo explícito em strings e subs, ou seja, barewords ou usando refs com cautela. Nota: se houver erros, usar estrito abortará a execução, se usado.
Embora use warnings;
ajude você a encontrar erros de digitação no programa, como você perdeu um ponto-e-vírgula, você usou 'elseif' e não 'elsif', você está usando sintaxe ou função obsoleta, qualquer coisa assim. Nota: use warnings apenas fornecerá avisos e continuará a execução, ou seja, não abortará a execução.
De qualquer forma, seria melhor entrarmos em detalhes, que estou especificando abaixo
De perl.com (meu favorito):
use estrito 'vars';
o que significa que você deve sempre declarar variáveis antes de usá-las.
Se você não declarar irá provavelmente obter uma mensagem de erro para a variável não declarada
O símbolo global "$ variablename" requer um nome de pacote explícito em scriptname.pl linha 3
Este aviso significa que o Perl não é exatamente claro sobre qual é o escopo da variável. Portanto, você precisa ser explícito sobre suas variáveis, o que significa declará-las com de my
modo que elas fiquem restritas ao bloco atual, ou referindo-se a elas com seu nome totalmente qualificado (por exemplo: $ MAIN :: nomedavariável).
Portanto, um erro de tempo de compilação é disparado se você tentar acessar uma variável que não atenda a pelo menos um dos seguintes critérios:
Predefinido pelo próprio Perl, como @ARGV,% ENV, e todas as variáveis de pontuação globais como $. ou $ _.
Declarado com nosso (para um global) ou meu (para um léxico).
Importado de outro pacote. (O uso vars pragma simula uma importação, mas use nosso em vez disso.)
Totalmente qualificado usando seu nome de pacote e o separador de pacote de dois pontos duplos.
usar 'subs' estritos;
Considere dois programas
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
Em ambos os casos, temos um sub test_value () e queremos colocar seu resultado em $ a. E ainda, quando executamos os dois programas, obtemos dois resultados diferentes:
No primeiro programa, no ponto em que chegamos $a = test_value;
, Perl não sabe de nenhum sub test_value (), e test_value é interpretado como string 'test_value'. No segundo programa, a definição de test_value () vem antes da $a = test_value;
linha. Perl pensa test_value como sub chamada.
O termo técnico para palavras isoladas como test_value que podem ser subs e podem ser strings dependendo do contexto, a propósito, é bareword . O tratamento de barewords do Perl pode ser confuso e pode causar bug no programa.
O bug é o que encontramos em nosso primeiro programa. Lembre-se de que o Perl não espera encontrar test_value()
, portanto, como ainda não viu test_value (), ele assume que você deseja uma string. Então, se você use strict subs;
, isso fará com que este programa morra com um erro:
Bareword "test_value" não permitido enquanto "estrito subs" em uso em ./a6-strictsubs.pl linha 3.
A solução para esse erro seria
1. Use parênteses para deixar claro que você está chamando um sub. Se Perl vir $ a = test_value () ;,
2. Declare seu sub antes de usá-lo pela primeira vez
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
3. E se você pretende usá-lo como uma string, cite-o.
Portanto, esta restrição faz com que Perl trate todas as barewords como erros de sintaxe. * Uma bareword é qualquer nome ou identificador simples que não tem outra interpretação forçada pelo contexto. (O contexto é frequentemente forçado por uma palavra-chave ou token próximo, ou pela pré-declaração da palavra em questão.) * Então, se você pretende usá-lo como uma string, coloque-o entre aspas e se você pretende usá-lo como uma chamada de função, pré-declare-o ou use parênteses.
Barewords são perigosos por causa desse comportamento imprevisível. use strict; (or use strict 'subs';)
os torna previsíveis, porque barewords que podem causar comportamento estranho no futuro farão seu programa morrer antes que possam causar estragos
Há um lugar onde não há problema em usar barewords mesmo quando você ativou subs estritas: quando você está atribuindo chaves hash.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Barewords em chaves hash são sempre interpretados como strings, portanto, não há ambigüidade.
use 'refs' estritos;
Isso gera um erro de tempo de execução se você usar referências simbólicas, intencionalmente ou não. Um valor que não é uma referência rígida é então tratado como uma referência simbólica . Ou seja, a referência é interpretada como uma string que representa o nome de uma variável global.
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
use avisos;
Este pragma com escopo léxico permite controle flexível sobre os avisos internos do Perl, tanto aqueles emitidos pelo compilador quanto aqueles do sistema de tempo de execução.
De perldiag
:
Portanto, a maioria das mensagens de advertência das classificações abaixo, ou seja, W, D e S, podem ser controladas usando o warnings
pragma.
(W) Um aviso (opcional)
(D) Uma depreciação (ativado por padrão)
(S) Um aviso grave (ativado por padrão)
Listei algumas das mensagens de advertência que ocorrem frequentemente abaixo por classificações. Para obter informações detalhadas sobre eles e outras mensagens, consulte perldiag
(W) Um aviso (opcional):
Argumento ausente em% s
Argumento ausente para -% c
(Você quis dizer &% s em vez disso?)
(Você quis dizer "local" em vez de "nosso"?)
(Você quis dizer $ ou @ em vez de%?)
'% S 'não é um
comprimento de referência de código () usado em% s
mal colocado _ no número
(D) Uma suspensão de uso (habilitada por padrão):
definido (@array) está obsoleto
definido (% hash) está obsoleto O
uso obsoleto de my () na condição falsa
$ # não é mais suportado
(S) Um aviso severo (habilitado por padrão)
elseif deveria ser encontrado elsif
% s onde o operador esperava
(operador ausente antes de% s?)
(ponto e vírgula ausente na linha anterior?)
% s nunca introduzido
Operador ou ponto e vírgula ausente antes de% s
Problema de precedência: aberto% s deve estar aberto (% s)
Incompatibilidade de protótipo:% s vs% s
Aviso: o uso de "% s" sem parênteses é ambíguo
Não é possível abrir% s:% s
use loose;