【问题标题】:Perl : Not able to point at the starting using seek function?Perl:用seek函数不能指向启动?
【发布时间】:2021-01-19 03:28:46
【问题描述】:

我试过这段代码。

代码:

use strict;
use warnings;
use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END);

open($file1) # I didn't put full line
open (F_log)

while (my $line = <$file1>) {
    my @fields = split " ", $line;
    my $length = @fields;

    for (my $i=3; $i<5 ;$i+="1") {
        $i_d = $fields[$i];

        last if ($.==1);

        seek F_log, 0, SEEK_SET; # not working
            while(my $LINE = (<F_log>)) { 
                if ($. >= $a ) {
                    if ($LINE =~ /^\s+(\w+)\s\s"(\w+)",/) { 
                    if ($1 eq $i_d) {
                        $fields[$i] = $2;
                        last;   
                    }
                    else
                    { 
                        $fields[$i] = "Error:$i_d";

                    };
                };
            };  
        }; 
    };
}
close
close

我想在每次循环增量时阅读整个&lt;F_log&gt;。我尝试了在while循环中打开/关闭文件的其他方法,它可以工作,但我认为这会增加脚本的运行时内存(不确定)。所以现在我试图将指针重置为开始但它不起作用。任何人都可以提出任何建议吗?而且,如果有人告诉所有事情会增加脚本的运行时内存。谢谢你

【问题讨论】:

标签: arrays regex perl


【解决方案1】:

我认为实际的错误可能是使用$. 作为行号。没有办法知道seek 知道你在哪一行寻找,所以seek 不会改变$.。它一直在上升。

在seek 的这种特殊用法中,您知道自己回到了第一行之前。尝试在搜索后使用$. = 0;。


示范

a.pl:

use strict;
use warnings;

use Fcntl qw( SEEK_SET );

open(my $fh, "<", "a.txt") or die $!;
while (<$fh>) {
   print "$.: $_";
}

seek($fh, 0, SEEK_SET) or die $!;
$. = 0 if $ARGV[0];

while (<$fh>) {
   print "$.: $_";
}

a.txt:

a
b
c

输出:

$ perl a.pl 0
1: a
2: b
3: c
4: a
5: b
6: c

$ perl a.pl 1
1: a
2: b
3: c
1: a
2: b
3: c

【讨论】:

  • 但是我们写seek($fh, 0, SEEK_SET)这应该设置指针开始然后为什么我们要$.=0?我不明白这个。
  • 我的代码也是我的代码,我正在使用while循环读取两个文件,一个在另一个里面所以如果我写$.=0在寻找为什么/如何改变&lt;F_log&gt;而不是@987654335的指针@?
  • 将seek 设置为$. 用于一组非常具体的输入而没有其他输入是没有意义的。那将是更令人困惑的界面。
  • 来自 perlvar,“当从文件句柄中读取一行时(通过 readline() 或 &lt;&gt;),或者当在其上调用 tell() 或 seek() 时,$. 变为该文件句柄的行计数器的别名。”因此,如果您查找,$. 将成为传递给 seek 的句柄的别名,因此分配给 $. 将影响该句柄的行计数器。
猜你喜欢
  • 2013-02-19
  • 2018-01-22
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多