2011-05-06 17 views
24

Diğer dillerde Erlang ve Python gibi kullandım, bir dizeyi ayırıyor ve alanlardan biriyle ilgilenmiyorsam alt taraf yer tutucu kullanabilirim. Perl'de bu çalıştı:Sahte yer tutucuyla perl atama

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

Ama aşağıdaki hatayı alıyorum:

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.

mu Perl ben işe yaramaz bir geçici değişkenleri oluşturmak yerine kullanabilirsiniz benzer tip bir eğilim var?

cevap

37

undef aynı amaçla Perl. Eğer Slices kullanırsanız

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

Not: bir bildirimde bile geçerlidir 'my (undef, $ a, $ b) = ...' – ysth

+4

Bunu kullanmak istiyorum, ancak $ a' ve '$ b' kullanımını engeller. ben mi. – darch

+3

@darch: * eyeroll * – geekosaur

17

Hatta tutucuları gerekmez: Sen (undef) atayabilirsiniz

use warnings; 
use strict; 

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

__END__ 

id123 
8

.

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

my (undef)'u bile kullanabilirsiniz. Bir liste dilimi de kullanabilirsiniz.

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

Ve gördüğünüz belirli hata alıyorum neden sadece açıklamak için ...

_ biz kullanılan "aynı dosyayı göstermek için stat komuta kullanılabilecek bir iç Perl değişkendir önceki stat numaralı telefondan ". Bu şekilde Perl, önbelleğe alınmış stat veri yapısını kullanır ve başka bir stat çağrısı yapmaz.

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

Bu dosya el kitabı sabit bir değerdir ve yazılamaz. Değişken, $_ ve @_ ile aynı tipglob'de saklanır.

Bkz. perldoc stat.