6

テキストファイルから1行を削除しようとしています。代わりに、私が持っているものはファイル全体を一掃します。誰かがエラーを指摘できますか?

removeReservation("john");

sub removeTime() {
    my $name = shift;

    open( FILE, "<times.txt" );
    @LINES = <FILE>;
    close(FILE);
    open( FILE, ">times.txt" );
    foreach $LINE (@LINES) {
        print NEWLIST $LINE unless ( $LINE =~ m/$name/ );
    }
    close(FILE);
    print("Reservation successfully removed.<br/>");
}

times.txtファイルのサンプル:

04/15/2012&08:00:00&bob
04/15/2012&08:00:00&john
4

5 に答える 5

20
perl -ni -e 'print unless /whatever/' filename
于 2013-06-04T13:46:40.277 に答える
9

Oalderの答えは正しいですが、彼はオープンステートメントが成功したかどうかをテストする必要がありました。ファイルtimes.txtが存在しない場合、プログラムは、何かひどいことが起こったことを警告する言葉なしに、陽気な方法で続行します。

オールダーズと同じプログラムですが:

  1. の結果をテストしますopen
  2. より間抜けな証拠である3つの部分のオープンステートメントを使用します。ファイル名が>またはで始まる場合|、プログラムは古い2つの部分の構文で失敗します。
  3. グローバルファイルハンドルを使用しない-特にサブルーチンで。ファイルハンドルは通常、スコープがグローバルです。FILEメインプログラムで名前が付けられたファイルハンドルがあり、それを読んでいた場合、このサブルーチンを呼び出したと想像してください。それは問題を引き起こすでしょう。ローカルスコープのファイルハンドル名を使用します。
  4. 変数名は小文字にする必要があります。定数はすべて大文字です。これは、時間の経過とともに開発された単なる標準です。これに従わないと、混乱を招く可能性があります。
  5. oaldersはプログラムをサブルーチンに入れるので、ファイルの名前もサブルーチンに渡す必要があります...

プログラムは次のとおりです。

#!/usr/bin/env perl 

use strict; 
use warnings; 

removeTime( "john", "times.txt" ); 

sub removeTime { 
    my $name      = shift;
    my $time_file = shift;

    if (not defined $time_file) {
        #Make sure that the $time_file was passed in too.
        die qq(Name of Time file not passed to subroutine "removeTime"\n);
    }

    # Read file into an array for processing
    open( my $read_fh, "<", $time_file )
       or die qq(Can't open file "$time_file" for reading: $!\n); 

    my @file_lines = <$read_fh>; 
    close( $read_fh ); 

    # Rewrite file with the line removed
    open( my $write_fh, ">", $time_file )
        or die qq(Can't open file "$time_file" for writing: $!\n);

    foreach my $line ( @file_lines ) { 
        print {$write_fh} $line unless ( $line =~ /$name/ ); 
    } 
    close( $write_fh ); 

    print( "Reservation successfully removed.<br/>" ); 
}
于 2012-04-16T04:57:46.420 に答える
8

まだ定義していないファイルハンドルに印刷しているようです。少なくとも、サンプルコードでは定義していません。strictとwarningsを有効にすると、次のメッセージが表示されます。

Name "main::NEWLIST" used only once: possible typo at remove.pl line 16.

print NEWLIST $LINE unless ($LINE =~ m/$name/);

このコードはあなたのために働くはずです:

#!/usr/bin/env perl 

use strict; 
use warnings; 

removeTime( "john" ); 

sub removeTime { 
    my $name = shift; 

    open( FILE, "<times.txt" ); 
    my @LINES = <FILE>; 
    close( FILE ); 
    open( FILE, ">times.txt" ); 
    foreach my $LINE ( @LINES ) { 
        print FILE $LINE unless ( $LINE =~ m/$name/ ); 
    } 
    close( FILE ); 
    print( "Reservation successfully removed.<br/>" ); 
}

注意すべき他のいくつかのこと:

1)removeTime()を意味する場合、サンプルコードはremoveReservation()を呼び出します

2)プロトタイプを使用する場合を除いて、サブルーチン定義に丸括弧は必要ありません。上記の私の例を参照してください。

于 2012-04-15T23:19:29.963 に答える
4

これはFAQにあります。

ファイルの行を変更、削除、挿入したり、ファイルの先頭に追加したりするにはどうすればよいですか?

FAQを確認することは常に価値があります。

于 2012-04-16T09:19:39.330 に答える
0

誰かがファイルからすべての行を削除したい場合に備えて。

たとえば、ファイル(4行目は空、5行目は3つのスペースがあります):

t e st1
test2 a
  e

   
aa 
    bb bb
test3a
cc

一部の人が使用する可能性のあるパターンに一致する行を削除するには、次のようにします。

# Remove all lines with a character 'a'
perl -pi -e 's/.*a.*//' fileTest && sed -i '/^$/d' fileTest;

結果:

t e st1
  e
   
    bb bb
cc

関連している:

perl -h
    # -p                assume loop like -n but print line also, like sed
    # -i[extension]     edit <> files in place (makes backup if extension supplied)
    # -e program        one line of program (several -e's allowed, omit programfile)

sed -h
    # -i[SUFFIX], --in-place[=SUFFIX]
    #                edit files in place (makes backup if SUFFIX supplied)

参考文献1参考文献2

于 2021-06-09T18:57:40.683 に答える