Вопрос № 51911: Здравствуйте эксперты, у меня следующее:
Программа должна считывать несколько слов в массив, затем выдать количесво элементов, и затем, распечатать все введенные элементы...
для заполнения массива я использую оператор <STDIN>, это у мен...
Вопрос № 51.911
Здравствуйте эксперты, у меня следующее:
Программа должна считывать несколько слов в массив, затем выдать количесво элементов, и затем, распечатать все введенные элементы...
для заполнения массива я использую оператор <STDIN>, это у меня получается, так же получается вывести все элементы массива на экран... но вот подсчитать колличество слов в массиве не получается, насколько мне известно это делается путем присваевания скалярной переменной всего массива (то бишь массив в скалярном контексте), но вот у меня, после того как я введу 5 слов, пишет что в массиве только 2, почему??? (заканчиваю ввод слов путем нажатия ctr+z, т.е. конец строки) листинг примерной программки в приложениии.
Всем спасибо за внимание.
Приложение:
Отправлен: 12.08.2006, 02:22
Вопрос задал: Lperw (статус: 2-ой класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: dianacode
Доброе время суток, Lperw
эта проблема - не проблема - подскажите перл как обращаться с переменной - ответьте ему что это скаляр - а именно :
$q=@words+0;
или
$q=$#words;
вот и всё
с уважанием, удачи
--------- There is more than one way to do it
Ответ отправила: dianacode (статус: 3-ий класс)
Ответ отправлен: 12.08.2006, 02:40
Отвечает: -OC-
Здравствуйте, Lperw!
начнем с простого - с размера массива.
вы делаете правильно , т.е. присвоение скаляру массива всегда дает его размер.
но более "красивым" считается использование функции scalar.
$q = scalar(@words);
Но ошибка у вас скорее всего не в получении размера массива, а в его формировании.
А почему вы не пользуетесь отладкой? Я не говорю об встроенном отладчике, но хотя бы контролировать значения вводимые с STDIN , а тем более в массив.После ввода просто выведите построчно ваш массив( т.е. каждый элемент массива - новая строка) и вы поймете почему у вас размер не совпадает с требуемым.
ИМХО ошибка у вас именно вот здесь - @words=;. Так не делается. Вы должны четко знать каким образом будет осужествлятьсяя ввод и что будет являться элементом массива т.е. при вводе слов что будет разделять их на элементы массива пробелы или перевод строки.
Если каждое слово будет вводиться с новой строки, то для этого лучший вариант такой(см. приложение). Если же в каждой строке будет по нескольку слов и их так же надо разбить на элементы, то приведенный код нужно только немного модифицировать с учетом разбиения строки на подэлементы , используя split с соответствующим разделителем вместо $_ в push. См. вариант 2 в приложении . Этот вариант более универсален и его можно модифицировать под свои нужды. Он работает когда каждый элемент массива- новая строка и отделенные
друг от друга пробелом слова в строке. Т.е. при таком вводе :
hfwfhoei
fhdslhf hfskdjhfsd sedfuefj
hfsih dihfsdi
это будет 6 элементов.
надеюсь что об"яснил понятно. Извиняюсь за некоторую сумбурность.
Приложение:
Ответ отправил: -OC- (статус: Студент)
Ответ отправлен: 12.08.2006, 14:09 Оценка за ответ: 5
Отвечает: Хватов Сергей
Здравствуйте, Lperw!
words=<STDIN>;
считывает весь файл, разбивая его на строки. Так что вы считаете не слова, а строки.
Попробуйте так:
Приложение:
Ответ отправил: Хватов Сергей (статус: 1-ый класс)
Ответ отправлен: 14.08.2006, 10:21