2011-05-06 7 views
24

En otros idiomas que he usado como Erlang y Python, si estoy dividiendo una cadena y no se preocupan por uno de los campos, que se puede utilizar un marcador de posición de subrayado. He intentado esto en Perl:asignación de Perl con un marcador de posición ficticia

(_,$id) = split('=',$fields[1]); 

Pero me sale el siguiente error:

Can't modify constant item in list assignment at ./generate_datasets.pl line 17, near ");"
Execution of ./generate_datasets.pl aborted due to compilation errors.

¿El Perl tiene un patrón similar tal que podría utilizar en lugar de crear unas variables temporales inútiles?

Respuesta

37

undef tiene el mismo propósito en Perl.

(undef, $something, $otherthing) = split(' ', $str); 
+9

Nota: incluso válido en una declaración 'my (undef, $ a, $ b) = ...' – ysth

+4

Me gustaría votar esto, pero el uso de '$ a' y' $ b' previene yo. – darch

+3

@darch: * eyeroll * – geekosaur

17

Usted ni siquiera necesita marcadores de posición si utiliza Slices:

use warnings; 
use strict; 

my ($id) = (split /=/, 'foo=id123')[1]; 
print "$id\n"; 

__END__ 

id123 
8

Puede asignar a (undef).

(undef, my $id) = split(/=/, $fields[1]); 

Incluso puede usar my (undef).

my (undef, $id) = split(/=/, $fields[1]); 

También podría usar un sector de lista.

my $id = (split(/=/, $fields[1]))[1]; 
1

Y sólo para explicar por qué se obtiene el error particular que se ve ...

_ es una variable Perl interna que se puede utilizar en el comando stat para indicar "el mismo archivo que se utilizó en la llamada anterior stat ". De esta forma, Perl usa una estructura de datos stat en caché y no realiza otra llamada stat.

if (-x $file and -r _) { ... } 

Este identificador de archivo es un valor constante y no se puede escribir en. La variable se almacena en el mismo tipoglob como $_ y @_.

Ver perldoc stat.

Cuestiones relacionadas