\ n不工作。新行在Perl脚本中不起作用

时间:2015-11-04 10:16:29

标签: perl

这里我写了Perl代码,但在if条件下,使用\n新行字符不匹配。

#!/usr/bin/perl
use strict;

#use warnings;
use Cwd;
use File::Basename;
use File::Copy;

my $path = getcwd;

#print $path."\n";
opendir( INP, "$path\/" );
my @out = grep( /.(xml)$/, readdir(INP) );
close INP;

#print @out;
open( F6, ">Log.txt" );
foreach my $f1 (@out) {
    open( FF, "<$path\/$f1" ) or die "Cannot open file: $out[0]";
    my $data1 = join( "", <FF> );
    my @FILE_KA_ARRAY = split( /\n/, $data1 );
    my $file_ka_len = @FILE_KA_ARRAY;

    #print F6 $file_ka_len."\n";
    #print F6 $f."\t".$file_ka_len."\n";
    print F6 $f1 . "\n";
    for ( my $x = 1; $x < $file_ka_len; $x++ ) {
        my $y             = $x + 1;
        my $temp_file_arr = "";
        $temp_file_arr = $FILE_KA_ARRAY[$x];

        #print F6 $temp_file_arr."\t$x\n";
        my $temp1 = $temp_file_arr;
        if ( $temp1
            =~ m#(<list .*? depth="(\d+)">)\n?(<list .*? depth="(\d+)">)#gs )
        {
            my $list3 = $1;
            print F6 "\t\t\t\t\t\t\t\t" . $y . "\t\t" . $list3 . "\n";
        }
    }
}

1 个答案:

答案 0 :(得分:3)

假设你的问题是:

if($temp1=~m#(<list .*? depth="(\d+)">)\n?(<list .*? depth="(\d+)">)#gs)

然后问题在这里:

my @FILE_KA_ARRAY = split(/\n/, $data1);

因为您的拆分正在移除换行符并将每一行放入数组中。所以当你这样做时:

$temp_file_arr = $FILE_KA_ARRAY[$x];
my $temp1=$temp_file_arr;

您没有换行,因为您的来源中没有换行符。

另外:

  • 不要关闭warnings。如果您有警告修复他们
  • 这看起来像XML。使用解析器。 (虽然我避免XML::Simple - it's nasty
  • 缩进代码是一件好事,因为它有助于澄清您的代码。
  • 如果您使用glob ( "$path/*.xml" )代替readdirgrep,则会获得内置路径列表。