标签:设置 art gen exists user file async class htm
1. 目录字典 2. HTTP::UserAgent 3. Start创建线程数(也可以用Proc::Async)
先创建一个导入字典的函数:
sub MAIN (Str $dict) { #判断是否是文件 if $dict.IO.f { #不要把文件一次进数组, 一行一行读就行 for $dict.IO.lines -> $line { say $line; } }else { say $dict~‘ Not exists or not a file!‘; #不是文件或不存在就提示 } }
这样我们就能编历一个字典文件。
我们再设置用户传入一个 url或ip:
sub MAIN (Str $ip, Str $dict) { # #判断是否是文件 if $dict.IO.f { #不要把文件一次进数组, 一行一行读就行 for $dict.IO.lines -> $line { #拼接url say $ip~‘/‘~$line; } }else { say $dict~‘ Not exists or not a file!‘; #不是文件或不存在就提示 } }
注意, 这里的 url我们没有检测是否输入合法。我们这里没有写测试函数。
再导入 HTTP::UserAgent 来访问 url:
use HTTP::UserAgent; sub MAIN (Str $ip, Str $dict) { # #判断是否是文件 if $dict.IO.f { #不要把文件一次进数组, 一行一行读就行 for $dict.IO.lines -> $line { #拼接url my $ua = HTTP::UserAgent.new; my $target = $ip~‘/‘~$line; my $html = $ua.get($target); #查看状态码 say $html.status-line; } }else { say $dict~‘ Not exists or not a file!‘; #不是文件或不存在就提示 } }
我们把结果保存到一个文件:
use HTTP::UserAgent; my $fp = open ‘result.txt‘, :w; sub MAIN (Str $ip, Str $dict) { # #判断是否是文件 if $dict.IO.f { #不要把文件一次进数组, 一行一行读就行 for $dict.IO.lines -> $line { #拼接url my $ua = HTTP::UserAgent.new; my $target = $ip~‘/‘~$line; say ‘Fetch: ‘~$target; my $html = $ua.get($target); #查看状态码 #say $html.status-line; $fp.say($target => $html.status-line); } }else { say $dict~‘ Not exists or not a file!‘; #不是文件或不存在就提示 } }
我们准备创一个多线程的, 用start包住代码块, 再设置一个数组控制线程数量即可:
use HTTP::UserAgent; my $fp = open ‘result.txt‘, :w; my @threads; #控制线程数目 sub MAIN (Str $ip, Str $dict) { # #判断是否是文件 if $dict.IO.f { #不要把文件一次进数组, 一行一行读就行 for $dict.IO.lines -> $line { push @threads, start { #拼接url my $ua = HTTP::UserAgent.new; my $target = $ip~‘/‘~$line; say ‘Fetch: ‘~$target; my $html = $ua.get($target); #查看状态码 #say $html.status-line; $fp.say($target => $html.status-line); }; #控制线程 数 if @threads == 4 { await @threads; @threads = []; } } }else { say $dict~‘ Not exists or not a file!‘; #不是文件或不存在就提示 }
await @threads; }
现在还有一个问题就是, 文件同时写入保存时, 可能会有问题, 我们最后加一个写 的Lock就行:
未完
标签:设置 art gen exists user file async class htm
原文地址:http://www.cnblogs.com/perl6/p/7447702.html