Значение хеш-ключа не извлекается правильно

*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 (/,/,$_)

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

zdim 11.12.2018 22:20

@zdim - Разместил

user3423407 11.12.2018 22:29

@ user3423407 Спасибо - теперь вернитесь и медленно и медленно проверьте то, что вы опубликовали: он не будет печатать то, что вы показываете. Во-первых, это потому, что в строке "$name, $city,$hash{$city}" есть пробел перед $city, поэтому, когда вы ставите split позже через запятую, вы получаете `$ city` (с начальным пробелом), что не является ключом в вашем хэше.

zdim 11.12.2018 22:35

Спасибо @zdim. Я внес это изменение и запустил, но он все еще не распечатал правильную карту. Обратите внимание, что он показывает правильное значение в $ _, то есть значение ключа показывает Джо, Нью-Йорк, Нью-Йорк Мэри, Вашингтон, Вирджиния. Но когда он заканчивает эту строку ($ name, $ city, $ hash {$ city}) = split ( ",", $ _); не уверен, почему он не получает правильное значение ключа

user3423407 11.12.2018 22:46

1. Пробел в строке, вроде упомянутого @zdim. 2. Я ожидаю, что NY => NYC должно быть NYC => NY. 3. Вы не теряете жесткую отдачу от $ _, поэтому ни один из ваших хеш-элементов поиска не будет совпадать. 4. Вы не можете назначить $ hash {$ city} из разделения (вот почему вы видите предыдущие значения - попробуйте изменить его на что-нибудь другое, например $ state). 5. Ваше присвоение хэша не обязательно должно быть внутри цикла.

hepcat72 11.12.2018 22:46

например ($name, $city,$state) = split(",",$_);

hepcat72 11.12.2018 22:47

Можете ли вы тогда опубликовать программу, которая делает то, что вы говорите? Трудно понять почему, поскольку опубликованный код ничего из этого не делает. Как только вы покажете реальную программу, мы сможем ее исправить.

zdim 11.12.2018 22:47

Подумайте только, каково значение $city, когда вы назначаете $hash{$city}? Это значение, которое он имел в предыдущей итерации цикла, или значение, присвоенное предыдущему элементу $city после разделения. Это неоднозначно, и я не думаю, что кто-то сможет предсказать, какую ценность это будет иметь. $ city изменяется в той же строке, в которой вы его используете для поиска.

hepcat72 11.12.2018 22:51

И я бы рекомендовал прочитать о жестких возвратах ("\ n"). Последнее значение в каждой строке по-прежнему является жестким возвратом, который используется в ключе $ city, когда вы пытаетесь найти «состояние», которое будет оцениваться как undef.

hepcat72 11.12.2018 22:53

Единственная причина, по которой у вас есть $ hash {$ city} для возврата чего-либо, кроме undef, заключается в том, что вы назначили его во втором вызове для split, потому что он не получил определенного значения при первой установке.

hepcat72 11.12.2018 22:55

@zdim - это для редактирования и публикации окончательного решения. Я все еще привыкаю к ​​тому, как использовать переполнение стека. Еще раз признателен за всю помощь, которую вы и другие оказали здесь. Еще раз спасибо!

user3423407 15.12.2018 00:58

@zdim - Да, это опечатка. Я имел ввиду спасибо. Не стесняйтесь удалять любые комментарии, которые здесь не служат

user3423407 16.12.2018 18:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
101
0

Другие вопросы по теме