0

我有一些我的朋友帮助创建的代码:

 1  use LWP::Simple;
 2  use HTML::TreeBuilder;
 3  use Data::Dumper;
 4   
 5  my $tree = url_to_tree( 'http://www.registrar.ucla.edu/schedule/schedulehome.aspx' );
 6   
 7  my @selects  = $tree->look_down( _tag => 'select' );
 8  my @quarters = map { $_->attr( 'value' ) } $selects[0]->look_down( _tag => 'option' );
 9  my @courses  = map { my $s = $_->attr( 'value' ); $s =~ s/&/%26/g; $s =~ s/ /+/g; $s } $selects[1]->look_down( _tag => 'option' );
10   
11  my $n = 0;
12   
13  my %hash;
14   
15  for my $quarter ( @quarters )
16  {
17      for my $course ( @courses )
18      {
19          my $tree_b = url_to_tree( "http://www.registrar.ucla.edu/schedule/crsredir.aspx?termsel=$quarter&subareasel=$course" );
20         
21          my @options = map { my $s = $_->attr( 'value' ); $s =~ s/&/%26/g; $s =~ s/ /+/g; $s } $tree_b->look_down( _tag => 'option' );
22         
23          for my $option ( @options )
24          {
25           
26           
27              print "trying: http://www.registrar.ucla.edu/schedule/detselect.aspx?termsel=$quarter&subareasel=$course&idxcrs=$option\n";
28             
29              my $content = get( "http://www.registrar.ucla.edu/schedule/detselect.aspx?termsel=$quarter&subareasel=$course&idxcrs=$option" );
30             
31              next if $content =~ m/No classes are scheduled for this subject area this quarter/;
32             
33              $hash{"$course-$option"} = 1;
34              #my $tree_c = url_to_tree( "http://www.registrar.ucla.edu/schedule/detselect.aspx?termsel=$quarter&subareasel=$course&idxcrs=$option" );
35             
36              #my $table = ($tree_c->look_down( _tag => 'table' ))[2]->as_HTML;
37             
38              #print "$table\n\n\n\n\n\n\n\n\n\n";
39             
40              $n++;
41          }
42      }
43  }
44   
45  my $hash_count = keys %hash;
46  print "$n, $hash_count\n";
47   
48  sub url_to_tree
49  {
50      my $url = shift;
51     
52      my $content = get( $url );
53   
54      my $tree = HTML::TreeBuilder->new_from_content( $content );
55     
56      return $tree;
57  }

我无法理解线路3345正在做什么。我认为在大多数情况下,我得到了其他所有东西在做的事情,即将@selects网站上的主 .aspx 文件中的两个选择标签中包含的所有内容都放在了考虑范围内——我认为大小@selects是 2。我也得到了从这一点开始,第 0 个插槽@selects被传递到@quarters中,同样,位置 1 插槽被传递到 @courses。每场独特的比赛都会被列举出来,n全年提供的课程总数也是如此。现在,我没有得到 $hash_count 正在枚举的内容。我怀疑这是提供的独特课程的数量,所以n类似于动物的地方(在伪代码中)

sizeof( ['math1 FALL 2014' , 'math1 SPRING 2014'] ) = 2

我怀疑hash_count是一种动物

sizeof( ['math1 FALL 2014' , 'math1 SPRING 2014'] ) = 1

正确的?

4

2 回答 2

3

在这种情况下,哈希的目的是确保从您正在处理的两个数组中删除重复项。

这是一个基本原则,“哈希”是用您的“课程”和“选项”元素构建的。当有新东西出现时,它会创建一个新条目。当某些东西已经存在时,该值将被更新,如下所示:

$hash{"$course-$option"} = 1;

最后,该keys语句获取创建的哈希的所有键。在这个(标量)上下文中,它只返回键的数量,因此是计数。

my $hash_count = keys %hash;

基本上,代码正在删除重复项。

可能会建议阅读一些关于哈希的内容。

但这里是基础知识:

假设我们已经定义了这样的哈希:

my %hash = ( one => 1, two => 2, three => 3 );

我们可以像这样为哈希分配一个新值:

$hash["four"] = 4;

新内容将是:

( one => 1, two => 2, three => 3, four => 4 )

但是如果像这样使用已经“存在”的“密钥”

$hash["two"] = 5;

结果内容将是这样的

( one => 1, two => 5, three => 3, four => 4 )

所以我们不添加额外的条目,现有的键只是更新了它的。“二”只有一个条目,“二”没有重复值。

我们可以在代码的最后部分获取哈希的,如下所示:

my @keys = keys %hash;

这将返回一个如下所示的列表:

( 'one', 'two', 'three', 'four' )

它们不会按那个顺序排列,但只是为了不复杂。但是,如果我们不返回将接受列表的内容,如下所示:

my $count = keys %hash;

然后返回的是哈希中包含的项目数:

print "$count\n";

4作为结果输出。

该代码收集组合“课程”和“选项”值的唯一出现,通过将其存储为哈希中的键来确保它们是唯一的。最后,它会将键的计数返回给您的变量。然后打印结果。$hash_count

于 2014-03-05T06:23:39.067 回答
2
  • 第 33 行$course-$option作为键存储在散列中,其关联值为 1。为什么?哈希为查找提供了一种方便快捷的机制。这些值本来可以存储在一个数组中,但随后的查找(以测试给定的键是否以前见过)几乎不会那么快。
  • 第 45 行是一个语法密集的语句,但它本质上是在散列中存储键的数量。该keys函数返回一个数组,其中包含——你猜对了——散列中的所有键。但是,由于分配给它的变量 ( $hash_count) 是一个标量,因此该数组是在标量上下文中计算的。在标量上下文中评估的数组只是该数组中的条目数。
于 2014-03-05T06:21:31.490 回答