写入文件多行字符串变量

时间:2015-01-29 15:03:48

标签: regex perl

我正在尝试在两个标签之间提取文本文件的内容,并将其存储到另一个文件中。

我设法将输入文件转换为多行字符串变量,然后成功使用regexp来获取我想要的变量。

但我无法将我的变量写入文件,我认为这是因为内部有多个\ n的字符串类型。

我将不胜感激任何帮助。 (这是我的第一个Perl脚本......)

对于测试,我使用index.html文件,但可以是任何文本文件。

编辑:已解决,请参阅评论中的更正

下面是我记录的代码:

# Extract string between two tags

use strict;
use warnings;

my $inputfile = "";
my $outputfile = "";

# Parse Macro Arguments arguments
if(@ARGV < 2)
{
    print "Usage: perl Macro_name.pl <inputfile.HTML> <outfile.HTML>\n";
    exit(1);
}

$inputfile = $ARGV[0];
$outputfile = $ARGV[1];


my $body="";

# Convert input file to multiple line string #
$body = File_to_Var_Multi_Line($inputfile);

# First tag & Second tag match
if ( $body =~ /(.*)<body(.*?)>(.*)<\/body>/s )     
{                                     # error :
    my $body = $3;                    # $body is local here
                                      # correction :
    #Print to check if extract ok     # declare another variable outside if
    print $body, "\n";
}

# Write to file my match multiple line string #
open(my $fh_body, '>:encoding(UTF-8)', $outputfile) 
or die "Could not open file '$outputfile' $!";

print $fh_body "$body\n";

close $fh_body;

# sub #
sub File_to_Var_Multi_Line
{
    if(@_ < 1)
    {
        print "Usage: line=File_to_Var_Multi_Line<file>\n";
        exit(1);
    }

    my $inputfile_2 = "";
    $inputfile_2 = $_[0];

    open(my $fl_in, '<:encoding(UTF-8)', $inputfile_2)
    or die "Could not open file '$inputfile_2' $!";

    my $line = "";
    my $row_2 = "";

    while (my $row_2 = <$fl_in>)
    {
        $line .= $row_2;
    }
    return $line
}

输入测试文件:

<html>
<body>
<a href="page1.html">page 1</a><br>
<a href="page2.html">page 2</a><br>
<a href="page3.html">page 3</a><br>
<a href="page4.html">page 4</a><br>
<a href="page5.html">page 5</a><br>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

尽管RegEx match open tags except XHTML self-contained tags

您可能会发现&#39;范围运营商&#39;用于迭代文件。

例如:

while ( <$fl_in> ) {
    if ( m,<BODY>,i .. m,</BODY>,i ) { 
        print;
    }
}

条件是真的,如果你在&#39;体内&#39;标签。 (虽然它是以线为导向的,所以尾随的东西会被抓住了#39;)。