Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl WWW::Mechanize-将HTML解析为基本报告_Arrays_Perl_Report_Nested Loops_Www Mechanize - Fatal编程技术网

Arrays Perl WWW::Mechanize-将HTML解析为基本报告

Arrays Perl WWW::Mechanize-将HTML解析为基本报告,arrays,perl,report,nested-loops,www-mechanize,Arrays,Perl,Report,Nested Loops,Www Mechanize,我有一个脚本,可以下载一个网页,然后将其解析为 像这样的URL列表 <A HREF="wonk?IssuePage&SolutionId=8&RecordId=20193&Template=view&TableId=1023"><B>26165</B></A> <A HREF="wonk?IssuePage&SolutionId=8&RecordId=22163&Template=vie

我有一个脚本,可以下载一个网页,然后将其解析为 像这样的URL列表

<A HREF="wonk?IssuePage&SolutionId=8&RecordId=20193&Template=view&TableId=1023"><B>26165</B></A>
<A HREF="wonk?IssuePage&SolutionId=8&RecordId=22163&Template=view&TableId=1023"><B>29327</B></A>
<A HREF="wonk?IssuePage&SolutionId=8&RecordId=22216&Template=view&TableId=1023"><B>29416</B></A>
<A HREF="wonk?IssuePage&SolutionId=8&RecordId=22238&Template=view&TableId=1023"><B>29450</B></A>
问题是,它只打印项目编号和所有者字段;它不会打印出车票标题

此外,它还为每次迭代打印一次信息——针对它下载的票证中的每一行HTML

这种情况经常发生在我身上:我通常必须将循环移出括号。这就解决了问题,但从一个基本的角度来看,我不明白为什么将它移动到循环的外部会修复它。为什么现在要打印每行HTML

我也不明白为什么没有打印出
$owner
还有什么事吗
?我应该使用另一个
if
语句吗

26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
29327   George Glass
29327   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29753   Herley Lee
29753   Herley Lee  
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
正则表达式很好

bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /<B>Item\sId:\s+?<\/B>(\d{5})/' | sort -u
29871

 bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /<B>Owner:\s<\/B>(.*)<BR>/' | sort -u
Jimmy Jack
bash-3.00$

bash-3.00$  cat /tmp/raw_ticket | perl -nle 'print /<B>Title:\s<\/B>(.*)/' | sort -u
Trade Capture Prod Shadow - Install software on ushs2 - 11/15/13
bash-3.00$
bash-3.00$cat/tmp/raw|u ticket|perl-nle'print/Item\sId:\s+?(\d{5})/'| sort-u
29871
bash-3.00$cat/tmp/raw|u ticket|perl-nle'print/Owner:\s(.*)
/'| sort-u 吉米·杰克 bash-3.00$ bash-3.00$cat/tmp/raw|u ticket|perl-nle'print/Title:\s(.*)/'| sort-u 交易捕获产品影子-在ushs2上安装软件-2013年11月15日 bash-3.00$

我无法附加我试图在这里分解的HTML代码,因为它是HTML,没有格式化。请检查。

我怀疑这是您与if语句进行模式匹配并分配变量$1的方式(代码中的最后一个regex检查/分配错误)。下面是一个示例的测试数据(因此至少会打印票证标题,不确定没有一组URL的循环)

所以我会像这样匹配

use strict;
use warnings; # always use these at top

my$Item\u编号;
我的$Owner;
我的$ticket\u标题;
而(){
我的$line=$\ux;
咀嚼;
$line=~/Item\sId:\s+?(\d{5})/和$Item\u number=$1;
$line=~/Owner:\s(.*)
/和$Owner=$1; $line=~/Title:\s(.*)和$ticket\u Title=$1; } 打印“$Item\u number$Owner$ticket\u title\n”;
代码中还有很多其他问题,但我只是想找出问题所在。当您只需执行一个正则表达式测试时,它就可以正常工作,因此正则表达式在隔离状态下是可以的。当你一个接一个地组合多个正则表达式时,它是不一致的


为了澄清它的工作方式,“and”就像一个快捷方式,因此只有在正则表达式为true的情况下才能执行赋值

如果看不到您正在处理的确切输入,就很难提供帮助。在上一个代码块中,您使用一个文件测试了正则表达式;请发布该文件的内容,而不是一堆可能与您的实际问题无关的WWW::Mechanize代码。如果您创建一个简单的、自包含的示例,那么调试就会容易得多,而且您可能会更快地得到答案(如果您自己在这个过程中没有找到答案的话),但请在程序开始时添加
use strict
use warnings
,并修复由此产生的错误。当你没有使用Perl提供的基本工具时,指望别人的帮助是不公平的。我不得不投票结束你的问题。如果您不能提供一个我们可以运行的程序,并看到您看到的问题,那么我们就无法真正提供帮助。您真的不应该请求帮助来修复此代码。您是通过猜测来组装它的,而这绝不是将程序组装在一起的正确方式。您应该能够解释代码中每一行以及最终每一个字符的行为和用途。“你不能只加一点,然后戳到它合适为止,就好像它是玩Doh一样。”博罗丁-如果你想坐在你的象牙塔里,对着我的剧本大口大口大口大口大口的话-好的。但是,如果您像我一样热爱Perl语言,那么您应该了解一些东西。你可以随心所欲地抱怨像我这样的人,但我是保持这种语言活力的人——而不是你。因为我以工作为生,通过使用Perl,我使它保持了生命力。您是一位专家,但您对新追随者的态度正驱使他们使用更好的语言,如Python。坚持下去,Borodin,总有一天所有Perl代码都会变得干净,就像拉丁语一样——干净、死气沉沉,只在学术界使用。嘿——谢谢——这真是我想要的——关于更好形式的建议。
use strict;
use warnings; # always use these at top
my $Item_number;
my $Owner;
my $ticket_title;

while (<$webpage>) {
    my $line = $_;
    chomp;
    $line =~ /<B>Item\sId:\s+?<\/B>(\d{5})/ and $Item_number = $1;
    $line =~ /<B>Owner:\s<\/B>(.*)<BR>/ and $Owner = $1;
    $line =~ /<B>Title:\s<\/B>(.*)/ and $ticket_title = $1;
}
print "$Item_number   $Owner    $ticket_title\n";