如何在Perl中进行散列

如何在Perl中进行散列,perl,hash,Perl,Hash,我在一个日志文件中找到了uniques URL以及可以使用$line[7]获得的响应戳。我正在使用哈希来获取唯一的URL 如何获取唯一URL的计数? 如何获得平均响应时间和唯一URL的计数? 下面的代码,我得到 url1 url2 url3 但是我想要它连同每个URL的平均响应时间和计数 URL Av.RT Count url1 10.5 125 url2 9.3 356 url3 7.8 98 代码: 在哈希目录中存储listref: $

我在一个日志文件中找到了uniques URL以及可以使用$line[7]获得的响应戳。我正在使用哈希来获取唯一的URL

如何获取唯一URL的计数? 如何获得平均响应时间和唯一URL的计数? 下面的代码,我得到

url1
url2
url3
但是我想要它连同每个URL的平均响应时间和计数

URL     Av.RT   Count
url1    10.5    125
url2    9.3     356
url3    7.8     98
代码:


在哈希目录中存储listref:

$uniqueURLs{$line[9]} = [ <avg response time>, <count> ];
要打印结果,请执行以下操作:

# Go through the hash table and print the keys
# which are the unique IPs
for $url (keys %uniqueURLs) {
    printf ( "%s %f %d\n", $url, $uniqueURLs{$url}->[0], $uniqueURLs{$url}->[1]);
}

添加0.0将保证从字符串到浮点的类型强制作为保护措施。

在哈希目录中存储listref:

$uniqueURLs{$line[9]} = [ <avg response time>, <count> ];
要打印结果,请执行以下操作:

# Go through the hash table and print the keys
# which are the unique IPs
for $url (keys %uniqueURLs) {
    printf ( "%s %f %d\n", $url, $uniqueURLs{$url}->[0], $uniqueURLs{$url}->[1]);
}
添加0.0将保证从字符串到浮点的类型强制作为一种保护措施。

请继续阅读。此外,请仔细阅读有助于提高编程技能的内容

您可以将信息存储在这些散列中,而不只是使用唯一URL散列的键。让我们从唯一URL的计数开始:

#!/usr/bin/env perl

use strict;
use warnings;
use autodie;
use feature qw(say);

use constant {
    WEB_FILE => "web1.txt",
};

open my $web_fh, "<", WEBFILE;   #Autodie will catch this for you
my %unique_urls;
while ( my $line = <$web_fh> ) {
    my $url = (split /\s+/, $line)[9];
    if ( not exists $unique_urls{$url} ) {  #Not really needed
        $unique_urls{$url} = 0;
    }
    $unique_urls{$url} += 1;
}
close $web_fh;
然而,人不仅仅是名字。他们有姓氏、电话号码、地址等。让我们看看鲍伯的哈希:

my %bob_hash;
$bob_hash{FIRST_NAME} = "Bob";
$bob_hash{LAST_NAME} = "Jones";
$bob_hash{PHONE} = "555-1234";
我们可以通过在哈希前面加反斜杠来引用它。引用仅是存储此哈希的内存地址:

$bob_reference = \%bob_hash;
print "$bob_reference\n":   # Prints out something like HASH(0x7fbf79004140)
但是,该内存地址是单个项,可以存储在我们的人员数组中

$person[0] = $bob_reference;
如果我们想获得引用中的项,我们可以通过在前面放置正确的数据类型符号来解除引用。因为这是一个散列,所以我们将使用%:

Perl提供了一种使用->语法取消哈希引用的简单方法:

我们将在%unique_URL中使用相同的技术来存储次数和总响应时间。平均值为总时间/次数

#!/usr/bin/env perl

use strict;
use warnings;
use autodie;
use feature qw(say);

use constant {
    WEB_FILE => "web1.txt",
};

