Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Нужна помощь --- array


Автор: junior 23.1.2005, 14:55
Привет!
Помогите, пожалуйста, исправить ошибки в программе.
Программа должна делать следующее:
1. Инициализировать массив с 3 названиями фильмов.
2. Показывать список массива юзеру.
3. Спрашивать юзера индекс фильма (movie array index), который нужно удалить. Если invalid input, то просить повторить ввод с правильным значением. Если valid input, значит удалить фильм.
4. Спрашивать юзера ввести новые названия в список ( одно название в строке), предупредив юзера разделять каждое название нажатием enter.
5. Спрашивать юзера хочет ли он получить список в reverse order.
6. Если да, output in reverse order. Если нет - forward.

Вот что у меня получилось. (смотрите ниже)
Пункт 3 работает, если можно так выразится, однобоко. Т.е. переходит на 4 пункт только при введенной 1. smile Надо бы поставить вывод после него всего массива опять, что бы убедиться, что в пункте 3 что-то все таки удаляется.
Далее, при "успешно" введенной 1 в пункте 3, начинаю вводить новые значения. На винде, почему-то, не работает cntr+z, на freeBSD cntr+d позволяет остановить ввод новых значений. Можно как-то по-другому решить эту проблему? smile В общем список в финале (пункты 5 и 6) содержит только (!!!) значения, введенные в пункте 4. То, что было задано в начале, отсутствует.
Что-то у меня написано с ошибками.
Помогите разобраться, пожалуйста!
Спасибо!

Код
#!/usr/bin/perl -w
# array.pl
# A program initializes an @movies array
# with three movie titles.

use strict;
use warnings;

my @movies = ('Snatch', 'Zatoichi', 'Hero');
my $index;

# Display titles for the user in alphabetic order
{
@movies=sort @movies;
print "$_: $movies[$_]\n" foreach (0..$#movies);
};

# Ask the user for index of the movie
# to delete from array
while(1){
  print "Please enter the index of the movie you want to delete: ";
  $index = <STDIN>;
  chomp $index;
  last if($index !~ /\D/ && $index > 0 && $index < $#movies);
  # test, whether $index is an integer and within the index range
};

# Delete movies from array
{
delete $movies[$index];
};

# prompt for use input
print "Please enter movies you want to add to the list, one per line\n",
"Use cntrl/Z to termnate the input: \n";
# Ask the user to input a movie titles, one per line
# read everything from stdin
@movies = <STDIN>;
# chop off newlines using the array chop operator (chops each line)
chop(@movies);

# Ask the user which sort order to use
print "To print the movie list in reverse order, press Y";
if (<STDIN> =~ /^y/i) { # does the input begin with a y
 # Display movies in the array in reverse order
 sort {$b cmp $a} (@movies);
 print "$_: $movies[$_]\n" foreach (0..$#movies);
} else                      {
 # Display movies in the array in alphabetic order
                   @movies=sort @movies;
                  print "$_: $movies[$_]\n" foreach (0..$#movies);
                   };

Автор: korob2001 23.1.2005, 17:13
Вот рабочий пример:
Код

#!/usr/bin/perl -w
# array.pl

use strict;
use warnings;

my @movies = ('Snatch', 'Zatoichi', 'Hero');
my $index;

{
@movies=sort @movies;
print "$_: $movies[$_]\n" for (0..$#movies);
};

while(1){
 print "Please enter the index of the movie you want to delete: ";
 chomp($index = <STDIN>);
 last if($index =~ /^\d+$/ && $index > 0 && $index <= $#movies);
};

{
splice(@movies, $index, 1);# $movies[$index];
};
print join("\n", @movies), "\n";
print "Please enter movies you want to add to the list, one per line\n",
"Use cntrl/Z to termnate the input: \n";
chomp(my $check = <STDIN>);
push(@movies, $check);

print "To print the movie list in reverse order, press Y";
if (<STDIN> =~ /^y/i) {
@movies = sort {$b cmp $a} (@movies);
print "$_: $movies[$_]\n" foreach (0..$#movies);
} else {
@movies=sort @movies;
print "$_: $movies[$_]\n" foreach (0..$#movies);
}

Удачи.

Автор: Гость_Junior 26.1.2005, 04:20
Спасибо korob2001!!!
У меня в итоге вот что получилось, с твоей помощью:
Код

#!/usr/bin/perl -w
# This program initializes array with 3 movie titles,
# allow the user to add/delete movie from the list,
# print movie list in reverse or forward order.
# array.pl

use strict;
use warnings;

# initializes an @movies array with 3 movie titles
my @movies = ('Snatch', 'Zatoichi', 'Hero');
my $index;

# print the user movie list
{
@movies=sort @movies;
print "$_: $movies[$_]\n" for (0..$#movies);
};

# ask the user for movie array index to delete
while(1){
 print "Please enter the index of the movie\n",
 "you want to delete: ";
 chomp($index = <STDIN>);
 last if($index =~ /^\d+$/ && $index >= 0 && $index <= $#movies);
};
{
splice(@movies, $index, 1);# $movies[$index];
};
print join("\n", @movies), "\n";

# ask the user to input a series of movie titles
# one per line
print "Please enter movies you want to add to the list,\n",
"one per line. Use ctrl/D to termnate the input: \n";
while (($_ = <STDIN>) =~ /^.+$/) {
 chomp(@movies);
 push(@movies,$_);
};

# ask the user which sort order use to print movie list
print "To print the movie list in reverse order, press Y\n";
if (<STDIN> =~ /^y/i) {
 @movies = (sort {lc($b) cmp lc($a)} @movies);
 print "$_: $movies[$_]\n" foreach (0..$#movies);
} else {
 @movies=(sort {lc($a) cmp lc($b)} @movies);
 print "$_: $movies[$_]\n" foreach (0..$#movies);
}


Вроде бы все работает, только при запуске программы, после добавления новых строк, выдает warning:
Use of uninitialized value in pattern match (m//) at ./array.pl line 41, <STDIN> line 3.
но после этого продолжает работать.
Вот output программы:

0: Hero
1: Snatch
2: Zatoichi
Please enter the index of the movie
you want to delete: 0
Snatch
Zatoichi
Please enter movies you want to add to the list,
one per line. Use ctrl/D to termnate the input:
asd
asdf
Use of uninitialized value in pattern match (m//) at ./array.pl line 41, <STDIN> line 3.
To print the movie list in reverse order, press Y
y
0: Zatoichi
1: Snatch
2: asdf
3: asd

Для меня, эта ошибка пока не критична, просто интересно узнать, что не так. smile
Еще раз спасибо за помощь!!!

Автор: korob2001 26.1.2005, 06:08
Ошибка здесь:
Код

while (($_ = <STDIN>) =~ /^.+$/) {
           chomp(@movies);
           push(@movies,$_);
};

В условии цикла. Попробуй так:
Код

while (<STDIN>) {
           last if length( $_ ) <= 0;
           chomp;
           push(@movies,$_);
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)