我读$digit从的 INFILE 的并希望将其打印到的 OUTFILE 的。但Perl脚本是给一个错误,说“全局符号‘$数字’需要明确的包名”。但是,如果我做全局声明它,$digit='',则该值将被打印到 OUTFILE 而不是提取的值/从 infile中读取。任何建议,应该怎样做?

这我是怎么做的吧:

    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);
有帮助吗?

解决方案

$digit是while循环内的作用域,然后你想用线来访问它外面:

print FILE "9   $digit";

您必须在while循环外声明它用于这是由该线可见。

或更好,但只要打开你的OUTFILE你循环之前和循环中写的数字发送到outfile中,并保持在循环中的$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;

其他提示

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
    }
}

词汇的变量(与我的创建的那些)声明它们的范围内存在,所以$数字被创建,通过每次循环破坏。

不要用你的$digit循环内my声明while();外面声明它:

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

open( FILE , '>out' );
print FILE $digit;

您已经声明$digits是本地的while循环的利用my范围。在$digit语句print超出范围,这是什么原因造成的消息。

要解决这个问题,while循环之前声明my $digitour代替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);

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

希望这有助于。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top