Перл Как распечатать хеш с несколькими ключами? -- perl поле с участием hash поле с участием printing пол Связанный проблема

perl how to print out a hash with multiple keys?


2
vote

проблема

русский

Я устанавливаю свой хэш в моей функции как

 <код> $hash{$loginId}{$month}=$hash{$loginId}{$month}+$time1;   

И я могу распечатать значение в одном месте как

 <код> print "$hash{maclawty796}{Sep} "; #just some name and date in the text file i imported   

Но я хочу распечатать все значения. Когда я использую

 <код> print "@{[%hash]} ";   

Я получаю кучу странных результатов и то, что выглядит как адреса памяти. Как я могу распечатать месяцы и раз логида?

Вот полный код, если вам это нужно

 <код> # #  adapted from regex9.pl #  $file ='timelog.txt'; open(INFO, $file) or die("Could not open  file.");   use strict;  my ($loginId, $month, $time1, $time2, $pts, $line, $time1T, $time2T); my %hash=();   while  (<INFO>) { $line=$_; #assignment of Login ID's if( ($loginId) = /([a-y]*(d|w)*)/ ){ printf("%-15s", $loginId); }  if( ($month) = /((Jan)|(Fed)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))/ ){ printf("%-5s", $month); }  if(($time1, $time1T, $time2,$time2T)= /(dd):(dd)s-s(dd):(dd)/ ){ #print($time1, " ", $time1T, " ", $time2," ", $time2T," "); #for testing $time1=($time2*60+$time2T)-($time1*60+$time1T); printf ("%-5s minutes " ,$time1); }  $hash{$loginId}{$month}=$hash{$loginId}{$month}+$time1; print "hash $hash{$loginId}{$month} ";  }  print "@{[%hash]} "; print "$hash{maclawty796}{Sep} ";   
Английский оригинал

i'm setting my hash in my function as

$hash{$loginId}{$month}=$hash{$loginId}{$month}+$time1; 

and I can print the value in one spot as

print "$hash{maclawty796}{Sep} "; #just some name and date in the text file i imported 

But I want to print out all the values. When i use

print "@{[%hash]} "; 

I get a bunch of weird results and what looks like memory addresses. How can i print out the loginId's Months and times?

Here's the full code if you need it

# #  adapted from regex9.pl #  $file ='timelog.txt'; open(INFO, $file) or die("Could not open  file.");   use strict;  my ($loginId, $month, $time1, $time2, $pts, $line, $time1T, $time2T); my %hash=();   while  (<INFO>) { $line=$_; #assignment of Login ID's if( ($loginId) = /([a-y]*(d|w)*)/ ){ printf("%-15s", $loginId); }  if( ($month) = /((Jan)|(Fed)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))/ ){ printf("%-5s", $month); }  if(($time1, $time1T, $time2,$time2T)= /(dd):(dd)s-s(dd):(dd)/ ){ #print($time1, " ", $time1T, " ", $time2," ", $time2T," "); #for testing $time1=($time2*60+$time2T)-($time1*60+$time1T); printf ("%-5s minutes " ,$time1); }  $hash{$loginId}{$month}=$hash{$loginId}{$month}+$time1; print "hash $hash{$loginId}{$month} ";  }  print "@{[%hash]} "; print "$hash{maclawty796}{Sep} "; 
</div
        
 
 

Список ответов

3
 
vote
vote
Лучший ответ
 

Значения в <Код> make_interval()0 - это ссылки на другие хэши. Если вы хотите распечатать клавиши и значения этих хэшей, вам придется проинструктировать Perl сделать это.

 <код> make_interval()1  
 

The values in %hash are references to other hashes. If you want to print the keys and values of those hashes, you'll have to instruct Perl to do so.

for my $loginId (keys(%hash)) {    for my $month (keys(%{ $hash{$loginID} })) {       print("$loginID $month $hash{$loginID}{$month} ");    } } 
</div
 
 
2
 
vote

хеш не может иметь несколько клавиш . У HASH имеет только один уровень ключей, но значения этих клавиш могут указывать на другие хэши.

