-2

我正在阅读infile并想将其打印$digitoutfile。但是 Perl 脚本给出了一个错误,提示“全局符号“$digit”需要显式包名”。但是,如果我确实将其声明为 global ,那么 this 值将打印到outfile而不是从infile中提取/读取的值。关于应该做什么的任何建议?$digit=''

这就是我的做法:

    my $digit=''; 
    open (DATA, "</usr/infile") || die "cant open infile\n"; #file from digit has to read

    while (<DATA>){
        ($digit)= $_=~ /\s9\s(\d+)/; #regex to capture digit '234' from ' 9 234'
        if ($digit ne ""){
        print "digit is $digit\n"; # this prints fine
        }
    }

    open (FILE, ">/usr/outfile") || die "cant open outfile\n"; #file to which digit has to be finally written
    print FILE "9   $digit"; #$digit takes in the value declared globally i.e. ''

    close(DATA);
    close (FILE);
4

4 回答 4

2

$digit的范围在 while 循环内,然后您尝试使用以下行在其外部访问它:

print FILE "9   $digit";

您必须在 while 循环之外声明它才能被该行看到。

或者更好的是,在循环之前打开您的输出文件并将数字写入循环内的输出文件,并将$digit变量范围保持在循环内。

如果您只想要与您的正则表达式匹配的最后一个实例,那么:

#!/usr/bin/perl
use strict;

open (DATA, "infile.txt")  || die("cant open infile\n");   

my $digit = "";
while (<DATA>) {
    chomp;
    if (/\s9\s(\d+)/) #regex to capture digit '234' from ' 9 234' 
    {
       print "Found digit is $1\n"; # 
       $digit = $1;
    }
}
close(DATA);

if ($digit ne "") {
open (FILE, ">outfile.txt") || die("cant open outfile\n"); 
print FILE "9   $digit\n";
close(FILE);
}
else
{
    print "No digit found!\n";
}
exit;

如果您想获取 infile 中与您的正则表达式匹配的所有实例,则以下内容应该可以解决问题。

#!/usr/bin/perl
use strict;

open (DATA, "</usr/infile")  || die("cant open infile\n");   
open (FILE, ">/usr/outfile") || die("cant open outfile\n"); 

while (<DATA>) {
    chomp;
    if (/\s9\s(\d+)/) #regex to capture digit '234' from ' 9 234' 
    {
       print "Found digit is $1\n"; # 
       print FILE "9   $1\n";
    }
}


close(DATA);
close (FILE);
exit;
于 2009-08-05T03:03:53.167 回答
2
while (<DATA>){
    my ($digit)= $_=~ /\s9\s(\d+)/; #regex to capture digit '234' from ' 9 234'
    if ($digit ne ""){
    print "digit is $digit\n"; # this prints fine
    }
}

词法变量(用 my 创建的变量)存在于它们声明的范围内,因此每次循环都会创建和销毁 $digit。

于 2009-08-05T03:08:40.803 回答
1

不要在循环中声明$digitwith ;在外面声明它:mywhile()

my $digit;
while( <DATA> ) {
    # stuff that sets $digit... 
}

open( FILE , '>out' );
print FILE $digit;
于 2009-08-05T03:04:41.357 回答
0

您已$digits通过使用声明在 while 循环范围内是本地的my$digit语句中的print超出范围,这就是导致该消息的原因。

要更正此问题,my $digit请在 while 循环之前声明或声明它our而不是my使其成为全局变量。

我会做以下事情:

use strict;
use warnings;

my $digit = "None";  # None if there are no digits found

open (DATA, "</usr/infile") || die "cant open infile\n"; #file from digit has to read
while (<DATA>){    
    ($digit) = $_=~ /\s9\s(\d+)/; #regex to capture digit " 9 234"    
    if ($digit ne ""){    
        print "digit is $digit\n"; # this prints fine    
    }
}
open (FILE, ">/usr/outfile") || die "cant open outfile\n"; #file to which digit has to be finally written
print FILE "9   $digit";
close(DATA);
close(FILE);

如果你没有得到一个数字,你会得到 None $digit

希望这可以帮助。

于 2009-08-05T03:08:33.783 回答