🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
5 messages
5 total messages Started by ..:: sjf ::.. Mon, 20 Jul 2009 08:43
Czytanie danych z potoku z innego programu
#51546
Author: ..:: sjf ::..
Date: Mon, 20 Jul 2009 08:43
40 lines
2273 bytes
Witam,

Mam skrypt, który przetwarza dane z pliku/plików, których nazwy są 
podane jako argumenty do programu. Chciałbym, by możliwe było również 
czytanie danych przez potok. Zrobiłem to tak, że gdy nie podano nazwy 
pliku, wrzucam do tablicy @ARGV "-". Ma to tę wadę, że jeżeli nie podano 
nazwy pliku oraz program faktycznie nie dostaje nic z potoku to oczekuje 
na wprowadzenie danych z klawiatury.
Odpowiedni fragment skryptu:

push @ARGV,"-" if !scalar @ARGV;
open FILE,$ARGV[0] or die "** Blad odczytu pliku \"$ARGV[0]\": $!\n";
foreach my $line (<FILE>){
    # przetwarzanie pliku
}
close FILE;

Uruchomienie skryptu z podaniem nazwy pliku:
skrypt.pl plik_do_przetworzenia
działa prawidłowo.

Uruchomienie z czytaniem danych z potoku:
jakis_program inny_plik_wejsciowy | skrypt.pl
też działa prawidłowo.

Ale uruchomienie bez podania nazwy pliku:
skrypt.pl
powinno wyrzucić komunikat o braku pliku danych. Niestety skrypt czeka 
na dane z klawiatury.

W jaki sposób sprawdzić czy skrypt został uruchomiony w trybie czytania 
z otwartego potoku?
Wiem w jaki sposób obsługiwać czytanie z potoku, gdy wywołuję jakiś 
program z mojego skryptu, ale rzecz w tym, że dane mogą pochodzić z 
różnych programów generujących wyniki w ustalonym formacie.

-- 
Szczepan J. Fijał :: sjf @ 50°07'N 18°58'E
xmpp:sjf@jabster.pl | tlen:sjf | gg:2604451 | skype:s.fijal?call
"2 nie jest równe 3 - nawet dla dużych wartości 2."
Re: Czytanie danych z potoku z innego programu
#51544
Author: Stachu 'Dozzie' K.
Date: Mon, 20 Jul 2009 08:51
35 lines
1999 bytes
On 20.07.2009, ..:: sjf ::.. wrote:
[...]
> Uruchomienie skryptu z podaniem nazwy pliku:
> skrypt.pl plik_do_przetworzenia
> działa prawidłowo.
>
> Uruchomienie z czytaniem danych z potoku:
> jakis_program inny_plik_wejsciowy | skrypt.pl
                                      ^^^^^^^^^
> też działa prawidłowo.
>
> Ale uruchomienie bez podania nazwy pliku:
> skrypt.pl
  ^^^^^^^^^
> powinno wyrzucić komunikat o braku pliku danych. Niestety skrypt czeka 
> na dane z klawiatury.

A teraz powiedz czym według ciebie różni się uruchomienie `skrypt.pl' od
uruchomienia `skrypt.pl'? [*]

> W jaki sposób sprawdzić czy skrypt został uruchomiony w trybie czytania 
> z otwartego potoku?

Musisz otworzyć urzšdzenie /dev/telepathy/terminal_operator. Poszukaj
w sieci formatu danych odczytywanych z tego urzšdzenia.

> Wiem w jaki sposób obsługiwać czytanie z potoku, gdy wywołuję jakiś 
> program z mojego skryptu, ale rzecz w tym, że dane mogą pochodzić z 
> różnych programów generujących wyniki w ustalonym formacie.

Nie bardzo widzę co to ma do rzeczy.

