我有一些代码是我的一个朋友帮助创建的:
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=$optionn";
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 "$tablennnnnnnnnn";
39
40 $n++;
41 }
42 }
43 }
44
45 my $hash_count = keys %hash;
46 print "$n, $hash_countn";
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的槽被传递给@curses。列举了每一个唯一的匹配,因此n
是全年提供的课程总数。现在,我不知道$hash_count在枚举什么。我怀疑这是所提供的独特课程的数量,所以n
是一种类似于(伪代码)的动物
sizeof( ['math1 FALL 2014' , 'math1 SPRING 2014'] ) = 2
我怀疑hash_count
是一种类似的动物
sizeof( ['math1 FALL 2014' , 'math1 SPRING 2014'] ) = 1
对吧?
此实例中哈希的目的是确保从正在处理的两个数组中删除重复的。
这是一个基本原则,"哈希"是用你的"课程"one_answers"选项"元素构建的。当有新的东西出现时,它会创建一个新的条目。当某个东西已经存在时,值就会更新,如下所示:
$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 )
因此,我们不添加额外条目,现有键只是更新了其值。"two"只有一个条目,并且没有重复的值。
在代码的最后部分,我们可以获得散列的键,如下所示:
my @keys = keys %hash;
这将返回一个列表,如下所示:
( 'one', 'two', 'three', 'four' )
他们不会按照这个顺序,但只是为了不让事情复杂化。但是,如果我们不返回到将接受列表的东西,如下所示:
my $count = keys %hash;
然后返回的是哈希中包含的项目数:
print "$countn";
将输出4
作为结果。
代码收集组合的"课程"one_answers"选项"值的唯一出现,通过将其作为键存储在哈希中,使确保它们是唯一的。最后,它将键的计数返回到变量$hash_count
。然后打印结果。
- 第33行将
$course-$option
存储为哈希中的一个键,1作为其关联值。为什么?哈希提供了一种方便快捷的查找机制。这些值本来可以存储在数组中,但随后的查找(以测试是否以前见过给定的键)不会那么快 - 第45行是一个语法密集的语句,但它本质上是在存储散列中的键数。
keys
函数返回一个数组,该数组包含散列中的所有键。但是,由于分配给它的变量($hash_count
)是标量,因此在标量上下文中对数组进行求值。在标量上下文中计算的数组只是该数组中的项数