"doen" -functie in Perl

Onlangs heb ik een perl-script dat een ander perl-script oproept met "do"; d.w.z.

do "./script2.pl $ arg1 $ arg2";

Mijn script2.pl is ontworpen om 2 argumenten te consumeren.

Als u echter script2.pl op de bovenstaande manier aanroept, worden de argumenten niet doorgegeven aan script2.pl.

Ik weet dat er een andere manier is om "systeem" te gebruiken, maar mijn script1.pl moet een aantal variabele waarden krijgen via "vereisen".

Kan ik "doe" ook gebruiken en de argumenten doorgeven aan mijn script2?

1
U moet verduidelijken wat u bedoelt met "moet een aantal variabele waarden krijgen door te eisen". Toon de code.
toegevoegd de auteur TLP, de bron
Bedoel je niet: "Ik wil args in @ARGV?" In welk geval, waarom stop je ze in @ARGV?
toegevoegd de auteur ikegami, de bron

5 antwoord

Als het script dat u aanroept argumenten verwacht, zal het deze verwachten in de variabele @ARGV . Als u do gebruikt, is de @ARGV in het aanroepende script zichtbaar in het aangeroepen script.

{
    local @ARGV = ($arg1, $arg2);
    do './script2.pl';
}

Door local op deze manier te gebruiken, worden aan het einde van het blok de oude waarden van @ARGV hersteld, een beetje zoals zeggen

@ARGV_old = @ARGV;
@ARGV = ($arg1,$arg2);
do './script2.pl';
@ARGV = @ARGV_old;
10
toegevoegd

Het korte antwoord is dat u waarschijnlijk system() wilt gebruiken als u een ander script met argumenten wilt aanroepen:

use autodie;
system('./script2.pl', $arg1, $arg2);

# OR if you don't want to install autodie from CPAN
system('./script2.pl', $arg1, $arg2) == 0
    or die "cannot run script2.pl: $!";

Als je een tolk wilt delen, wil je dit waarschijnlijk heel anders doen. Voor snelle scripts gebruik ik bijvoorbeeld soms require als volgt:

our $SHARED_VALUE = 0;
our $OTHER_VALUE = 42;

require 'script2.pl';

In script2.pl kunt u het volgende definiëren:

our ($SHARED_VALUE, $OTHER_VALUE);

en wanneer script2.pl door de vereiste wordt geladen, worden deze variabelen ingesteld. Dit is nog steeds niet de beste manier.

Sterker nog, is om een ​​pakket te gebruiken om code te delen, maar dat zou verder reiken dan de omvang van de vraag.

3
toegevoegd
Solaris is de schuldige. Solaris 9 kwam met Perl 5.6 en 5.00503. Solaris 10 biedt Perl 5.8.4 en 5.6. Solaris 11 komt met versie 5.10.0, maar kwam pas in november van vorig jaar uit. Hoe hebben ze dat onderzoek van Perl gedaan? Was het een zelf gemeld probleem? Was het geadverteerd op Perl heavy sites? Ik kan me voorstellen dat een enquête scheept naar nieuwere releases, omdat mensen op oudere Perl-releases misschien niet zo actief zijn in de Perl-community.
toegevoegd de auteur David W., de bron
De schalen zijn twee jaar geleden in het voordeel van 5,10 getipt. imgur.com/lcUvL (bron: Perl Survey 2010)
toegevoegd de auteur daxim, de bron
autodie is een kernmodule van perl v5.10.1.
toegevoegd de auteur TLP, de bron
Goed punt. Aan de andere kant gebruiken de meeste mensen nog steeds een 5.8 release van Perl van 12-15 jaar geleden om wat voor reden dan ook, dus je moet nog steeds wijzen op het alternatief.
toegevoegd de auteur zostay, de bron

Nee, u kunt argumenten niet doorgeven aan een perl-script met do .

1
toegevoegd
Dank je. Op welke manier kan ik dit dan benaderen?
toegevoegd de auteur GJ., de bron

Als u variabelen wilt delen, moeten ze zich in dezelfde module bevinden. Anders schrijf je spaghetti.

Als u uw code wilt structureren zodat een bestand sommige functies inkapselt, maak er dan een module van en gebruik "module gebruiken" om het toe te voegen.

0
toegevoegd
script2 is een erg lang script dat is ontworpen om andere taken uit te voeren en veel andere mensen gebruiken dit script; script1 is door mij geschreven, ik wil alleen de waarden van sommige variabelen in script2 krijgen. Ik kan dat script2 niet wijzigen. Bedankt.
toegevoegd de auteur GJ., de bron

Je kunt je script ook in het hoofdprogramma injecteren met

 eval `cat ./script2.pl`

op die manier heeft het toegang tot alle bereikvariabelen van het hoofdprogramma.

0
toegevoegd