我的第一个perl脚本:使用“获取($网址)”在一个循环的方法?
题
因此,它似乎很容易。使用一系列的嵌套循环去,虽然一吨的按年/月/日分类网址并下载XML文件。 由于这是我的第一个剧本,我开始与循环;东西在任何语言的熟悉。我跑它只是打印构造的URL和它的工作完美。 然后我写的代码来下载内容,并单独保存,而完美的工作,以及与多个测试用例的样本网址。 但是,当我合并的代码这两位,它打破了,程序只是卡住了,做什么都没有。 因此我跑的调试器,当我通过它台阶,它成为粘在这一个行:
警告::寄存器::进口(/usr/share/perl/5.10/warnings/register.pm:25):25:VEC($警告::位{$ķ},$警告:: LAST_BIT,1 )= 0;
如果我只是打R键从它的工作原理,并继续进行到另一个点上它背下来的调用堆栈有类似的事情发生一遍又一遍了一段时间的方式子程序返回。堆栈跟踪:
$ =警告::寄存器::进口从文件中调用( '警告::寄存器')`/usr/lib/perl/5.10/Socket.pm”线7
$ =插座::从文件中调用BEGIN()`/usr/lib/perl/5.10/Socket.pm”线7
$ = EVAL {...}从文件名为`/usr/lib/perl/5.10/Socket.pm”线7
$ =需要 'Socket.pm' 从文件中调用`/usr/lib/perl/5.10/IO/Socket.pm”线12
从文件中调用$ = IO ::插座:: BEGIN()`/usr/lib/perl/5.10/Socket.pm”线7
$ = EVAL {...}从文件名为`/usr/lib/perl/5.10/Socket.pm”线7
$ =需要 'IO / Socket.pm' 从文件中调用`/usr/share/perl5/LWP/Simple.pm”线158
$ = LWP ::简单:: _ trivial_http_get( 'www.aDatabase.com',80 '/sittings/1987/oct/20.xml')从文件中调用`的/ usr /共享/的perl5 / LWP /简单的.pm”线136
$ = LWP ::简单:: _ GET(' HTTP:// WWW。线 '从文件`xmlfetch.pl称为)' aDatabase.com/1987/oct/20.xml 28
正如你可以看到它正在陷入这种“获得($网址)”方法里面,我不知道为什么? 这是我的代码:
#!/usr/bin/perl
use LWP::Simple;
$urlBase = 'http://www.aDatabase.com/subheading/';
$day=1;
$month=1;
@months=("list of months","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
$year=1987;
$nullXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<nil-classes type=\"array\"/>\n";
while($year<=2006)
{
$month=1;
while($month<=12)
{
$day=1;
while($day<=31)
{
$newUrl = "$urlBase$year/$months[$month]/$day.xml";
$content = get($newUrl);
if($content ne $nullXML)
{
$filename = "$year-$month-$day.xml";
open(FILE, ">$filename");
print FILE $content;
close(FILE);
}
$day++;
}
$month++;
}
$year++;
}
我几乎可以肯定它是微小的东西我只是不知道,但谷歌并没有变成任何东西。
由于提前,
乙
编辑:据官方消息,只是这种方法获取挂起里面永远,运行几个循环然后再次一会儿挂起。但它仍然是一个问题。为什么会出现这种情况?
解决方案
由于 http://www.adatabase.com/1987/oct/20。 XML 是404(而不是从你的程序在路径中产生呢(没有“副标题”的东西),我猜想,是不是你正在使用的真正的链接,这使得它我们很难测试。作为一般规则,请使用example.com,而不是弥补主机名的,这就是为什么它被保留。
您应该真正
use strict;
use warnings;
在你的代码 - 这将有助于突出您的任何范围的问题(我会感到惊讶,如果是这种情况,但有一个机会,LWP代码的一部分,与你的$ urlBase什么乱搞)。我认为它应该是足以改变inital变量声明(和$ NEWURL,$内容和$文件名)把“我”在前面使你的代码严格。
如果使用严格和警告不会让你更接近一个解决方案,你可以警告了你将要使用的每个循环,所以当它坚持,你可以尝试在一个浏览器,看看会发生什么,或者链接使用分组嗅探器(例如的Wireshark )可以给你一些线索。
其他提示
(2006 - 1986) * 12 * 31
是更然后7000 。请求网页没有暂停是不是很好。
略的Perl状更多版本(代码式明智):
#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple qw(get);
my $urlBase = 'http://www.example.com/subheading/';
my @months = qw/jan feb mar apr may jun jul aug sep oct nov dec/;
my $nullXML = <<'NULLXML';
<?xml version="1.0" encoding="UTF-8"?>
<nil-classes type="array"/>
NULLXML
for my $year (1987..2006) {
for my $month (0..$#months) {
for my $day (1..31) {
my $newUrl = "$urlBase$year/$months[$month]/$day.xml";
my $content = "abc"; #XXX get($newUrl);
if ($content ne $nullXML) {
my $filename = "$year-@{[$month+1]}-$day.xml";
open my $fh, ">$filename"
or die "Can't open '$filename': $!";
print $fh $content;
# $fh implicitly closed
}
}
}
}
LWP具有getstore
函数,它大部分的获取,然后保存工作适合你。您可能还检查出 LWP ::并行:: UserAgent的和更多的控制权如何命中远程站点。
我还没有使用Perl,但乍一看,如果抛出异常404错误的结果我想知道。我可以想象该函数将只返回为undef如果HTTP响应是无论是404,403,重定向等等,但也许不是如此。
我可能会建议使用wget这一点。像`wget的$ url`东西,我认为是可行的。
无论如何,正如我所说,我不是一个程序员PRL,但因为你发布的链接,其实是404,这是我的猜测。
让你发现这是问题我知道了。