新手求助,代码问题出在哪里?

新手求助,代码问题出在哪里?

为了下载http://www.additive-net.de/software/origin/origin.tutorials.shtml这里的SWF文件,写了个脚本,但是下载不了,我是新手,请各位给予指点迷津,非常感谢!

use LWP::UserAgent;
$ua = LWP::UserAgent->new;

$url="http://www.additive-net.de/software/origin/origin.tutorials.shtml";
$res = $ua->get($url);
$html = $res->content;
$html=~m%<param name=movie value=\"(.*?)\.swf\">%g;
#<param name=movie value="http://www.originlab.com/ftp/mm_tutorials/import_wizard75.swf">

while ($1){

$up="$1.swf\n";
$dir="C:\\$1.swf";
$res1 = $ua->get($up, ':content_file' => $dir);

}


[Copy to clipboard] [ - ]
CODE:
while ( $1)
...

这个是死循环吧
而且你抓取的网页不正确
你那表达式根本匹配不到任何东西
你首先要分析你抓取文件里面的shtml文件
然后再抓取此文件,swf的具体路径是包含在这些子shtml文件里面的


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $url="http://www.additive-net.de/software/origin/origin.tutorials.shtml";
my $res = $ua->get($url);
my $html = $res->content;
my $dir = "c:\\swf";
my @html = $html =~ /<td class="tabgrau"><a href="([^"]+)"/g;
foreach ( @html ) {
                                $res = $ua->get("http://www.additive-net.de/software/origin/".$_);
                                my $message = $res->content;
                                my $swf = $1 if $message =~ /<embed src="([^"]+)"/;
                                my $name = $1 if $swf =~ m#/([^/]+)$#;
                                print "Downloading $swf\n" ;
                                $res = $ua->get($swf,":content_file" => $dir."\\".$name);
                                print "Successfully downloaded $name\n" if $res->is_success;
}

多谢churchmice 大侠的热情帮助。。

my $name = $1 if $swf =~ m#/([^/]+)$#;

这个正则如何理解?


[Copy to clipboard] [ - ]
CODE:
my $name = $1 if $swf =~ m#/([^/]+)$#

这个匹配定界符是##,所以里面的/没有特殊意义,
$代表末尾,[^/]表示匹配的内容为除/以外的任何字符
类似于basename的功能,就是把
a/b/c/d
中的d给提取出来
非常感谢churchmice 大牛醍醐灌顶的指点迷津!
my $name = $1 if $swf =~ m#/([^/]+)$#
这个基本理解了,还有个小问题,我去掉前面的“/”,代码运行也正常,这个符号加在这里有什么好处么?或者是程序更易懂?
其实运行起来没有区别
但是还是建议加上
否则如果正则引擎内部没有给你优化的话会在每一个不是/的地方开始匹配
而如果有/限制的话只会在/的地方开始匹配
你可以看下面的代码

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my $string = "ab/cd/ef";
print "With / \n";
$string =~ m#(?{print "Staring match at $`|$'\n"})/([^/]+)$#;
print "Without /\n";
$string =~ m#(?{print "Staring match at $`|$'\n"})([^/]+)$#;

运行结果

QUOTE:
With /
Staring match at ab|/cd/ef
Staring match at ab/cd|/ef
Without /
Staring match at |ab/cd/ef
Staring match at a|b/cd/ef
Staring match at ab/|cd/ef
Staring match at ab/c|d/ef
Staring match at ab/cd/|ef

可以看到两者的区别,如果使用了/,则匹配次数从6减为2,从而提高了效率
当然,功能是第一位的,如果能够优化一下就更好了
多谢了,讲解的清楚透彻,受益匪浅!
高手真多。..受益匪浅!