У вас есть хеш под названием %hash , который является ключом <код> $loginId . Значения в этом хэш-мочке на другие хэши (каждое значение - это полностью отдельный хэш), которые все ключятся <код> $month . Это важный момент, чтобы понять.

Я нахожу, что могу помочь себе помнить это, используя <код> -> оператора. Это напоминает мне, что я говорю о ссылках , а не просто другие ключи.

Например, вместо написания этого:

 <код> $hash{$loginId}{$month} = $hash{$loginId}{$month} + $time1;   

Я бы написал это:

 <код> $hash{$loginId}->{$month} = $hash{$loginId}->{$month} + $time1;   

Это не так много, но это хорошее напоминание о том, что $month - это ключевые ссылки на ссылку HASH , и мне нужно разымевать, что Hash, прежде чем я смогу увидеть его значения.

Давайте сделаем простую петлю, которая печатает <код> %hash :

 <код> for my $loginId ( sort keys %hash ) {     print qq($hash{$loginId} = "$hash{$loginId}" "; }   

Это распечатает что-то вроде этого:

 <код> $hash{bob} = "HASH(0x7f8e3b804ee8)" $hash{david} = "HASH(0x...)" $hash{sue} = "HASH(0x...)"   

<Код> $loginId0 - адресованы к хеш-справочнику. Мне нужно dereference , что hash, чтобы получить значения:

 <код> $loginId1  

Теперь, что я развесил хеш, я могу распечатать месяцы для каждого пользователя:

 <код> $loginId2  

Кстати, нет причин, по которой я не мог комбинировать ссылку с внутренним для цикла:

 <код> $loginId3  

Похоже, вы пытались быстрый свалку всех ваших данных. Для этого вы можете использовать Данные :: DUMPER Модуль:

 <код> $loginId4  
 

A hash can't have multiple keys. A hash only has a single level of keys, but the values of those keys can point to other hashes.

You have a hash called %hash that is keyed by $loginId. The values in this hash point to other hashes (each value is a completely separate hash) that are all keyed by $month. It's an important point to understand.

I find that I can help myself remember this by using the -> operator. This reminds me I'm talking about references and not merely other keys.

For example, instead of writing this:

$hash{$loginId}{$month} = $hash{$loginId}{$month} + $time1; 

I would have write this:

$hash{$loginId}->{$month} = $hash{$loginId}->{$month} + $time1; 

It's not much, but it's a good reminder that $month are keys to a hash reference and I need to dereference that hash before I can see its values.

Let's take a simple loop that prints out %hash:

for my $loginId ( sort keys %hash ) {     print qq($hash{$loginId} = "$hash{$loginId}" "; } 

This will print out something like this:

$hash{bob} = "HASH(0x7f8e3b804ee8)" $hash{david} = "HASH(0x...)" $hash{sue} = "HASH(0x...)" 

The HASH{0x...) are addresses to a hash reference. I need to dereference that hash to get the values:

for my $loginId ( sort keys %hash ) {     my %months = %{ $hash{$loginId) };  # Dereferencing the hash; } 

Now, that I've dereferenced the hash, I can print out the months for each user:

for my $loginId ( sort keys %hash ) {     my %months = %{ $hash{$loginId) };     for my $month ( sort keys %months ) {         print qq($hash{$loginId}->{$month} = ) . $hash{$loginId}->{$month} . " ";     } } 

By the way, there's no reason I couldn't combine the referencing with the inner for loop:

for my $loginId ( sort keys %hash ) {     for my $month ( sort keys %{ $hash{$loginId) } ) {         print qq($hash{$loginId}->{$month} = ) . $hash{$loginId}->{$month} . " ";     } } 

It looks like you were trying for a quick dump of all of your data. To do that, you can use the Data::Dumper module:

use strict; use warnings; use feature qw(say);  # Better way to print than print  use Data::Dumper;  .... say Dumper %hash;  #Prints out the entire data structure. 
</div
 
 

Связанный проблема

28  Как я могу использовать первую букву каждого слова в строке в Perl?  ( How can i capitalize the first letter of each word in a string in perl ) 
Какой самый простой способ извлечь выгоду из первой буквы в каждом слове строки? ...

0  Заменив хеш-имя со скалярным в Perl  ( Replacing hash name with scalar in perl ) 
У меня есть хэш: <код> my $normal_hash = {a => '10',}; print $normal_hash; # prints HASH(0x......) Я хочу обратиться к этому хэш следующим образом: <...

3  Perl: Как распечатать следующую строку после сопоставления шаблона?  ( Perl how to print next line after matching a pattern ) 
Я хотел бы распечатать определенные данные после сопоставления шаблона или строки. У меня есть такой файл: <код> #****************************** List : ...

19  Как я могу получить простоту PHP (развертывание), но мощность Perl?  ( How can i get phps deployment simplicity but perls power ) 
Я презираю язык PHP, и я совершенно уверен, что я не одинок. Но великая вещь о PHP - это способ, которым mod_php принимает и скрывает детали образования горы ...

3  Как я могу использовать Perl для проверки программ C?  ( How can i use perl to test c programs ) 
Я ищу некоторые учебные пособия, показывающие, как я могу проверить программы C, написав программы Perl для автоматизации тестирования. В основном я хочу из...

0  Импорт свободно структурированных данных в базу данных  ( Importing loosely structured data into database ) 
Я получаю ежедневные каналы передачи данных с данными, которые просто структурированы. Мне нужно импортировать его в базу данных, поэтому я могу запустить отч...

2  Как сделать переводчик Mod_Perl Sticky по некоторым конвенциям?  ( How to make a mod perl interpreter sticky by some conventions ) 
Как кажется, что mod_perl только удается Perl Переводчики на VHOST Есть любой способ, которым я могу влиять, какой клонированный переводчик MOD_PERL Выбирае...

4  ДБИ :: Реализация CSV на основе SQLite  ( Dbicsv implementation based on sqlite ) 
У меня много текстовых файлов, сравнивая друг друга в «SQL манере». <Код> DBD::CSV , очевидно, хороший выбор, чтобы начать, так как я могу использовать синт...

4  Невозможно получить работу стада Perl  ( Unable to get perls flock working ) 
Я не могу сделать Perl's <код> flock Работа. Я блокирую файл, проверяя возврат, чтобы убедиться, что он на самом деле заблокирован, и я все еще могу открыт...

2  awk или sed csv Манипуляция файлов  ( Awk or sed csv file manipulation ) 
<код> "a004-1b","North","at006754" "a004-1c","south","atytgh0" "a004-1d","east","atrthh" "a010-1a","midwest","atyu" "a010-1b","south","rfg67" Я хочу распе...

3  Ищите функцию, не работающие в Perl  ( Seek function not working in perl ) 
Я попробовал ниже фрагмент кода, и функция поиска, похоже, не работает. <код> funct("ls -ltr /scratch/dummy/dum*"); sub funct { print " Recording "; open(...

0  Проблема Regex Perl, последний символ усеченный  ( Perl regex issue last character truncated ) 
имеют странную проблему с моим регелем. Мое регулярное выражение сокращает последний символ, в приведенном ниже примере его следует вернуть значение 32, но ...

1  Одинокий Perl Regex для удаления сбежал Ampersands изнутри атрибутов Href, но не других  ( Single perl regex for removing escaped ampersands from inside href attributes bu ) 
Это больше вопрос головоломки для моего любопытства, чем что-либо еще. Я ищу единую замену регулярного выражения выражения, которые будут конвертировать сущно...

-1  Порядок персонажей строки в Perl  ( Order of characters of the string in perl ) 
Я хочу написать код, который рассматривает строки с символами в разном порядке, как равный, поскольку в строках помещают такие же символы. Например, предполож...

1  Настройка типа содержимого для файлов .mts  ( Content type setting for mts files ) 
В моем приложении я люблю предоставлять объект загрузки файлов. Как я могу установить типы содержимого для файлов .mts. Например: <код> if ($fileName =~ /...