2016-03-16 5 views
8

Quando eseguo il seguente codice, lo script muore con expected three at c:\temp\die.pl line 13..Perl riporta il numero di riga errato se muore in sostituzione multi linea. È previsto o un bug?

use warnings; 
use strict; 

my $text = 'one two Three'; 

$text =~ s{ 

    (\w+) # Find a word 
    \s+ 
    (\w+) # Find another word 
    \s+ 
    (\w+) # Find third word 

}{ 

    # Insert a few lines on purpose 
    # to make the point. 

    die 'expected one' unless $1 eq 'one'; 
    die 'expected two' unless $2 eq 'two'; 
    die 'expected three' unless $3 eq 'three'; 

}ex; 

io sono un po 'sorpreso perché la linea attuale che causa la morte è la linea 21.

Sembra che l'interprete non conta la parte modello della sostituzione quando si calcola (?) La linea di Morte. La riga 6 è $text =~ s{ quindi il codice fino a }{ viene "saltato", rendendo la riga 7 la seguente riga vuota, la riga 8 # Insert a few lines on purpose e così via fino a raggiungere die 'expected three' unless $3 eq 'three'; contando 13 righe.

È previsto questo comportamento?

C'è un modo per stampare la vera linea della morte?

perl -v inizia con This is perl 5, version 18, subversion 1 (v5.18.1) built for MSWin32-x86-multi-thread-64int

Utilizzando la carpa, invece di morire

è stato suggerito che uso invece di die.

Ora muore (o carpe) con l'unico leggermente diverso expected three at c:\temp\die.pl line 14 che attribuisco alla terza riga aggiuntiva use Carp;.

+0

in linux muore effettivamente alla riga 21 – sotona

+0

È possibile stampare l'errore completo tramite 'Carpa' - sarebbe interessante vedere ciò che viene segnalato, dato questo comportamento. La mia ipotesi qui sarebbe che la regex spezzettata che conta in modo diverso .. Posso inventare "13" contando ogni parte di regex come una linea e scartando le righe vuote all'interno della regex, quello che posso immaginare di essere fatto. – zdim

+0

Per me, con v5.16 su CentOS 7, muore anche sull'ultima riga vuota prima di '} {'. – zdim

risposta

4

Un rapido 'di indagine mostrato questo:

v5.10.1 stampi sulla linea 13.
v5.18.4 muore sulla linea 13.
v5.20.2 muore sulla linea 21.
v5.22.0 muore sulla linea 21.

Quindi, dopo aver controllato il perldelta for 5.20, ho trovato:

I numeri di riga all'interno di operatori di quotatura multilinea vengono ora riportati correttamente. [perl # 3643]

Quindi, sembra che l'unico modo per ottenere il numero di riga corretto sia l'aggiornamento a una versione successiva di perl.