Pergunta

Tem sido 22 anos entre o lançamento público inicial de Perl 1.0 (18 de dezembro de 1987) e a versão estável atual 5.10.1 (2009).

Durante esses 22 anos seguintes lançamentos notáveis ??foram feitas:

  • Perl 1.0 (1987 - libertação inicial)
  • Perl 2 (1988 - expressões regulares melhor)
  • Perl 3 (1989 - suporte para fluxos de dados binários)
  • Perl 4 (1991 - identificar a versão do Perl descrito no Livro Camel)
  • Perl 5 (1994 - principais alterações introduzidas, perto reescrita completa do intérprete)
  • Perl 5.6 (2000-64 suporte bit, strings unicode, suporte a arquivos grandes)
  • Perl 5.8 (2002 - melhor suporte a Unicode, nova implementação IO)
  • Perl 5.10 (2007 - nova declaração switch, atualizações de expressão regular, operador de jogo inteligente)

Eu estou procurando exemplos específicos de trás incompatibilidades durante a história do Perl.

Pergunta:

  • Na história do Perl 22 anos, existem exemplos de Perl para trás incompatibilidade onde o código fonte Perl alvo Perl versão X não será executado sob a versão Y (onde Y> X)?

Por favor, inclua referências e exemplos de código, quando possível.

Foi útil?

Solução

Um dos maiores incompatibilidades deliberadas é matriz de interpolação que mudou entre Perl 4 e Perl 5.

my @example = qw(1 2 3);
print "foo@example.com";

Em Perl 4, que seria:

foo@example.com

Em Perl 5, que seria:

foo1 2 3.com

Felizmente, se a matriz não existe Perl irá avisá-lo sobre o "possível interpolação não intencional".

Threads passou por uma grande mudança entre 5.005 e 5.6. "5005 tópicos" utilizado o modelo de segmentação POSIX tradicional, onde todos os dados globais é compartilhado. Embora, em teoria, este foi mais rápido, porque então Perl poderia usar apenas threads POSIX, foi um pesadelo para programadores Perl. A maioria dos módulos Perl não foram thread-safe. E ele nunca realmente funcionou bem.

Na 5.6, ActiveState e outros fizeram fork () no Windows. Quando você fork () no Windows, Perl faria uma cópia do objeto intérprete e executar os códigos de operação de ambos os intérpretes. Este era conhecido como "multiplicidade".

Em 5,8, Arthur Bergman correu com isso e é usado para criar ithreads. Porque multiplicidade está emulando um processo separado, nenhum dado é compartilhada por padrão. Somente os dados que você diz é compartilhado é compartilhado. Isso os torna muito mais seguro para uso, embora tenha levado um longo tempo antes ithreads mantiveram-se estáveis. Pessoas como Elizabeth Mattijsen e Jerry Hedden fez isso acontecer.

5005threads foram finalmente eliminados em 5.10.0. Existe uma camada de compatibilidade, mas eu duvido que seria realmente o trabalho no código de produção.

Outra grande incompatibilidade veio wrt Unicode entre 5,6 e 5,8. Unicode em 5,6 explodiu. Seja ou não uma cadeia foi Unicode foi decidido pelo âmbito envolvente. Ele foi completamente re-engenharia em 5,8 agora a Unicodeiness de uma cadeia está ligada à cadeia. O código escrito usando 5.6 do Unicode geralmente tinha que ser reescrito em 5,8, muitas vezes por causa de obter 5.6 do Unicode para o trabalho direito, você tinha que fazer hacks feios.

Recentemente, 5.10.1 fez um monte de mudanças incompatíveis para smart-jogo. Felizmente, eles foram introduzidos em 5.10.0, então não é um grande negócio. A história não é Perl 6 introduziu o conceito smart-jogo, e foi portado para a versão de desenvolvimento do Perl 5. O tempo passou, ea idéia de smart-correspondência Perl 6 mudou. Ninguém disse o Perl 5 caras e saiu em 5.10.0 inalterado. Larry Wall notado e fez o equivalente a OMG YER DOIN eLE ERRADO !!! A nova versão Perl 6 foi visto como significativamente melhor e assim 5.10.1 fixa-lo.

Outras dicas

pseudo-hashes são um exemplo recente que mola para minha mente. Em geral, perldelta arquivos ter uma visão geral de mudanças incompatíveis em uma versão específica. Estas mudanças quase sempre quer obscurecer (como pseudo-hashes) ou pequeno.

Sim. Há muitos, embora eles são geralmente menores. Às vezes, isso é devido a ciclos de descontinuação em última análise, que terminam em remoção. Às vezes, é devido à mudança semântica para novo (e experimental) apresenta. Às vezes é correções de bugs para as coisas que não funcionam corretamente. Os desenvolvedores Perl têm um grande cuidado para preservar a compatibilidade com versões anteriores entre as versões, sempre que possível. Não me lembro de ter um script que foi quebrado com a atualização para uma nova versão do Perl.

A ordem de hash interna mudou várias vezes. Enquanto isso não é algo que você deve depender, pode causar problemas se você sem querer fazer.

binário incompatibilidade entre principais (5.x) lançamentos é comum, mas que, geralmente, apenas significa que todas as extensões XS precisam ser recompilados.

A lista completa é tempo demais para listar aqui. Você pode obtê-lo, verificando a seção "incompatíveis alterações" de de cada versão história .

OTOH há algumas características selvagens que datam de Perl 1 que ainda trabalho. Por exemplo, o que faz este impressão?

%foo = (foo => 23);
print values foo

Isso mesmo, 23. Por quê? Porque "arrays associativos" eram objetos não de primeira classe em Perl 1. $foo{bar} trabalhou, mas não houve %foo. Eu realmente não sei por que, mesmo a página man Perl 1 reconhece este é warty. Assim, para compatibilidade com Perl 1 você pode acessar um hash mundial sem usar um %, talvez se o seu teclado está quebrado ou a Apple decide ninguém usa o símbolo %.

chdir tem algumas esquisitices. chdir() com nenhum argumento irá levá-lo para seu diretório home, replicando o comportamento cd shell. Infelizmente isso irá chdir undef e chdir "" o que torna difícil detectar erros em torno chdir. Felizmente este comportamento está obsoleto. Vou ter de se certificar de que morre em 5,14.

$[ ainda está por aí e permanece undeprecated, mas "altamente desencorajada". Ele muda o que o primeiro índice de uma matriz é, por isso, se você é um ser humano como eu e contar a partir de 1 você pode fazer:

$[ = 1;
@foo = qw(foo bar baz);
print $foo[2];   # prints bar

Perl 5 mudou para ser com escopo de arquivo, pois caso contrário, era uma drag desempenho e uma grande fonte de louco.

Eu tive alguns erros funk com Perl4 e Perl5 avaliar mão lados esquerdo e direito de uma atribuição em uma ordem diferente, citando o armadilhas Perl para o incautos:

LHS vs. RHS de qualquer operador de atribuição. LHS é avaliada em primeiro lugar em perl4, segundo em perl5; isto pode afectar a relação entre os efeitos colaterais em sub-expressão.

@arr = ( 'left', 'right' );
$a{shift @arr} = shift @arr;
print join( ' ', keys %a );
# perl4 prints: left
# perl5 prints: right

Para algumas coisas novas e possivelmente incompatíveis, consulte o FAQ entre Perl4 e Perl5.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top