2016-07-12 53 views
6

Sono solo curioso, - è anche possibile creare una v-string da una variabile scalare senza ricorrere a eval? .Creare un VSTRING da una variabile scalare senza utilizzare eval

I. e, questo funziona, ma utilizza eval:

my $var = 'v1.2.3'; 
my $conversion = to_vstring_1($var); 
# Prints "Version: 1.2.3, type: VSTRING" 
printf("Version: %vd, type: %s\n", $conversion, ref \$conversion); 

sub to_vstring_1 { 
    my ($arg) = @_; 

    $arg =~ tr/0-9.//cd; 
    $arg = 'v' . $arg; 

    return eval $arg; 
} 

Queste due varianti anche lavorare, e non usano eval, ma stampare "scalare" al posto di "VSTRING":

my $conversion_2 = to_vstring_2($var); 
# Prints "Version: 1.2.3, type: SCALAR" 
printf("Version: %vd, type: %s\n", $conversion_2, ref \$conversion_2); 

my $conversion_3 = to_vstring_3($var); 
# Prints "Version: 1.2.3, type: SCALAR" 
printf("Version: %vd, type: %s\n", $conversion_3, ref \$conversion_3); 

sub to_vstring_2 { 
    my ($arg) = @_; 

    $arg =~ tr/0-9.//cd; 
    $arg = pack('U*', split(/\./, $arg)); 

    return $arg; 
} 

sub to_vstring_3 { 
    my ($arg) = @_; 

    $arg =~ tr/0-9.//cd; 
    $arg =~ s/[._]?(\d+)/chr($1 & 0x0FFFF)/eg; 

    return $arg; 
} 

Quindi, c'è un quarto modo per farlo?

+0

Lavorando con https://metacpan.org/pod/distribution/version/lib/version.pod non riesci a farlo. – simbabque

risposta

3

è anche possibile creare una stringa v da una variabile scalare senza ricorrere a eval?

Sì, lo è, ma è un dolore e non ci sono buoni motivi per farlo.

È possibile scrivere codice XS che:

  • analizza la stringa di input
  • converte i numeri per i loro equivalenti char
  • assegna magia v-string al vostro scalare con una chiamata a sv_magic

Tuttavia, questo è esattamente ciò che fa la funzione interna Perl_scan_vstring in toke.c. Perché reinventare la ruota?