it-swarm.dev

Programmgesteuert aus STDIN oder Eingabedatei in Perl lesen

Was ist der schnellste Weg, um programmgesteuert aus stdin oder einer Eingabedatei (sofern vorhanden) in Perl zu lesen?

61
syker
while (<>) {
print;
}

liest entweder aus einer in der Befehlszeile angegebenen Datei oder aus stdin, wenn keine Datei angegeben ist

Wenn Sie diese Schleife in der Befehlszeile erstellen möchten, können Sie die Option -n verwenden:

$ Perl -ne 'print;'

Hier fügen Sie einfach Code zwischen {} aus dem ersten Beispiel in '' in zweitem ein

76
ennuikiller

Damit steht eine benannte Variable zur Verfügung, mit der gearbeitet werden kann:

foreach my $line ( <STDIN> ) {
    chomp( $line );
    print "$line\n";
}

Um eine Datei zu lesen, leiten Sie sie so ein:

program.pl < inputfile
41
Ron

In bestimmten Situationen ist es am "geschicktesten", den Schalter -n zu verwenden. Es umschließt Ihren Code implizit mit einer while(<>) -Schleife und behandelt die Eingabe flexibel.

In _slickestWay.pl_:

 #!/usr/bin/Perl -n 
 
 BEGIN: {
 # hier einmal etwas tun 
} 
 
 # Logik für eine einzelne Eingabezeile implementieren 
 $ result drucken; 

In der Befehlszeile:

_chmod +x slickestWay.pl
_

Führen Sie nun abhängig von Ihrer Eingabe einen der folgenden Schritte aus:

  1. Warten Sie auf Benutzereingaben

    _./slickestWay.pl
    _
  2. Lesen aus Datei (en) mit den angegebenen Argumenten (keine Umleitung erforderlich)

    _./slickestWay.pl input.txt
    ./slickestWay.pl input.txt moreInput.txt
    _
  3. Verwenden Sie eine Pfeife

    _someOtherScript | ./slickestWay.pl 
    _

Der BEGIN -Block ist erforderlich, wenn Sie eine objektorientierte Schnittstelle wie Text :: CSV oder eine solche initialisieren müssen, die Sie mit _-M_ zum Shebang hinzufügen können.

_-l_ und _-p_ sind auch deine Freunde.

14
Neil Best

Sie müssen den Operator <> verwenden:

while (<>) {
    print $_; # or simply "print;"
}

Welches kann verdichtet werden zu:

print while (<>);

Beliebige Datei:

open F, "<file.txt" or die $!;
while (<F>) {
    print $_;
}
close F;
12
el.pescado

Wenn es einen Grund gibt, warum Sie nicht die einfache Lösung verwenden können, die von ennuikiller oben bereitgestellt wird, müssen Sie mit Typeglobs Dateizugriffsnummern bearbeiten. Das ist viel mehr Arbeit. Dieses Beispiel kopiert aus der Datei in $ARGV[0] in die Datei in $ARGV[1]. Der Standardwert ist STDIN und STDOUT, wenn keine Dateien angegeben werden.

use English;

my $in;
my $out;

if ($#ARGV >= 0){
    unless (open($in,  "<", $ARGV[0])){
      die "could not open $ARGV[0] for reading.";
    }
}
else {
    $in  = *STDIN;
}

if ($#ARGV >= 1){
    unless (open($out, ">", $ARGV[1])){
      die "could not open $ARGV[1] for writing.";
    }
}
else {
    $out  = *STDOUT;
}

while ($_ = <$in>){
    $out->print($_);
}
8
Sigusr2

Tun

$userinput =  <STDIN>; #read stdin and put it in $userinput
chomp ($userinput);    #cut the return / line feed character

wenn Sie nur eine Zeile lesen möchten

6

So habe ich ein Skript erstellt, das entweder Befehlszeileneingaben oder eine umgeleitete Textdatei enthalten kann .

if ($#ARGV < 1) {
    @ARGV = ();
    @ARGV = <>;
    chomp(@ARGV);
}


Dadurch wird der Inhalt der Datei @ARGV erneut zugewiesen. Von dort verarbeiten Sie @ARGV so, als ob jemand Befehlszeilenoptionen .

WARNUNG

Wenn keine Datei umgeleitet wird, befindet sich das Programm im Leerlauf, da es auf Eingaben von STDIN ..__ wartet.

Ich habe noch nicht herausgefunden, wie eine Datei umgeleitet wird, um das STDIN-Problem zu beheben. 

0
Westrock