*Editing to include the entire code
#Shell script
less file.txt | perl parseperl.pl > index.html
#This is the Perl file parseperl.pl
my @array;
while(<>)
{
($date,$name,$city) = split(",",$_,3);
%hash =(NY=>"NYC", Washington=>"Virginia", London=>"UK");
push @array, "$name, $city,$hash{$city}";
}
foreach(@array)
{
($date,$name,$city,$hash{$city}) = split(",",$_);
print "<tr>\n";
print "<td>$name</td>\n";
print "<td>$city</td>\n";
print "<td>$hash{$city}</td>\n";
}
Код по какой-то причине принимает в выводе значение предыдущего ключа
Например: это результат
Joe NYC NY
Mary Washington NY
Мой входной файл - file.txt.
12/12 12:32:56,Joe,NYC
12/12 12:12:16,Mary,Washington
пожалуйста, порекомендуйте
Редактировать
Мой код работает, когда я использую это
($name, $city, $state) = split (/,/,$_)
@zdim - Разместил
@ user3423407 Спасибо - теперь вернитесь и медленно и медленно проверьте то, что вы опубликовали: он не будет печатать то, что вы показываете. Во-первых, это потому, что в строке "$name, $city,$hash{$city}" есть пробел перед $city, поэтому, когда вы ставите split позже через запятую, вы получаете `$ city` (с начальным пробелом), что не является ключом в вашем хэше.
Спасибо @zdim. Я внес это изменение и запустил, но он все еще не распечатал правильную карту. Обратите внимание, что он показывает правильное значение в $ _, то есть значение ключа показывает Джо, Нью-Йорк, Нью-Йорк Мэри, Вашингтон, Вирджиния. Но когда он заканчивает эту строку ($ name, $ city, $ hash {$ city}) = split ( ",", $ _); не уверен, почему он не получает правильное значение ключа
1. Пробел в строке, вроде упомянутого @zdim. 2. Я ожидаю, что NY => NYC должно быть NYC => NY. 3. Вы не теряете жесткую отдачу от $ _, поэтому ни один из ваших хеш-элементов поиска не будет совпадать. 4. Вы не можете назначить $ hash {$ city} из разделения (вот почему вы видите предыдущие значения - попробуйте изменить его на что-нибудь другое, например $ state). 5. Ваше присвоение хэша не обязательно должно быть внутри цикла.
например ($name, $city,$state) = split(",",$_);
Можете ли вы тогда опубликовать программу, которая делает то, что вы говорите? Трудно понять почему, поскольку опубликованный код ничего из этого не делает. Как только вы покажете реальную программу, мы сможем ее исправить.
Подумайте только, каково значение $city, когда вы назначаете $hash{$city}? Это значение, которое он имел в предыдущей итерации цикла, или значение, присвоенное предыдущему элементу $city после разделения. Это неоднозначно, и я не думаю, что кто-то сможет предсказать, какую ценность это будет иметь. $ city изменяется в той же строке, в которой вы его используете для поиска.
И я бы рекомендовал прочитать о жестких возвратах ("\ n"). Последнее значение в каждой строке по-прежнему является жестким возвратом, который используется в ключе $ city, когда вы пытаетесь найти «состояние», которое будет оцениваться как undef.
Единственная причина, по которой у вас есть $ hash {$ city} для возврата чего-либо, кроме undef, заключается в том, что вы назначили его во втором вызове для split, потому что он не получил определенного значения при первой установке.
@zdim - это для редактирования и публикации окончательного решения. Я все еще привыкаю к тому, как использовать переполнение стека. Еще раз признателен за всю помощь, которую вы и другие оказали здесь. Еще раз спасибо!
@zdim - Да, это опечатка. Я имел ввиду спасибо. Не стесняйтесь удалять любые комментарии, которые здесь не служат





while (<>)читает все строки из всех входных файлов, но здесь вы устанавливаете жестко запрограммированный%hashвнутри и не используете фактический ввод. Я вижу, что это определенная демонстрация проблемы, но это не сработает. Я предлагаю: вместо этого поместите свой реальный код (сокращенный для короткого примера), который действительно читает из файлов, и используйте его с коротким образцом файла, который вы также показываете здесь. (Другая проблема:$stateне устанавливается нигде в этом фрагменте кода.)