Announcement

Collapse
No announcement yet.

Perl Pipe & Diamantoperatoren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Perl Pipe & Diamantoperatoren

    Guten Tag,

    ich arbeite zur Zeit an einem Perl - Skript, welches seine
    Daten aus einer Pipeline und / oder den Diamantoperatoren ziehen kann.

    Das ganze funktioniert soweit auch sehr gut, jedoch ist es mir nun nicht mehr
    möglich, das Programm ohne Pipe (Beispiel: ls -l | ./programm.pl) oder
    Argumenten zu starten (Beispiel: ./programm.pl /etc/X11/xorg.conf).
    Auch eine Kombination von Pipe und Argumenten ist möglich (Beispiel: ls -l | ./programm.pl -a apensiv)

    Das Skript wird später einmal dazu genutzt Daten auf einen Pastebin- Service
    hochzuladen. Meine Frage ist nun wie ich mein Skript so umschreiben kann,
    dass eine Fehlermeldung beim einfachem Aufrufen des Programmes ausgegeben wird.
    (Eingabe: ./programm.pl Ausgabe: Es wurden keine Daten zum Hochladen gefunden!)

    Skript:

    PHP Code:
    #!/usr/bin/perl
    # spongedpaste.pl -- by apensiv
    use strict;
    use 
    warnings;
    use 
    LWP 5.64;
    use 
    Getopt::Long;

    my $time '1';
    my $caption 'Pasted Text';
    my $autor $ENV{'USER'};
    my $highlight 'text';

    my $count = @ARGV;
    my $file $ARGV[$count 1];

    my $browser LWP::UserAgent->new;
    my $link 'http://spongedpaste.com/';
    my $status '0';
    GetOptions('f=s'    => \$highlight,
                    
    'c=s' => \$caption,
                    
    'a=s'   => \$autor,
                    
    't=i'    => \$time);

    my @source;
    if (@
    ARGV){
    open INPUT,"<$file";
        while(<
    INPUT>) { push (@source $_); }
    close INPUT;}
    if (-
    p STDIN){
    while(
    STDIN) {
        
    push (@source$_); } }

    if (@
    source) {    
        
    my $response $browser->post($link, {
            
    'txta_text' => "@source"
            
    'txtf_caption' => "$caption"
            
    'txtf_user' => "$autor"
            
    'ddm_highlight' => "$highlight"
            
    'end_date' => "$time"
            
    'cmd_paste' => 'Absenden' });
        
    my $source $response->content();
        
    $source=~m/<a id="link" href="(.*)">/;
        print $
    "\n";
    }
    else
    {
        
    "Es wurden keine Daten zum Hochladen gefunden!\n";

    Ich hoffe Ihr könnt mir weiterhelfen.

    mfg

  • #2
    Originally posted by apensiv View Post
    Das ganze funktioniert soweit auch sehr gut, jedoch ist es mir nun nicht mehr möglich, das Programm ohne Pipe (Beispiel: ls -l | ./programm.pl) oder Argumenten zu starten (Beispiel: ./programm.pl /etc/X11/xorg.conf).
    Nun ja, das Script kannst Du natürlich schon so starten, Dein Problem wird eher sein, daß das Auslesen von STDIN endlos dauert, solange dort nichts kommt. Dies ist aber ein ganz normales Verhalten unter Unix.

    Jedes Unix-Tool reagiert genau auf die Art und Weise, insofern würde ich an dem Script gar nichts ändern. Der Aufrufer muß schon wissen, was er tut.

    Vielleicht zieht ein Meister hier noch irgendeine mir unbekannte Option aus der Perl-Wundertüte, aber eine Idee (die ich nie umsetzen würde) wäre der Einbau eines Timeouts, sprich wenn nach ein paar Sekunden nichts über STDIN hereinkommt den Fehler zu werfen.
    Dirk

    Comment


    • #3
      Guten Tag,

      erstmal Vielen Dank für deine Antwort, ich werde es mal mit einem Timeout versuchen, jedoch
      wirkt das ganze dadurch sehr unschön. Das gleiche Skript wurde auch einmal mit Python geschrieben,
      wo dieser "Fehler" nicht auftritt.

      Aber den von dir genannten Fehler kann ich nicht nachvollziehen, denn ich überprüfe ja mit (-p STDIN)
      erstmal ob eine Eingabe eingegangen ist, erst dann lese ich den Standarteingabekanal aus.

      Oder ist die Zuweisung: my $count = @ARGV; schuld daran, dass das Programm auf eine Eingabe des Benutzers wartet, da @ARGV ja nich vorhanden ist und eine Zuweisung von nichts, den Standarteingabekanal ausliest?
      (Habe soetwas ähnliches einmal aufgeschnappt, kann auch tiefgehend falsch sein)

      mfg

      EDIT so habe es doch noch hinbekommen:

      Code:
      #!/usr/bin/perl 
      use strict;
      use warnings;
      use LWP 5.64;
      use Getopt::Long;
      
      my $time = '1';
      my $caption = 'Pasted Text';
      my $autor = $ENV{'USER'};
      my $highlight = 'text';
      
      	GetOptions(	'l=s'    => \$highlight,
                      'c=s' => \$caption,
                      'a=s'   => \$autor,
                      't=i'    => \$time);
      
      my $browser = LWP::UserAgent->new;
      my $link = 'http://spongedpaste.com/';
      my $count = @ARGV;
      my $file = $ARGV[$count - 1];
      my @source;
      
      if ($file){
      	open INPUT,"<$file";
      		while(<INPUT>) { push (@source , $_); }
      	close INPUT; }
      elsif (-p STDIN) {
      	print "dd";
      	@source = <STDIN>; }
      if (@source){
      	my $response = $browser->post($link, {
      		'txta_text' => "@source", 
      		'txtf_caption' => "$caption", 
      		'txtf_user' => "$autor", 
      		'ddm_highlight' => "$highlight", 
      		'end_date' => "$time", 
      		'cmd_paste' => 'Absenden' });
      	my $source = $response->content();
      	$source=~m/<a id="link" href="(.*)">/;
      	print $1 . "\n"; }
      else {
      	print "Keine Daten zum Hochladen gefunden!\n"; }
      Zuletzt editiert von apensiv; 09.06.2008, 17:50.

      Comment

      Working...
      X