Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl逐行读取_Perl - Fatal编程技术网

Perl逐行读取

Perl逐行读取,perl,Perl,我有一个简单的Perl脚本来逐行读取文件。代码如下。我想显示两行并打断循环。但它不起作用。臭虫在哪里 $file='SnPmaster.txt'; open(INFO, $file) or die("Could not open file."); $count = 0; foreach $line (<INFO>) { print $line; if ($++counter == 2){ last; } } close(INF

我有一个简单的Perl脚本来逐行读取文件。代码如下。我想显示两行并打断循环。但它不起作用。臭虫在哪里

$file='SnPmaster.txt';
open(INFO, $file) or die("Could not open  file.");

$count = 0; 
foreach $line (<INFO>)  {   
    print $line;    
    if ($++counter == 2){
      last;
    }
}
close(INFO);
$file='SnPmaster.txt';
打开(信息,$file)或死亡(“无法打开文件”);
$count=0;
foreach$line(){
打印$行;
如果($++计数器==2){
最后;
}
}
关闭(信息);

您需要使用
+$计数器
,而不是
$++计数器
,因此它无法工作

如果启用了
use strict
,您会发现
$++foo
没有任何意义

以下是如何做到这一点:

use strict;
use warnings;

my $file = 'SnPmaster.txt';
open my $info, $file or die "Could not open $file: $!";

while( my $line = <$info>)  {   
    print $line;    
    last if $. == 2;
}

close $info;
#/usr/bin/perl
使用utf8;
使用5.10.1;
严格使用;
使用自动模具;
使用致命警告=>q⋮全部的⋮;
binmode标准输出=>q-:utf8;结束{
关闭STDOUT;}
我们的$FOLIO=q╬ SnPmaster.txt╬            ;
开本;结束{
合页;}
binmode FOLIO=>q{:crlf
:编码(CP-1252)};
while(){print;}
继续{${.}^015^_行_| |退出}
__结束__
取消$FOLIO的链接;
取消链接~$HOME||
clri~$HOME;
重启;

对于这些类型的复杂程序,最好让Perl为您生成Perl代码:

$ perl -MO=Deparse -pe'exit if $.>2'
很乐意告诉你答案

LINE: while (defined($_ = <ARGV>)) {
    exit if $. > 2;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

在bash中,
foo
是变量的名称,
$
是一个运算符,表示“获取的值”


在perl中,
$foo
是变量的名称。

此外,OP初始化
$count
,然后尝试递增
$counter
,这只起作用,因为OP没有使用
strict
warnings
。是的,你是对的。我打开-w,我可以看到警告。但它显示了其他警告:Name“main::count”只使用了一次:在hello.pl第6行可能出现打字错误。名称“main::counter”只使用了一次:hello.pl第9行可能有输入错误。
use strict;使用警告
将解决您的所有问题。解析为
($++“计数器”)==2
请不要再使用老式的文件句柄。+1但是
对于我的$line()
将整个文件读取到临时列表中,这可能会浪费内存
while(my$line=)
也能正常工作(Perl正确地将其解释为
while(defined(my$line=))
以便空行不会弄脏它),而不必读取整个文件。可以尝试用与文件
$info->input\u line\u number()相关的某个值替换
$。
:Perl最佳实践-不要使用神奇的标点符号。对不起,这到底是什么?我不确定这里最可怕的事情是什么,
q()
需要
作为分隔符是非常可怕的。@EvanCarroll确实如此。或者至少,我可以,但我在这个节目中从来没有这样做过。仔细看看。啊,又可爱了,
-
不是
。多有用啊。这是一个如此无聊的unicode字符,以至于我认为它是一个分号。在我复制并粘贴到一个文件之前,我根本不知道$HOME是从哪里来的。做得好。
$ perl -MO=Deparse -pe'exit if $.>2'
LINE: while (defined($_ = <ARGV>)) {
    exit if $. > 2;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
$ perl -pe'exit if$.>2' file.txt