-- 
Stanislaw Klekot
[*] Ja wiem że tu się różniš.
Re: Czytanie danych z potoku z innego programu
#51548
Author: ..:: sjf ::..
Date: Mon, 20 Jul 2009 09:09
30 lines
1994 bytes
W dniu 2009-07-20 10:51, Stachu 'Dozzie' K. pisze:
> On 20.07.2009, ..:: sjf ::.. wrote:
> [...]
>> Uruchomienie skryptu z podaniem nazwy pliku:
>> skrypt.pl plik_do_przetworzenia
>> działa prawidłowo.
>>
>> Uruchomienie z czytaniem danych z potoku:
>> jakis_program inny_plik_wejsciowy | skrypt.pl
>                                        ^^^^^^^^^
>> też działa prawidłowo.
>>
>> Ale uruchomienie bez podania nazwy pliku:
>> skrypt.pl
>    ^^^^^^^^^
>> powinno wyrzucić komunikat o braku pliku danych. Niestety skrypt czeka
>> na dane z klawiatury.
>
> A teraz powiedz czym według ciebie różni się uruchomienie `skrypt.pl' od
> uruchomienia `skrypt.pl'? [*]
Ciekawe w takim razie czy podobnie nie ma różnicy w uruchomieniu dla 
przykładu more w ten sposób:
user@host> cat jakis_plik | more
od uruchomienia w ten sposób:
user@host> more

-- 
Szczepan J. Fijał :: sjf @ 50°07'N 18°58'E
xmpp:sjf@jabster.pl | tlen:sjf | gg:2604451 | skype:s.fijal?call
"2 nie jest równe 3 - nawet dla dużych wartości 2."
Re: Czytanie danych z potoku z innego programu
#51547
Author: Stachu 'Dozzie' K.
Date: Mon, 20 Jul 2009 09:21
34 lines
2081 bytes
On 20.07.2009, ..:: sjf ::.. wrote:
> W dniu 2009-07-20 10:51, Stachu 'Dozzie' K. pisze:
>> On 20.07.2009, ..:: sjf ::.. wrote:
>> [...]
>>> Uruchomienie skryptu z podaniem nazwy pliku:
>>> skrypt.pl plik_do_przetworzenia
>>> działa prawidłowo.
>>>
>>> Uruchomienie z czytaniem danych z potoku:
>>> jakis_program inny_plik_wejsciowy | skrypt.pl
>>                                        ^^^^^^^^^
>>> też działa prawidłowo.
>>>
>>> Ale uruchomienie bez podania nazwy pliku:
>>> skrypt.pl
>>    ^^^^^^^^^
>>> powinno wyrzucić komunikat o braku pliku danych. Niestety skrypt czeka
>>> na dane z klawiatury.
>>
>> A teraz powiedz czym według ciebie różni się uruchomienie `skrypt.pl' od
>> uruchomienia `skrypt.pl'? [*]
> Ciekawe w takim razie czy podobnie nie ma różnicy w uruchomieniu dla 
> przykładu more w ten sposób:
> user@host> cat jakis_plik | more
             ^^^
> od uruchomienia w ten sposób:
> user@host> more

Owszem, ale po co ci taki sposób uruchomienia? Gruba większoœć
programów po prostu czeka na dane, jak użyty przez ciebie martwy kot,
jak sed, awk, `perl -n' i wiele, wiele innych.

-- 
Stanislaw Klekot
Re: Czytanie danych z potoku z innego programu
#51549
Author: Adam Osuchowski
Date: Mon, 20 Jul 2009 09:51
27 lines
1876 bytes
..:: sjf ::.. wrote:
> Ma to tę wadę, że jeżeli nie podano nazwy pliku oraz program
> faktycznie nie dostaje nic z potoku to oczekuje na wprowadzenie danych
> z klawiatury.

Troszkę Ci się pomieszały pojęcia i stąd te problemy. Otwarcie w Perlu
pliku o nazwie "-", tak naprawdę przypisuje do otwartego uchwytu
standardowe wejście procesu. To czym ono jest, zwykłym plikiem,
potokiem, terminalem (nazywanym tu przez Ciebie klawiaturą) to jest
sprawa drugorzędna. Perl w tym wypadku zawsze czyta ze standardowego
wejścia.

> W jaki sposób sprawdzić czy skrypt został uruchomiony w trybie czytania z 
> otwartego potoku?

Zdefiniuj co masz na myśli bo, szczerze powiedziawszy, nie wiem co to jest
,,tryb czytania z otwartego potoku''. Jeśli interesuje Cię czy standardowe
wejście jest terminalem, bo tak jest w przypadku uruchomienia skryptu
z shella bez żadnych przekierowań itp., to użyj operatora -t:

#v+
if (-t FILE) {
  print "Czytamy z terminala\n";
} else {
  print "Czytamy ze zwykłego pliku, potoku, urządzenia lub innego typu otwartego strumienia\n";
}
#v-
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads