Perl 将值打印到文件和终端

Perl 将值打印到文件和终端,perl,parsing,printing,Perl,Parsing,Printing,超棒的。 尝试获取打印到文件与终端的$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::Use

超棒的。 尝试获取打印到文件与终端的
$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

所以我只看到最后一行。

您的问题出现了,因为您多次重新打开同一个文件,并且每次打开时都会覆盖该文件的内容。如果从逻辑上考虑,您希望为解析的每个输入文件创建一个输出文件,因此最好在打开输入文件时创建输出文件:

my $dom = Mojo::DOM->new( scalar slurp $calls_dir . $html_files );
open my $fh, '>', "Ask/${html_files}.result.txt" or die $!;
如果有任何材料只需要打印一次(文件头等),则需要在开始循环URL之前进行打印

您的
for
循环现在看起来如下所示:

foreach my $html_files (@html_files) {

    my $dom = Mojo::DOM->new( scalar slurp $calls_dir . $html_files );
    print $calls_dir . $html_files;

    open my $fh, '>', "Ask/${html_files}.result.txt" or die $!;
    $fh->print("$html_files\n");

    for my $csshref ( $dom->find('a[href]')->attr('href')->each ) {
        my $cssurl = URI->new($csshref)->abs( $calls_dir . $html_files );

        $fh->print("$cssurl\n");
        print "$cssurl\n";
    }
}

一个你需要的例子会很有用。如果我在终端中运行上面的脚本,我会得到这样的结果:-在文件中我刚刚得到了这个-Agilent_Technologies_ask.html,你正在循环中以写模式(
)打开你的文件,这将在每次迭代时截断文件。您应该在循环之前打开该文件。有关详细信息,请参阅。您可以始终使用shell重定向:
perl script.pl>output.txt
@johnsmith为每一行额外的输出重新打开文件不会非常有效。此外,由于OP使用的是词法文件句柄,因此当相应的变量超出范围(即在封闭块的末尾)时,它们将自动关闭,因此不必显式地
关闭它们。但是,有些人如果不关闭所有的文件句柄,就会感到脏兮兮的;)