2017-02-23 21 views
1

Я написал сценарий, который требует от пользователя ввода ответа, который сохраняется как переменная. Проблема в том, что я использовал цикл для этого, и у меня есть второй вопрос, который требует ввода пользователя, но это не входит в первый цикл. Вывод из второго вопроса требует, чтобы первая переменная & отвечала условию, которое печатает ответ. Я получаю сообщение об ошибке (используя предупреждения), что переменная явно не объявлена.Perl- Как я могу получить доступ к переменной, когда я устанавливаю, я использовал <STDIN> для пользователя, чтобы установить его в цикле?

Как я могу заставить Perl «запомнить» пользовательский ввод от в цикл после окончания цикла? Должен ли я продолжать цикл? Если да, то как?

Благодарим за помощь. Я прикрепил сценарий. Я предполагаю, что это просто сложно, и лучше использовать другой тип цикла, но я просто получаю зависание для fxn, поэтому было бы полезно придерживаться его. Любые другие советы по очистке кода были бы полезны.

#!C:\Perl 
#lesson2XUE.pl 
use warnings; use strict; 

my $fas="MTESMIRDVELAEEALPKKTGGPQG"; 
my $swi="MSTESMIRDV ELAEEALPKK TGGPQG"; 
print "Your sequence has been determined. How would you like it displayed? FASTA/SwissProt:"; 

for (my $i=0; $i<4; $i++) { 
my $choice=<STDIN>; 
chomp $choice; 
if ($choice =~ /FASTA/i) { 
    print $fas,"\n"; 
    last; 
} elsif ($choice =~ /SwissProt/i){ 
    print $swi,"\n"; 
    last; 
} else { 
     print qq[Please type "FASTA" or "SwissProt" only\n]; 
}  
} 

sleep (1); 
print "\n"; 

print qq[Would you like to see the other version? Y/N\n]; 
my $choice2=<STDIN>; 
chomp $choice2; 
    if (($choice2 =~ /Y/i) && **($choice =~ /FASTA/i)**){ 
     print $swi,"\n"; 
} elsif (($choice2=~/Y/i) && **($choice=~/SwissProt/i)**) { 
     print $fas, "\n"; 
} elsif ($choice2 =~ /N/i) { 
     print qq[Okay,have a good day]; 
} 

Проблема возникает там, где сценарий выделен жирным шрифтом. Поскольку я больше не в цикле, $ choice не определен.

проблема с если (($ Choice2 = ~/Y/я) & & ** ($ выбор = ~/FASTA/я)) {** и } ELSIF ($ выбор = ~/SwissProt/i) (Понял, что я не могу выделить в сценарии «сценарий»)

Еще раз спасибо!

+0

Вы объявляете '$ choice' внутри цикла, так что его лексической области видимости. Если вы хотите получить доступ к нему за пределами цикла, объявите его вне цикла. –

+0

Правильно, я читал это по другим вопросам. Но как объявить что-то, что пользователь вводит? Если я снова использую , он будет ждать ввода большего количества пользователей. Как повторно объявить ввод пользователя? –

+0

Вне цикла: 'my $ choice;' Внутри цикла: '$ choice = ;' –

ответ

0

Как уже упоминалось ранее ... Объявите $ choice вне сферы действия вашего цикла. в вашем примере $ выбор выходит за рамки после выхода из цикла ...

use warnings; use strict; 

my $fas="MTESMIRDVELAEEALPKKTGGPQG"; 
my $swi="MSTESMIRDV ELAEEALPKK TGGPQG"; 
print "Your sequence has been determined. How would you like it displayed? FASTA/SwissProt:"; 
my $choice=""; 
for (my $i = 0; $i < 4; $i++) { 
$choice=<STDIN>; 
chomp $choice; 
if ($choice =~ /FASTA/i) { 
    print $fas,"\n"; 
    last; 
} elsif ($choice =~ /SwissProt/i){ 
    print $swi,"\n"; 
    last; 
} else { 
     print qq[Please type "FASTA" or "SwissProt" only\n]; 
}  
} 

sleep (1); 
print "\n"; 

print qq[Would you like to see the other version? Y/N\n]; 
my $choice2=<STDIN>; 
chomp $choice2; 
    if (($choice2 =~ /Y/i) && ($choice =~ /FASTA/i)){ 
     print $swi,"\n"; 
} elsif (($choice2=~/Y/i) && ($choice=~/SwissProt/i)) { 
     print $fas, "\n"; 
} elsif ($choice2 =~ /N/i) { 
     print qq[Okay,have a good day]; 
} 
0

Я думаю, что это поможет.

while(defined($line=<STDIN>)){ 
    print "I saw $line"; 
} 

Я сделал версию:

use warnings; 
use strict; 

my $fas = "MTESMIRDVELAEEALPKKTGGPQG"; 
my $swi = "MSTESMIRDV ELAEEALPKK TGGPQG"; 

my $tmp = ""; 

main(); 

sub main() { 
    print 
"Your sequence has been determined. How would you like it displayed? FASTA/SwissProt:"; 
    while (defined(my $line = <STDIN>)) { 
     chomp $line; 

     if ($tmp eq "") { 
      process($line); 
      next; 
     } 
     else { 
      process2($line); 
      last; 
     } 
    } 
} 

sub process { 
    my $choice = shift; 
    $tmp = $choice; 
    if ($choice =~ /FASTA/i) { 
     print $fas, "\n"; 
    } 
    elsif ($choice =~ /SwissProt/i) { 
     print $swi, "\n"; 
    } 
    else { 
     $tmp = ""; 
     print qq[Please type "FASTA" or "SwissProt" only\n]; 
     return; 
    } 
    print "\n"; 
    print qq[Would you like to see the other version? Y/N\n]; 
} 

sub process2 { 
    my $choice2 = shift; 
    if (($choice2 =~ /Y/i) && ($tmp =~ /FASTA/i)) { 
     print $swi, "\n"; 
    } 
    elsif (($choice2 =~ /Y/i) && ($tmp =~ /SwissProt/i)) { 
     print $fas, "\n"; 
    } 
    elsif ($choice2 =~ /N/i) { 
     print qq[Okay,have a good day]; 
    } 
    else { 
     print qq[Good day]; 
    } 
} 
Смежные вопросы