-2

infile$digitから読み取っていて、 outfileに出力したいと思います。しかし、Perlスクリプトは「グローバルシンボル「$digit」には明示的なパッケージ名が必要です」というエラーを出します。ただし、グローバルに宣言すると、、この値は、 infileから抽出/読み取られた値ではなく、 outfileに出力されます。何をすべきかについて何か提案はありますか?$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

ループ内$digitで withを宣言しないでください。すぐ外側で宣言します: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。ステートメントの$digitprint範囲外であり、それがメッセージの原因です。

これを修正するmy $digitには、while ループの前に宣言するか、グローバルにする our代わりにwith で宣言します。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 に答える