0

フォルダー内の各txtファイルで、文字列「勝利」が最初に出現する行を見つけようとしています。ファイル内の最初の「勝利」ごとに、その行の番号を @num に、ファイル名を @filename に保存したいと思います

例: a.txt という行で始まるファイルの場合: "lalala Victory 123456" -> $num[$i]=123456 and $filename[$i]="a.txt"

ARGV はすべてのファイル名を保持します。私の問題は、行ごとに行こうとしていて、何が間違っているのかわからないことです。もう1つ-最後のファイルで「勝利」の最後の出現を取得するにはどうすればよいですか??

use strict;
use warnings;
use File::Find;

my $dir = "D:/New folder";   
find(sub { if (-f && /\.txt$/) { push @ARGV, $File::Find::name } }, $dir);   $^I = ".bak"; 

my $argvv;
my $counter=0;
my $prev_arg=0;
my $line = 0;

my @filename=0;
my @num=0;
my $i = 0;

foreach $argvv (@ARGV)
{
    #open $line, $argvv or die "Could not open file: $!";
    my $line = IN 
    while (<$line>)
    {
        if (/victory/)
        {
            $line = s/[^0-9]//g;    
            $first_bit[$i] = $line;
            $filename[$i]=$argvv;
            $i++;
            last;
        }

    }
    close $line;
}


for ($i=0; $i<3; $i++)
{
    print $filename[$i]."  ".$num[$i]."\n";
}

どうもありがとうございました!:)

4

2 に答える 2

1

サンプル スクリプトにはいくつかの小さな問題があります。次の例は、かなりクリーンな方法で必要なことを行う必要があります。

#!/usr/bin/perl 
use strict;
use warnings;
use File::Find;

# Find the files we're interested in parsing
my @files = ();
my $dir = "D:/New folder";
find(sub { if (-f && /\.txt$/) { push @files, $File::Find::name } }, $dir);

# We'll store our results in a hash, rather than in 2 arrays as you did
my %foundItems = ();

foreach my $file (@files)
{
    # Using a lexical file handle is the recommended way to open files
    open my $in, '<', $file or die "Could not open $file: $!";
    while (<$in>)
    {
        # Uncomment the next two lines to see what's being parsed
        # chomp; # Not required, but helpful for the debug print below
        # print "$_\n"; # Print out the line being parsed; for debugging

        # Capture the number if we find the word 'victory'
        # This assumes the number is immediately after the word; if that
        # is not the case, it's up to you to modify the logic here
        if (m/victory\s+(\d+)/)
        {
            $foundItems{$file} = $1; # Store the item
            last;
        }
    }
    close $in;
}

foreach my $file (sort keys %foundItems)
{
    print "$file=> $foundItems{$file}\n";
}
于 2013-02-08T01:54:58.397 に答える
0

以下は、すべてのファイル (file*.txt) で文字列 abc を検索し、最初の行のみを出力します。

perl -lne 'BEGIN{$flag=1}if(/abc/ && $flag){print $_;$flag=0}if(eof){$flag=1}' file*.txt

テスト済み:

> cat temp
abc 11
22
13
,,
abc 22
bb
cc
,,
ww
kk
ll
,,

> cat temp2
abc t goes into 1000
fileA1, act that abc specific place

> perl -lne 'BEGIN{$flag=1}if(/abc/ && $flag){print $_;$flag=0}if(eof){$flag=1}' temp temp2
abc 11
abc t goes into 1000
> 
于 2013-02-08T07:01:38.273 に答える