【发布时间】:2014-12-23 02:18:06
【问题描述】:
这里是超级小白。
试图让$cssurl 打印到文件与终端,但只在文件中打印一个值与打印所有内容的终端。我需要如何修改下面的代码才能得到我需要的东西?
代码如下:
use lib '/Users/lialin/perl5/lib/perl5';
use strict;
use warnings;
use feature 'say';
use File::Slurp 'slurp'; # makes it easy to read files.
use Mojo;
use Mojo::UserAgent;
use URI;
my $calls_dir = "Ask/";
opendir( my $search_dir, $calls_dir ) or die "$!\n";
my @html_files = grep /\.html$/i, readdir $search_dir;
closedir $search_dir;
#print "Got ", scalar @files, " files\n";
foreach my $html_files (@html_files) {
my %seen = ();
my $current_file = $calls_dir . $html_files;
open my $FILE, '<', $current_file or die "$html_files: $!\n";
my $dom = Mojo::DOM->new( scalar slurp $calls_dir . $html_files );
print $calls_dir . $html_files;
for my $csshref ( $dom->find('a[href]')->attr('href')->each ) {
my $cssurl = URI->new($csshref)->abs( $calls_dir . $html_files );
open my $fh, '>', "Ask/${html_files}.result.txt" or die $!;
$fh->print("$html_files\n");
$fh->print("$cssurl\n");
#$fh->print("\t"."$_\n");
print "$cssurl\n";
#print $file."\t"."$_\n";
}
}
在终端我得到这个:
http://www.scigene.com/
about 500 of other urls in here that stack overflow won't let me post
http://feedback.ask.com
写入文件我得到这个:
Agilent_Technologies_ask.html
http://feedback.ask.com
所以我只得到最后一行。
【问题讨论】:
-
一个你需要的例子会很有用。
-
如果我在终端运行上面的脚本,我会得到这个:scigene.comscigene.com/contact.phpscigene.com/cms.php?mlink=Ordering&mlinkid=31&cmsid=84scigene.com/cms.php?mlink=Corporate&mlinkid=29&cmsid=73scigene.com/cms.php?mlinkid=43&mlink=Support&cmsid=81scigene.com/cms.php?mlinkid=29&mlink=Corporate&cmsid=72-在文件中我只是得到这个-Agilent_Technologies_ask.html feedback.ask.com
-
您正在循环内以写入模式 (
>) 打开文件,这将在每次迭代时截断文件。您应该在循环之前打开文件。详情请见perldoc -f open。 -
您始终可以使用 shell 重定向:
perl script.pl > output.txt -
@johnsmith 为每一行额外的输出重新打开文件不会很有效。此外,由于 OP 使用的是词法文件句柄,一旦相应的变量超出范围(即在封闭块的末尾),它们就会自动关闭,因此不必明确地
close它们。不过,如果不关闭所有文件句柄,有些人会觉得很脏;)