2015-10-07 3 views
-2

Когда я запускаю этот бит кода. он не отображает никакого вывода. Кто-нибудь видит что-то не так? Я пытаюсь показать это из положить:Perl Script не работает правильно

A 
AA 
AAA 
AAAB 
AAABA 
AAABAA 
AAABAAA 
AAABAAAB 

т.д.

#!/usr/local/bin/perl 

$A = 3; 
$B = 1; 
$i = 1; 
$output = ""; 
$j = 1; 

while ($i <= $ARGV[0]) { 
while ($j <= $i) { 
if ($A == 0 && $B == 0) { 
    $A = 3; 
    $B = 1; 
} 

if ($A > 0) { 
    $output.= "A"; 
    $A--; 
} 
else { 
    $output.= "B"; 
    $B--; 
} 

$j++; 
} 

print($output . "\n"); 
    $i++; 
} 
+6

Вы забыли передать аргумент? (Это было бы поймано, если бы вы использовали 'use strict, используйте предупреждения,' как всегда.) – ikegami

+0

проверить, если он даже идет здесь с аргументами: while ($ i <= $ ARGV [0]) – ergonaut

+0

При использовании stict tag говорит мне «использование неинициализированного значения в числовом лементе (<=) в строке 11 –

ответ

2

Это работает для меня, когда я запускаю его с числовым аргументом (количество строк).

Идея, как упростить код:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $count = shift; 
my $A = 3; 
my $B = 1; 
my $string = q(); 
$string .= ('A' x $A) . ('B' x $B) while $count > length $string; 
print substr($string, 0, $_), "\n" for 1 .. $count; 

Он использует другой алгоритм - он создает самую длинную возможную строку, а затем выводит его части.

+1

' $ string = ('A' x $ A . 'B' x $ B) x (1 + ($ count-1)/($ A + $ B)); ' – ysth

0

если нет @ARGV, while ($i <= $ARGV[0]) никогда не запускается.

@ARGV - массив аргументов командной строки, предоставляемых при выполнении сценария. вы не указали никаких аргументов командной строки. если у вас есть use warnings, вы должны быть предупреждены, что $ARGV[0] неинициализирован.

0

От ikegami Комментарий. Вы не можете передавать входные данные при компиляции программы. Например, рассмотрите имя вашего файла: algo.pl. Можете ли вы запустить свою программу с помощью

perl algo.pl 10 

Здесь 10 - входное значение программы. В программной величине извлекается $ARGV[0]

поэтому в вашей программе выглядит while ($i <= $ARGV[0]).

Если вы хотите передать несколько значений, например perl filename.pl 12 data1 data2 В данных поисках можно получить $ARGV[0] $ARGV[1] $ARGV[2] для получения дополнительной информации see here.

Если вы хотите передать входные данные во время выполнения используется STDIN

use warnings; 
use strict; 
my $A = 3; 
my $B = 1; 
my $i = 1; 
my $output = ""; 
my $j = 1; 

print "Enter the value: "; 
chomp(my $value = <STDIN>); 


while ($i <= $value) { 
while ($j <= $i) { 
if ($A == 0 && $B == 0) { 
    $A = 3; 
    $B = 1; 
} 

if ($A > 0) { 
    $output.= "A"; 
    $A--; 
} 
else { 
    $output.= "B"; 
    $B--; 
} 

$j++; 
} 

print($output . "\n"); 
    $i++; 
} 
Смежные вопросы