2017-03-12 14 views
-2

に私が入った文字列を置換する文字列 "/" コードperlの

の下に使用して、Perlを使用していますfile.txtをが

/usr/open/xyz -getCh $svr 

コード

を含む "/" スラッシュを含む文字列を置換します
open(FILE, "</tmp/file.txt") || die "File not found"; 
my @lines = <FILE>; 
close(FILE); 
my $stringToReplace = "\/usr\/open\/xyz -getCh \$svr"; 
my $stringToReplaceWith = "echo \"y\" | \/usr\/open\/xyz -getCh \$svr"; 
my @newlines; 
foreach(@lines) { 
    $_ =~ s/$stringToReplace/$stringToReplaceWith/g; 
    push(@newlines,$_); 
} 

open(FILE, ">/tmp/file.txt") || die "File not found"; 
print FILE @newlines; 
close(FILE); 

上記のコードは私にとっては機能しません。

+0

デュードを働く文字通り

取りたい場合は、エスケープする必要があります。任意の文字を使用して、正規表現の罫線をマークすることができます。どのように "動作しない"かに関する情報を提供していないので、 "/"を使用して正規表現に印を付けるので問題があると仮定します。 $ _ =〜〜{$ stringToReplace} {$ stringToReplaceWith} g;この例では の代わりにこの行を使用します。 –

+4

これはスラッシュとは関係ありません。問題は(たぶん)正規表現の '$'が文字通りのドル記号ではなく文字列の終わりを探すことです。しかし、「コードは機能していません」というのは問題の説明ではなく、問題を自分で追跡するのにはあまり費やしていないようです(あなたのコードは最小限ではありません)。 – melpomene

+1

すべてのPerlファイルを 'use strict;警告を使う; '。 – melpomene

答えて

3

あなたのコードあなたが

  • 使用字句ファイルハンドルとopen

  • の3パラメータフォームを作成し、すべてのPerlプログラムの上部に

    • 常にuse strictuse warnings 'all'に関する注意

    • openコールは、ファイルが見つからない以外の多くの理由で失敗することがあります。エラーメッセージは$!で、die文字列に含める必要があります。

    • 一重引用符を使用すると、文字列リテラルのほとんどのバックスラッシュが不要になります。スラッシュは、あなたが一度

    • にPerlのオペレータのデフォルトのそれは多くの事実を使ってより多くを使用する場合は特に、一定の値を定義するuse constantあなたがすべき

    • eithern単一または二重引用符の内側にエスケープする必要はありません。代理行為$_

    • 配列@newlinesの必要はありません。 @newlinesが最後のポイントは、あなたの問題を解決するすべての英数字以外の文字をエスケープするために正規表現パターンまたは二重引用符で囲まれた文字列の中だけでコピー

    • 使用\Q...\E

    あるので、あなたはとにかく@linesを変更しています。正規表現パターン内のドル記号$はライン0F終わりを意味し、あなたはそれがあなたのプログラムのこの変化は、正しく

    use strict; 
    use warnings 'all'; 
    
    use constant FILE => '/tmp/file.txt'; 
    
    my @input = do { 
        open my $fh, '<', FILE or die "Unable to open input file: $!"; 
        <$fh>; 
    }; 
    
    my $old = '/usr/open/xyz -getCh $svr'; 
    my $new = 'echo "y" | ' . $old; 
    
    open my $fh, '>', FILE or die "Unable to open output file: $!"; 
    
    for (@input) { 
        s/\Q$old/$new/g; 
        print $fh $_; 
    } 
    
    print "Changes complete\n";