需要检查字符串是否存在。如果没有,请将其写入文本文件

时间:2018-03-11 03:12:18

标签: regex string perl

尝试写入包含名称和序列号列表的文本文件。每一个都将在一个单独的行。如果名称::: number已经存在,它不应该写它,但它似乎找不到已存在的那个,所以它重写它。这是我的代码:

$regfile = "REG/reglist.txt";
$find = $name.":::".$serial."\n";
$index = 0;

open(REG,">>$regfile") or fail();

my @line = <REG>;

foreach $line (@lines) {
    if ($line eq $find) {
        $index++;
    } 
}

if ($index == 0) {
    print REG "$find";
} else { 
    print REG "was already there.\n"; 
}

close(REG);

4 个答案:

答案 0 :(得分:4)

您应该处理两个文件

第一个,用于读取目的($fh_reg on“REG / reglist.txt”)。注意'&lt;'阅读模式:

open my $fh_reg, '<', "REG/reglist.txt" or die $!;

第二个,是用于写入所需输出的临时文件($fh_temp)。 File::Temp模块可能会对您有所帮助:

use File::Temp qw/tempfile/;
# ...
my ($fh_temp, $filename_temp) = tempfile();

最后,rename将此文件作为第一个文件。

rename $filename_temp, "REG/reglist.txt";

答案 1 :(得分:2)

您正在尝试从已打开输出的文件句柄REG中读取

您还在阅读数组@line,然后使用@lines的内容

必须始终

use strict;
use warnings 'all';

在你编写的每个Perl程序的顶部

答案 2 :(得分:1)

您需要打开文件以进行读/写访问。

注意:'+&lt;'将打开文件进行更新。 '+&GT;'将覆盖,并将击败你正在尝试的东西。

以下编辑应该这样做:

open(REG,"+<$regfile") or fail();

答案 3 :(得分:-1)

在$ regfile之前修复了小于符号后,我发现它只是一个错字。我正在声明 @line ,但试图读取数组 @lines 。现在工作。谢谢大家!