为什么Perl脚本要求“全球宣言”当我宣布的东西循环?
-
22-07-2019 - |
题
我读$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 $digit
或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);
如果你没有得到一个数字,你会得到无为$digit
。
希望这有助于。
不隶属于 StackOverflow