perl-сұрау арқылы -pie

Бұл жұмыс істейді:

perl -pi -e 's/abc/cba/g' hellofile

Бірақ бұл:

perl -pie 's/cba/abc/g' hellofile

Басқаша айтқанда, -pi-жұмыс істейді, бірақ ештеңе жоқ. Неліктен?

8

3 жауаптар

-i жалауы қосымша файлды (егер ол бар болса, кейінірек дербес пәрмен жолының аргументінде болмауы керек) қабылдайды, ол кіріс файлының атын қосу үшін жұрналды анықтайды сақтық көшірме жасаудың мақсаты. perl -pie 's/cba/abc/g' hellofile жазуы бұл сукс ретінде қабылданатын e туғызады және e

-e ретінде түсіндіріледі, Perl s/cba/abc/g -де орналасқан сценарийді іске қосуға тырысады, бұл мүмкін болмайды.

14
қосылды

Себебі -i сақтық көшірме файлдары үшін қосымша кеңейтімді алады, мысалы: -i.bak , сондықтан қосымша жалаулар -i кейін тікелей емес.

From perldoc perlrun

-i[extension]

specifies that files processed by the <> construct are to be edited in-place. It does this by renaming the input file, opening the output file by the original name, and selecting that output file as the default for print() statements. The extension, if supplied, is used to modify the name of the old file to make a backup copy, following these rules:

If no extension is supplied, no backup is made and the current file is overwritten.

If the extension doesn't contain a * , then it is appended to the end of the current filename as a suffix. If the extension does contain one or more * characters, then each * is replaced with the current filename. In Perl terms, you could think of this as:

9
қосылды

Perl қазірдің өзінде неге түсіндіреді :) T ry- I t- T o- S ee

$ perl -pie " s/abc/cba/g " NUL
Can't open perl script " s/abc/cba/g ": No such file or directory

Егер B :: Deparse функциясын қолдансаңыз, перл сіздің кодты қалай жасайтынын көре аласыз

$ perl -MO=Deparse -pi -e " s/abc/cba/g " NUL
BEGIN { $^I = ""; }
LINE: while (defined($_ = )) {
    s/abc/cba/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Егер сіз перлварды $ ^ I деп іздесеңіз, -i қосқышы туралы біле аласыз :)

$ perldoc -v "$^I"

    $INPLACE_EDIT
    $^I     The current value of the inplace-edit extension. Use "undef" to
            disable inplace editing.

            Mnemonic: value of -i switch.

Енді бірінші бөлімге қайта кірсеңіз, қосымша қосыңыз, содан кейін Deparse қосыңыз, -i қосқышы түсіндіріледі

$ perl -pie -e " s/abc/cba/g " NUL
Can't do inplace edit: NUL is not a regular file.

$ perl -MO=Deparse -pie -e " s/abc/cba/g " NUL
BEGIN { $^I = "e"; }
LINE: while (defined($_ = )) {
    s/abc/cba/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Шын мәнінде бұл кеңейтілім ретінде қабылдануы мүмкін бе? маған солай көрінеді

$ perl -MO=Deparse -pilogicus -e " s/abc/cba/g " NUL
BEGIN { $^I = "logicus"; }
LINE: while (defined($_ = )) {
    s/abc/cba/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Күмән туындаған кезде, Deparse немесе Deparse, -p

6
қосылды