open my $web_fh, "<", WEB_FILE;   #Autodie will catch this for you
my %unique_urls;
while ( my $line ( <$web_fh> ) {
    my $url = (split /\s+/, $line)[9];
    my $response_time = (split /\s+/, $line)[10];   #Taking a guess        
    if ( not exists $unique_urls{$url} ) {  #Not really needed
        $unique_urls{$url}->{INSTANCES} = 0;
        $unique_urls{$url}->{TOTAL_RESP_TIME} = 0;
    }
    $unique_urls{$url}->{INSTANCES} += 1;
    $unique_urls{$url}->{TOTAL_RESP_TIME} += $response_time;
}
$close $web_fh;
我喜欢用在桌子上。

请仔细阅读。此外,请仔细阅读有助于提高编程技能的内容

您可以将信息存储在这些散列中,而不只是使用唯一URL散列的键。让我们从唯一URL的计数开始:

#!/usr/bin/env perl

use strict;
use warnings;
use autodie;
use feature qw(say);

use constant {
    WEB_FILE => "web1.txt",
};

open my $web_fh, "<", WEBFILE;   #Autodie will catch this for you
my %unique_urls;
while ( my $line = <$web_fh> ) {
    my $url = (split /\s+/, $line)[9];
    if ( not exists $unique_urls{$url} ) {  #Not really needed
        $unique_urls{$url} = 0;
    }
    $unique_urls{$url} += 1;
}
close $web_fh;
然而,人不仅仅是名字。他们有姓氏、电话号码、地址等。让我们看看鲍伯的哈希:

my %bob_hash;
$bob_hash{FIRST_NAME} = "Bob";
$bob_hash{LAST_NAME} = "Jones";
$bob_hash{PHONE} = "555-1234";
我们可以通过在哈希前面加反斜杠来引用它。引用仅是存储此哈希的内存地址:

$bob_reference = \%bob_hash;
print "$bob_reference\n":   # Prints out something like HASH(0x7fbf79004140)
但是,该内存地址是单个项,可以存储在我们的人员数组中

$person[0] = $bob_reference;
如果我们想获得引用中的项,我们可以通过在前面放置正确的数据类型符号来解除引用。因为这是一个散列,所以我们将使用%:

Perl提供了一种使用->语法取消哈希引用的简单方法:

我们将在%unique_URL中使用相同的技术来存储次数和总响应时间。平均值为总时间/次数

#!/usr/bin/env perl

use strict;
use warnings;
use autodie;
use feature qw(say);

use constant {
    WEB_FILE => "web1.txt",
};

open my $web_fh, "<", WEB_FILE;   #Autodie will catch this for you
my %unique_urls;
while ( my $line ( <$web_fh> ) {
    my $url = (split /\s+/, $line)[9];
    my $response_time = (split /\s+/, $line)[10];   #Taking a guess        
    if ( not exists $unique_urls{$url} ) {  #Not really needed
        $unique_urls{$url}->{INSTANCES} = 0;
        $unique_urls{$url}->{TOTAL_RESP_TIME} = 0;
    }
    $unique_urls{$url}->{INSTANCES} += 1;
    $unique_urls{$url}->{TOTAL_RESP_TIME} += $response_time;
}
$close $web_fh;

我喜欢使用for tables.

而不是在此处将值设置为1:

$uniqueURLs{$line[9]}=1;
存储一个数据结构,指示响应时间和该URL被看到的次数,以便正确计算平均值。如果需要,可以使用数组ref或hashref。如果键还不存在,这意味着它还没有被看到,您可以设置一些初始值

# Initialize 3-element arrayref: [count, total, average]
$uniqueURLS{$line[9]}       = [0, 0, 0] if not exists $uniqueURLS{$line[9]};
$uniqueURLs{$line[9]}->[0]++;           # Count
$uniqueURLs{$line[9]}->[1] += $line[7]; # Total time
# Calculate average
$uniqueURLs{$line[9]}->[2]  = $uniqueURLs{$line[9]}->[1] / $uniqueURLs{$line[9]}->[0];
获得UniqueURL数的一种方法是计算键数:

print scalar(keys %uniqueURLS); # Print number of unique url's
在循环中,您可以打印url和平均时间,如下所示:

for $url (keys %uniqueURLs) {
   print $url, ' - ', $uniqueURLs[$url]->[2], "seconds \n";
}

此处不将值设置为1:

$uniqueURLs{$line[9]}=1;
存储一个数据结构,指示响应时间和该URL被看到的次数,以便正确计算平均值。如果需要,可以使用数组ref或hashref。如果键还不存在,这意味着它还没有被看到,您可以设置一些初始值

# Initialize 3-element arrayref: [count, total, average]
$uniqueURLS{$line[9]}       = [0, 0, 0] if not exists $uniqueURLS{$line[9]};
$uniqueURLs{$line[9]}->[0]++;           # Count
$uniqueURLs{$line[9]}->[1] += $line[7]; # Total time
# Calculate average
$uniqueURLs{$line[9]}->[2]  = $uniqueURLs{$line[9]}->[1] / $uniqueURLs{$line[9]}->[0];
获得UniqueURL数的一种方法是计算键数:

print scalar(keys %uniqueURLS); # Print number of unique url's
在循环中,您可以打印url和平均时间,如下所示:

for $url (keys %uniqueURLs) {
   print $url, ' - ', $uniqueURLs[$url]->[2], "seconds \n";
}

您应该使用缩进,它将使代码更具可读性。此外,你应该始终严格使用;使用警告;为了避免打字错误并获得错误反馈,你应该使用缩进,这会使你的代码更具可读性。此外,你应该始终严格使用;使用警告;为了避免输入错误并获得错误反馈。您好,我尝试了您的建议,但平均响应时间为0,URL计数为1。这是我的tried@user2060430当前位置它适合我。潜在的问题来源:split实际上将正则表达式作为其第一个参数,即.split/[:space:]+/,$;以空格顺序拆分;数组索引的基数为0。您好,我尝试了您的建议,但平均响应时间为0,URL计数为1。这是我的tried@user2060430当前位置它适合我。潜在的问题来源:split实际上将正则表达式作为其第一个参数,即.split/[:space:]+/,$;以空格顺序拆分;数组索引的基数为0。