조건부 대체 작성 방법

조건부 대체 작성 방법

이제 내 작업 디렉토리에서 이 단어를 바꾸고 싶습니다.->그리고$\to$단어가 범위 내에 있지 않은 경우말 그대로환경.

의사코드

모든 항목 바꾸기->그리고$\to$내부가 아닌 다른 곳에\begin{문자 그대로}...\end{문자 그대로}.

내 Perl 의사코드는 다음을 기반으로 합니다.좋은 대답

#!/usr/bin/env perl

## The target directories
my @directories=("Cardiology", "Pathophysiology", "Patology and Biopsy", "Physiology", "Propedeutics", "Radiology", "Rheumatology", "Surgery");


## Iterate over the directories
foreach my $dir (@directories) {
    my $dd=0;
    ## Read the current directory
    opendir (my $DIR, "$path/$dir");
    ## Find all files in this directory
    while (my $file = readdir($DIR)) {
        ## Skip any files that aren't .tex
        next unless $file =~ /\.tex$/;

        ## Open the file
        open(my $fh,"$path/$dir/$file");

        while (<$fh>) {
            if (/\\begin{verbatim}/) {                    
                # Skip the Verbatim environment # TODO how this?
                # Need to tell it that you one line by one until \end{verbatim} is met, after which go normally forward.
                while (!/\\end{verbatim}/) {
                    $dd++;
                }
                $dd++;
            }
            else {
                if ($dd==0) {
                    $dd++;       # I think we need this here to go one line after another
                }
                $string =~ s/->/$\to$/g;
            }
        }
        print "\n";
    }

while 루프의 가장 안쪽 의사코드에 대해 잘 모르겠습니다.

        while (<$fh>) {
            if (/\\begin{verbatim}/) {                    
                # Skip the Verbatim environment # TODO how this?
                # Need to tell it that you one line by one until \end{verbatim} is met, after which go normally forward.
                while (!/\\end{verbatim}/) {
                    $dd++;
                }
                $dd++;
            }
            else {
                if ($dd==0) {
                    $dd++;       # I think we need this here to go one line after another
                }
                $string =~ s/->/$\to$/g;
            }
        }

그러한 조건부 의사코드를 어떻게 작성할 수 있습니까?

답변1

쉘이 bash라고 가정하면 다음은 한 줄일 수 있습니다.

perl -i.bak  -pe '
    /\\begin\{verbatim\}/../\\end\{verbatim\}/ or s/->/\$\\to\$/g
' {Cardiology,Pathophysiology,"Patology and Biopsy",Physiology,Propedeutics,Radiology,Rheumatology,Surgery}/*.tex

이는 {...}정규식 수량자이므로 중괄호를 이스케이프해야 합니다.


코드를 다음과 같이 작성하겠습니다.

my @directories=(
    "Cardiology", "Pathophysiology", "Patology and Biopsy", "Physiology", 
    "Propedeutics", "Radiology", "Rheumatology", "Surgery"
);
chdir $path or die "cannot chdir '$path'";

foreach my $dir (@directories) {
    opendir my $DIR, $dir or die "cannot opendir '$dir'";
    while (my $file = readdir($DIR)) {
        my $filepath = "$dir/$file";
        next unless -f $filepath and $filepath =~ /\.tex$/;

        open my $f_in, "<", $filepath 
            or die "cannot open '$filepath' for reading";
        open my $f_out, ">", "$filepath.new"
            or die "cannot open '$filepath.new' for writing";

        while (<$fh>) {
            if (not /\\begin\{verbatim\}/ .. /\\end\{verbatim\}/) {                    
                s/->/\$\\to\$/g;
            }
            print $f_out;
        }

        close $f_in   or die "cannot close '$filepath'";
        close $f_out  or die "cannot close '$filepath.new'";

        rename $filepath, "$filepath.bak"  
            or die "cannot rename '$filepath' to '$filepath.bak'";
        rename "$filepath.new", $filepath
            or die "cannot rename '$filepath.new' to '$filepath'";
    }
    closedir $DIR  or die "cannot closedir '$dir'";
}

계속해서 객체지향적으로 만들겠습니다.

use autodie qw(:io);
use Path::Class;

foreach my $dir (
        "Cardiology", "Pathophysiology", "Patology and Biopsy", "Physiology", 
        "Propedeutics", "Radiology", "Rheumatology", "Surgery"
) 
{
    my $directory = dir($path, $dir);
    while (my $file = $directory->next) {
        next unless -f $file and $file =~ /\.tex$/;
        my $f_out = file("$file.new")->open('w');
        for ($file->slurp) {
            /\\begin\{verbatim\}/ .. /\\end\{verbatim\}/  or s/->/\$\\to\$/g;
            $f_out->print;
        }
        $f_out->close;
        rename "$file", "$file.bak";
        rename "$file.new", "$file";
    }
}

관련 정보