2011-12-14 29 views
5

मैं इस कार्यक्रम जो एक वाक्य जो सरणी से शब्द के प्रत्येक है टाइप करने के लिए शब्दों की एक सरणी लेता है और उपयोगकर्ता पूछते हैं:एक पाश पुन: चलाने यात्रा

@words = qw(Hi world thanks); 
foreach $word (@words) 
{ 
     print "Enter a line with word:$word\n"; 
     chomp($input = <STDIN>); 
     if($input=~/$word/i) 
     { 
       print "Great\n"; 
     } else { 
       print "Incorrect. Type a line containing $word\n"; 
     } 
} 

तो उपयोगकर्ता प्रकार के साथ एक इनपुट शब्द, यह ठीक काम करता है। लेकिन अगर वह नहीं करता है तो यह केवल त्रुटि संदेश प्रिंट करता है और अगले शब्द पर जाता है। मैं चाहता हूं कि यह उपयोगकर्ता को उसी शब्द के लिए इनपुट दोबारा दर्ज करने के लिए प्रेरित करे। पर कैसे ? मैंने कोशिश की कि यह काम नहीं करेगा।

उत्तर

18

आप इस मामले में का उपयोग कर सकते हैं वर्तमान पुनरावृत्ति को पुनरारंभ करें।

#!/usr/bin/env perl 

use strict; 
use warnings; 

my @words = qw(Hi world thanks); 
foreach my $word (@words) { 
    print "Enter a line with word: $word\n"; 
    while (1) { 
    chomp(my $input = <STDIN>); 
    if($input=~/$word/i) { 
     print "Great\n"; 
     last; 
    } else { 
     print "Incorrect. Type a line contaning $word\n"; 
    } 
    } 
} 
निश्चित रूप से

मैं शायद अलग होगा:

foreach my $word (@words) 
{ 
     INPUT:print "Enter a line with word:$word\n"; 
     chomp($input = <STDIN>); 
     if($input=~/$word/i) 
     { 
       print "Great\n"; 
     } else { 
       print "Incorrect. Type a line contaning $word\n"; 
       goto INPUT; 
     } 
} 
+1

धन्यवाद। यह काम करता हैं। चील करने के लिए perl बहुत सारे तरीके थे। –

+0

मैं 'redo' के लिए वोट दूंगा। –

+2

पवित्र गाय, 'रेडो' के लिए 14 अपवॉट्स? लंबे समय से मैंने पर्ल टैग में इतनी जबरदस्त प्रशंसा देखी है। – TLP

3

मैं एक अनंत while लूप तैयार हो जाएगा से बाहर निकलने के:

foreach my $word (@words) 
{ 
     print "Enter a line with word:$word\n"; 
     chomp($input = <STDIN>); 
     if($input=~/$word/i) 
     { 
       print "Great\n"; 
     } else { 
       print "Incorrect. Type a line contaning $word\n"; 
       redo; # restart current iteration. 
     } 
} 

एक कम-अनुशंसित विकल्प एक goto उपयोग करने के लिए है प्रत्येक व्यक्तिगत शब्द का तर्क उप में, फिर उस पर लूप:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my @words = qw(Hi world thanks); 
get_word($_) for @words; 

sub get_word { 
    my $word = shift or die "Need a word"; 
    print "Enter a line with word: $word\n"; 
    while (1) { 
    chomp(my $input = <STDIN>); 
    if($input=~/$word/i) { 
     print "Great\n"; 
     last; 
    } else { 
     print "Incorrect. Type a line contaning $word\n"; 
    } 
    } 
} 
3

जबकि redo निश्चित रूप से गर्भाशय है, यहां while ... continue वाला संस्करण है। यह एक आंतरिक लूप पर निर्भर करता है जो केवल तभी निकला जाता है जब सही शब्द दर्ज किया जाता है, और प्रत्येक गलत उत्तर के लिए सुधार को प्रिंट करता है।

use strict; 
use warnings; 

my @words = qw(Hi world thanks); 
foreach my $word (@words) { 
    print "Enter a line with word: $word\n"; 
    while (my $input = <>) { 
     last if $input =~ /$word/; 
    } continue { 
     print "Incorrect. Type a line contaning $word\n"; 
    } 
    print "Great\n"; 
} 

नोट करें कि इस मामले में chomp आवश्यक नहीं है।

+0

मुझे लगता है कि इनमें से किसी भी में 'चॉम्प' की वास्तव में आवश्यकता नहीं है, लेकिन केवल इसलिए कि रेगेक्स को एंकर नहीं किया गया है, और यह 'eq' तुलना नहीं है। –

+0

@ जोएल बेर्जर इसलिए "इस मामले में"। – TLP

+0

ओह, मैंने सोचा कि आप अपने मामले में मतलब है। गोटो –