2015-04-01 1 views
0

У меня возникают проблемы со следующим блоком кода: Где $ output is netstat -lnt | grep "::: 60". В частности, раздел под комментарием #Create filename format Perl: строка foreach, split, изменить строку, установить в массив. Opendir, next if files = измененная строка. Отключить файлы

my @lines = split /^/, $output; 
foreach my $line (@lines) { 
my ($garb, $long_ports) = (split /\s*:::\s*/, $line); 

#Get the last 2 digits of the 60XX port number 
my ($garb2, $ports) = (split /60/, $long_ports); 

#Split values to numbers 0-9 for correct filename format 
if ($ports < 10) { 
    my ($garb3, $ports2) = (split /0/, $ports); 

#Add 0 since 0 port is split to empty string 
if (length($ports2) == 0){ 
    $ports2 = "0$ports2"; 
} 

#Create file name format 
my @locked_ports = ".X$ports2-lock"; 
} 
} 
my %h = map {$_ => 1 } @locked_ports; 
#open /tmp and find the .X*-lock files that DO NOT match locked_ports 
opendir (DIR, $tmp) or die "Error in opening dir $tmp\n"; 
while (my $files = readdir(DIR)) { 
    if (exists $h{$files}){ 
    next} 
    unlink $files; 
} 
    closedir(DIR); 

Я также попытался:

#Create file name format 
my @locked_ports = ".X$ports2-lock"; 
} 
} 
#open /tmp and find the .X*-lock files that DO NOT match locked_ports 
opendir (DIR, $tmp) or die "Error in opening dir $tmp\n"; 
while (my $files = readdir(DIR)) { 
    next if $files =~ @locked_ports; 
    unlink $files; 
} 
    closedir(DIR); 

И:

#Create file name format 
my $locked_ports = ".X$ports2-lock"; 
} 
} 
#open /tmp and find the .X*-lock files that DO NOT match locked_ports 
opendir (DIR, $tmp) or die "Error in opening dir $tmp\n"; 
while (my $files = readdir(DIR)) { 
    next if $files =~ $locked_ports; 
    unlink $files; 
} 
    closedir(DIR); 

Каждый раз, когда я получаю сообщение об ошибке следующего вида: Global symbol "@locked_ports" requires explicit package name, Global symbol "$locked_ports" requires explicit package name

Как я могу ve "next" над именами файлов, которые равны линиям locked_ports?

Любая помощь очень ценится.

Спасибо.

+0

Правильное углубление облегчит чтение. но даже в этом случае я бы посоветовал вам начинать с нуля. чтобы получить помощь здесь, я бы порекомендовал вам выровнять код и просто показать вход и объяснить простым текстом, что вы хотите с ним делать. – beasy

+0

Хэш-код, который у вас был, но с момента его удаления больше смысла '... = ~ @ foo' не годится. – ikegami

+0

Также обратите внимание, что вы пытаетесь отключить '.' и' ..' и другие каталоги. – ikegami

ответ

0

my изменяет переменную на самый внутренний блок (колышки), в котором он расположен.

{ 
    my $foo; 
    ... 
} 

# $foo not accessible here. 

Блок заканчивается на линии после той, где вы создаете переменную. Переместите декларацию переменной, чтобы она имела достаточно большой объем.

+0

Вау я чувствую себя манекеном. Перемещение объявления в начало скрипта устранило ошибку. Все еще не получается желаемого результата, но приближаюсь. Спасибо! – marcopolo1166

+0

Даже если это не было связано с моим вопросом, но вместо сообщений об ошибках, перечисленных выше, я отмечаю это как ответ, потому что здесь я задал новый вопрос: http://stackoverflow.com/questions/29401277/perl- opendir-то время-READDIR-некст-если-хэш – marcopolo1166