将If语句变量写入新文件

时间:2016-08-29 11:53:32

标签: perl

我正在尝试将if语句@Autowired private ArticleRepository ar; @RequestMapping(value="/article/{id}/{ignored}") @ResponseBody public Article getByIdAndIgnorePermalink(@PathVariable String id, @PathVariable String ignored){ return ar.getById(id); } @RequestMapping(value="/article/{title}.html") @ResponseBody public Article getByPermalink(@PathVariable String permalink){ return ar.getByPermalink(permalink); } 中定义的变量发送到新文件。代码似乎是正确的,但我知道它没有用,因为文件没有被创建。

数据文件示例:

$abc

Perl代码:

bos,control,x1,x2,29AUG2016,y1,y2,76.4
bos,control,x2,x3,30AUG2016,y2,y3,78.9
bos,control,x3,x4,01SEP2016,y3,y4,72.5
bos,control,x4,x5,02SEP2016,y4,y5,80.5

3 个答案:

答案 0 :(得分:4)

在你的代码中,你有一些可能出错的奇怪事情。

my $abc = print "$var1,$var2,$var3\n" if ($var1 =~ "c01" && $var2 =~ "$newdate");
  • print将返回成功,其作为1。因此,您将字符串打印到STDOUT,然后将1分配给新的词法变量$abc$abc现在是1
  • 所有这一切只有在满足条件时才会发生。不要做有条件的任务。此行为是 undefined 。因此,如果条件为false,则$abc可能为undef。或者是其他东西。谁知道?
open my $abc, '>', '/home/.../.../newfile.txt';
close $abc;
  • 您正在打开一个名为$abc的新文件句柄。 my将重新声明它。如果你的代码中有use warnings,那么你会得到警告。它还会使用新的文件句柄对象覆盖旧的$abc
  • 您不会向文件写任何内容
  • ...是奇怪的foldernames,但这可能只是你的例子的混淆

我认为你真正想做的是:

use strict;
use warnings 'all';

# ...

open my $fh, '<', $filename or die $!;
while ( my $line = <$fh> ) {
    chomp $line;

    my @fields = split( ',', $line );

    my $site = $fields[0];
    my $var1 = $fields[1];
    my $var2 = $fields[4];
    my $var3 = $fields[7];

    open my $fh_out, '>', '/home/.../.../newfile.txt';
    print $fh_out "$var1,$var2,$var3\n" if ( $var1 =~ "c01" && $var2 =~ "$newdate" );
    close $fh_out;
}
close $fh;

根本不需要$abc变量。您只需打印到可以写作的新文件句柄$fh_out

请注意,每次在newfile.txt内的一行中匹配时,您都会覆盖$filename文件。

答案 1 :(得分:2)

您当前的代码:

  1. 打印字符串
  2. 将打印结果分配给变量
  3. 立即用文件句柄覆盖该变量(假设open成功)
  4. 关闭该文件句柄而不使用它
  5. 你的逻辑看起来应该更像这样:

    if ( $var1 =~ "c01" && $var2 =~ "$newdate" ) {
        my $abc = "$var1,$var2,$var3\n"
        open (my $file, '>', '/home/.../.../newfile.txt') || die("Could not open file: " . $!);
        print $file $abc;
        close $file;
    }
    

答案 2 :(得分:0)

您的代码存在许多问题。除了别人提到的之外

  • 每次找到匹配的输入行时,都会创建一个新的输出文件。这将使文件只包含 last 打印的字符串

  • 您的测试会检查第二列中的文本是否包含c01,但示例输入中的所有行都在第二列中有control,因此不会打印任何内容

  • 我猜你要测试字符串相等,在这种情况下你需要eq而不是=~来做正则表达式模式匹配

我认为它看起来应该更像这样

use strict;
use warnings 'all';

use POSIX 'strftime';

my $currdate = uc strftime '%d%b%Y', localtime;

my ($input, $output) = qw/ data.txt newfile.txt /;

open my $fh,     '<', $input  or die qq{Unable to open "$input" for input: $!};
open my $out_fh, '>', $output or die qq{Unable to open "$output" for output: $!};

while ( <$fh> ) {
  chomp;

  my @fields = split /,/;
  my ($site, $var1, $var2, $var3) = @fields[0,1,4,7];

  next unless $var1 eq 'c01' and $var2 eq $currdate;

  print $out_fh "$var1,$var2,$var3\n";
}

close $out_fh or die $!;