Perl 具有哈希枚举的suckrupper

Perl 具有哈希枚举的suckrupper,perl,hash,web-scraping,web-crawler,html-tree,Perl,Hash,Web Scraping,Web Crawler,Html Tree,我有一些代码是我的一个朋友帮助创建的: 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

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

 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  }
我无法理解
33
45
行在做什么。我认为大部分情况下,我了解了其他一切正在做的事情,即
@selects
将网站master.aspx文件中两个select标记中包含的所有内容都放在了考虑范围内--我认为
@selects
的大小是2。我还得到,从这一点开始,
@selects
的第0个槽被传递到
@quarters
,同样,位置1槽被传递到@courses。每个唯一匹配项都会被枚举,因此
n
是全年提供的课程总数。现在,我不知道$hash_count正在枚举什么。我怀疑这是因为提供了很多独特的课程,所以as
n
是一种类似动物的东西(伪代码)

我怀疑hash\u count是一种动物

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

  • 第33行将
    $course-$option
    存储为散列中的一个键,1作为其关联值。为什么?哈希提供了一种方便快捷的查找机制。这些值可以存储在一个数组中,但随后的查找(用于测试给定的键之前是否已被看到)不会那么快
  • 第45行是一个语法密集的语句,但它本质上是在散列中存储键的数量。
    keys
    函数返回一个数组,其中包含散列中的所有键。但是,由于分配给它的变量(
    $hash\u count
    )是标量,因此将在标量上下文中计算该数组。在标量上下文中计算的数组只是该数组中的条目数
      • 第33行将
        $course-$option
        存储为散列中的一个键,1作为其关联值。为什么?哈希提供了一种方便快捷的查找机制。这些值可以存储在一个数组中,但随后的查找(用于测试给定的键之前是否已被看到)不会那么快
      • 第45行是一个语法密集的语句,但它本质上是在散列中存储键的数量。
        keys
        函数返回一个数组,其中包含散列中的所有键。但是,由于分配给它的变量(
        $hash\u count
        )是标量,因此将在标量上下文中计算该数组。在标量上下文中计算的数组只是该数组中的条目数

      本例中哈希的目的是确保从正在处理的两个数组中删除重复的

      这是一个基本原则,“散列”是由“课程”和“选项”元素组成的。当有新内容存在时,它会创建一个新条目。当某个值已经存在时,该值将被更新,如下所示:

      $hash{"$course-$option"} = 1;
      
      my $count = keys %hash;
      
      最后,
      keys
      语句获取创建的哈希的所有键。在这个(标量)上下文中,它只返回键的个数,从而返回计数

      my $hash_count = keys %hash;
      
      基本上,代码是删除重复项

      可能会有人建议读一些关于这方面的文章

      但基本情况如下:

      假设我们已经定义了如下哈希:

      my %hash = ( one => 1, two => 2, three => 3 );
      
      $hash["four"] = 4;
      
      ( 'one', 'two', 'three', 'four' )
      
      我们可以像这样为散列分配一个新值:

      my %hash = ( one => 1, two => 2, three => 3 );
      
      $hash["four"] = 4;
      
      ( 'one', 'two', 'three', 'four' )
      
      新的内容将是:

      ( one => 1, two => 2, three => 3, four => 4 )
      
      但是如果使用一个已经“存在”的“密钥”,就像这样

      $hash["two"] = 5;
      
      结果内容如下所示

      ( one => 1, two => 5, three => 3, four => 4 )
      
      因此,我们不添加额外的条目,现有键只是更新了它的值。“两个”只有一个条目,并且“两个”没有重复的值

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

      my @keys = keys %hash;
      
      这将返回一个如下所示的列表:

      my %hash = ( one => 1, two => 2, three => 3 );
      
      $hash["four"] = 4;
      
      ( 'one', 'two', 'three', 'four' )
      
      它们不会按顺序排列,但只是不让事情复杂化。但是,如果我们不返回将接受列表的内容,如下所示:

      $hash{"$course-$option"} = 1;
      
      my $count = keys %hash;
      
      然后返回的是散列中包含的项数:

      print "$count\n";
      
      将输出
      4
      作为结果


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

      在本例中,哈希的目的是确保从正在处理的两个数组中删除重复项

      这是一个基本原则,“散列”是由“课程”和“选项”元素组成的。当有新内容存在时,它会创建一个新条目。当某个值已经存在时,该值将被更新,如下所示:

      $hash{"$course-$option"} = 1;
      
      my $count = keys %hash;
      
      最后,
      keys
      语句获取创建的哈希的所有键。在这个(标量)上下文中,它只返回键的个数,从而返回计数

      my $hash_count = keys %hash;
      
      基本上,代码是删除重复项

      可能会有人建议读一些关于这方面的文章

      但基本情况如下:

      假设我们已经定义了如下哈希:

      my %hash = ( one => 1, two => 2, three => 3 );
      
      $hash["four"] = 4;
      
      ( 'one', 'two', 'three', 'four' )
      
      我们可以像这样为散列分配一个新值:

      my %hash = ( one => 1, two => 2, three => 3 );
      
      $hash["four"] = 4;
      
      ( 'one', 'two', 'three', 'four' )
      
      新的内容将是:

      ( one => 1, two => 2, three => 3, four => 4 )
      
      但是如果使用一个已经“存在”的“密钥”,就像这样

      $hash["two"] = 5;
      
      结果内容如下所示

      ( one => 1, two => 5, three => 3, four => 4 )
      
      因此,我们不添加额外的条目,现有键只是更新了它的值。“两个”只有一个条目,并且“两个”没有重复的值

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

      my @keys = keys %hash;
      
      这将返回一个如下所示的列表:

      my %hash = ( one => 1, two => 2, three => 3 );
      
      $hash["four"] = 4;
      
      ( 'one', 'two', 'three', 'four' )
      
      它们不会按顺序排列,但只是不让事情复杂化。B