Консультация № 51911
12.08.2006, 02:22
0.00 руб.
0 3 3
Здравствуйте эксперты, у меня следующее:
Программа должна считывать несколько слов в массив, затем выдать количесво элементов, и затем, распечатать все введенные элементы...
для заполнения массива я использую оператор <STDIN>, это у меня получается, так же получается вывести все элементы массива на экран... но вот подсчитать колличество слов в массиве не получается, насколько мне известно это делается путем присваевания скалярной переменной всего массива (то бишь массив в скалярном контексте), но вот у меня, после того как я введу 5 слов, пишет что в массиве только 2, почему??? (заканчиваю ввод слов путем нажатия ctr+z, т.е. конец строки) листинг примерной программки в приложениии.
Всем спасибо за внимание.

Приложение:
#!/usr/bin/perl -wprint "Введите несколько слов.\n";@words=<STDIN>;$q=@words;print "\nВы ввели $q слов, это - \n";print "@words";

Обсуждение

Неизвестный
12.08.2006, 02:40
общий
это ответ
Доброе время суток, Lperw

эта проблема - не проблема - подскажите перл как обращаться с переменной - ответьте ему что это скаляр - а именно :

$q=@words+0;

или

$q=$#words;

вот и всё

с уважанием, удачи
Неизвестный
12.08.2006, 14:09
общий
это ответ
Здравствуйте, Lperw!
начнем с простого - с размера массива.
вы делаете правильно , т.е. присвоение скаляру массива всегда дает его размер.
но более "красивым" считается использование функции scalar.
$q = scalar(@words);
Но ошибка у вас скорее всего не в получении размера массива, а в его формировании.
А почему вы не пользуетесь отладкой? Я не говорю об встроенном отладчике, но хотя бы контролировать значения вводимые с STDIN , а тем более в массив.После ввода просто выведите построчно ваш массив( т.е. каждый элемент массива - новая строка) и вы поймете почему у вас размер не совпадает с требуемым.
ИМХО ошибка у вас именно вот здесь - @words=<STDIN>;. Так не делается. Вы должны четко знать каким образом будет осужествлятьсяя ввод и что будет являться элементом массива т.е. при вводе слов что будет разделять их на элементы массива пробелы или перевод строки.
Если каждое слово будет вводиться с новой строки, то для этого лучший вариант такой(см. приложение). Если же в каждой строке будет по нескольку слов и их так же надо разбить на элементы, то приведенный код нужно только немного модифицировать с учетом разбиения строки на подэлементы , используя split с соответствующим разделителем вместо $_ в push. См. вариант 2 в приложении . Этот вариант более универсален и его можно модифицировать под свои нужды. Он работает когда каждый элемент массива- новая строка и отделенные друг от друга пробелом слова в строке. Т.е. при таком вводе :
hfwfhoei
fhdslhf hfskdjhfsd sedfuefj
hfsih dihfsdi
это будет 6 элементов.

надеюсь что об"яснил понятно. Извиняюсь за некоторую сумбурность.


Приложение:
вариант 1.@words =();while (<>){ chomp; push(@words,$_);}вариант 2@words =();while (<>){ chomp; push(@words,split());}
давно
Академик
20764
1861
14.08.2006, 10:21
общий
это ответ
Здравствуйте, Lperw!

@words=<STDIN>;
считывает весь файл, разбивая его на строки. Так что вы считаете не слова, а строки.
Попробуйте так:

Приложение:
while (<STDIN>) { my @words = split; print int(@words), "\n";}
Форма ответа