Perl programozás - Szoftverfejlesztés fórum

üzenetek

hozzászólások


tildy
(nagyúr)
Blog

Sziasztok!

Úgy láttam PERLlel kapcsolatos topic még nincs, gondoltam nyitok egyet.
de hogy ne csak úgy lógjona levegőben a dolog, rögtön lenne egy kérdésem is.
Asszociativ tomb esetén (hash) miért kell idézőjelek közé rakni az értékeket?


tildy
(nagyúr)
Blog

Ennyire senki?
PAckage készítésben segítség valaki?


Lortech
(addikt)

Jól értem, az a kérdés, hogy miért ilyen a szintaktikája? Mert .. :D
Vagy írj egy példát, hogy pontosan mi okozza a gondot. Package szintén. Valamit konyítok hozzá, de élesben nem használtam, csak azért tanultam régebben, hogy ehhez is hozzá tudjak szagolni.


tildy
(nagyúr)
Blog

Szeretnek egy programot írni, ami függvényeket hív meg.
A függvények legyenek mondjuk a Teszt.pm-ben, itt legyen mondjuk 3 fv. (lenyegtelen mit csinal jelen esetben)
Legyen egy teszt.pl , amelyben meghívjuk a Teszt.pm némely függvényét.
A kérdés: miknek kell lennie a Teszt.pmben, azon kívűl, hogy a függvényeknek?
Mi az az ISA?
Miket kell még beleírni a pm-be?

Perpill ennyi.


Lortech
(addikt)

pl:
A hívó:
$ cat elso.pl

use elso;

my $log_base = $elso::e;
print ''Log base: $log_base\n'';
my $radius = 10;
my $area =
elso::circle_area($radius);
print ''Area = $area\n'';


A modul :
$ cat elso.pm

use strict;

package elso;
our ($pi, $e);


$pi = 3.14159;
$e = 2.7182818;

sub circle_area
{
my $radius = shift;
return ($pi * $radius * $radius);
}
1;

A kimenet:
Log base: 2.7182818
Area = 314.159


elso.pl -t kell futtatni ezekután (perl elso.pl).
A példát innen ([link]
) loptam, Itt találsz egy használható leírást packagekről modulokról és a my, our jelentéséről.
Megmondom őszintén ISA-ról sokminden eszembe jutott, de perl kontextusban semmi. :U Nem használtam még, nem tudom, mire jó.


nukewar
(tag)

Látom kihalt a topic...
Akkor egy kérdés:
Hogyan kezelem a perl paraméterét?
pl.:

perl akármi.sh paraméter

Itt a paramétert akarom használni változó értékeként a programban.
A bash féle $1 úgy látom nem működik.
Tippek? :)


nukewar
(tag)

Na, közben kihámoztam egy netes forráskódból a lényeget.

$ARGV[0] -ként kell rá hivatkozni. Úgy látszik ez az ARGV valami kiemelt változó. Sőt, mi több egyenesen tömb.

perl akármi.sh 88

A programban pedig:

$result=$ARGV[0];

$result értéke 88 lesz.

Köszi a segítséget! :DDD


piadex2
(senior tag)

open(READ,"<audi.txt");

$counter = 0;

while( $line = <READ> ){
if($line =~ m/Horch/)
{
# {print "found Horch";
$counter++;
}else{
# print "there's no Horch\n";
}
}#while
if ($counter > 0)
{print "found Horch $counter time(s)";
}else{
print "there's no Horch\n";
}

close READ;
$_ = <STDIN>;

Ez a kód egy többsoros szövegben, amiben többször szerepel az, hogy Horch miért csak egyszer veszi észre?
Előre is kösz a segítséget.

piadex2


piadex2
(senior tag)

Mert az egész szöveg bekerül a $line-ba, így a ciklus csak egyszer fut le, aminek következtében a $counter csak eggyel növelődik.

piadex2


piadex2
(senior tag)

Sziasztok!

Hogyan lehet megoldani, hogy a program kiírja, hogy hányszor szerepel a Horch a szövegben. Van olyan is, hogy egy sorban többször is szerepel a Horch.
Előre is kösz.

piadex2


vipisti
(tag)
Blog

Pl. így:
$n = ($str =~ tr/Horch//);


piadex2
(senior tag)

Hello!

A kódot köszönöm, ment vele kapcsolatban kérdés privátban.
Újabb kérdés támadt:
van egy szöveg, amiben a "hide" szó többször előfordul. Hogyan lehet olyat csinálni, hogy megkeresem a hide szót, és - mivel ez egy html kód - megkeresem a hide szó előfordulása közvetlen előtti kacsacsőr mentes részt?
kacsacsőr mentes rész: nem kezdődik kacsacsőr és nem is végződik, pusztán a szöveg látható
Előre is kösz a segítséget.

piadex2


vipisti
(tag)
Blog

Kösz a figyelmeztetést, az előző kód nem azt csinálja, amit kértél. Nem ártott volna legalább kipróbálnom, bocs... :W
A helyes megoldás:

$n++ while ($str =~ /Horch/g);


vipisti
(tag)
Blog

<hide>ezt a szöveget akarod kiszedni?</hide>

A megoldás:
print "$1\n" while ($str =~ /\<hide\>([^<>]+)\<\/hide\>/g);

Lényeges része a mintának a [^<>]+, amivel tetszőleges karaktersorozatot engedsz meg, kivéve a kacsacsőröket.


piadex2
(senior tag)

Hello!

Először is kösz a segítséget.
Másodszor: pedig lenne egy olyan problémám, hogy a html kódból szeretném kiszedni a szöveget. Azt a részt, ami így : ...> szöveg szöveg ... szöveg <... található meg - vagyis kifordított kacsacsőrök között van.
Én már írtam rá kódot:
open(READER,"szoveg.htm");

while( $line = <READER> ){

if ($line =~ /\>([^<>]+)\</g){
$gyujtes = $line;
}

print "$gyujtes\n";
}

close READER;
$input=<STDIN>;

de nem úgy működik - nem tudom miért -, ahogy kellene.
Segítség ill. előre is kösz a segítséget.

piadex2


vipisti
(tag)
Blog

open(READER,"index.html");
@contents = <READER>;
close READER;

$contents = join '', @contents;

while ($contents =~ /\>([^<>]+)\</g)
{
print "$1\n";
}

Kiindulásnak használd a fentit. A kód tényleg csak a ><-ök közti szövegeket nézi így, de ne felejtsd el, h a html tagok egymásba ágyazhatók (ezért lesznek ennek az outputjában üres sorok, pl. </div></div> miatt).


vipisti
(tag)
Blog

Ja, még valami. A =~ operátor megcsinálja a mintaillesztést, de változatlanul hagyja a bal oldalán levő változót (amiben keresel). Ha használsz csoportsítást a mintában ()-kel, akkor a zárójeleken belüli találat a $1-ba kerül (több csoportnál rendre $2, $3 stb.).


piadex2
(senior tag)

Hello!

Kösz a segítséget!
Máshol azt ajánlották, hogy a perlben HTML parser-t használjak, mert különben nagyon elbonyolodok - mivel ez a válasz előbb jött ezt az utat kezdtem el bejárni.
Most viszont egy olyan kérdésem lenne, hogy az alábbi kód:
my ($one, $two) = 2;

print "$one plus $two\n";
print "$two\n";

miért nem azt adja ki, hogy:
2 plus 2
2
miért azt, hogy:
2 plus

-----vége------
Igazából az egyszerre történő értékadást próbáltam tesztelni, és ezért állok értetlenül az eredmény előtt.
Előre is kösz a segítséget!

piadex2


piadex2
(senior tag)

Hello!

Eredetileg my ($one, $two) = @_; volt. Kiderült, hogy a @_ egy lista. Innentől kezdve nyilvánvaló volt, hogy a "my ($one, $two) = 2;" helyett "my ($one, $two) = (1,2);" kell, és akkor minden érték látszódik.
Téma lezárva.

piadex2


vipisti
(tag)
Blog

A minták használatát, meg az alap perles dolgokat nem árt, ha először megtanulod/begyakorlod. Persze a CPAN tele van már megírt modulokkal, komplexebb problémák megoldása előtt nem árt böngészni.


piadex2
(senior tag)

Hello megint!

Van egy file-om: file, amit hiába próbálok a HTML Parserrel feldolgoztatni pl úgy, hogy a HTML kódot egy másik file-ba másoltatom, mindössze egy üres file-t kapok végeredményül. Mit csinálok rosszul? (ha egyszerűbb html file-lal próbálkozom, akkor nincs gond)
Előre is kösz a segítséget.

piadex2

vipisti: amúgy átnéztem (úgy ahogy) a reguláris kifejezéseket, a file műveleteket, meg még néhány alapot - elméletileg elégnek kell lennie ezeknek


piadex2
(senior tag)

Hello!

Azt hittem, hogy valami nagy probléma van, amiről nem tudok, de kiderült, hogy a feldolgozandó file nevét rosszul ütöttem be ezért nem történt semmi.
Elnézést a fórum terheléséért.

piadex2


piadex2
(senior tag)

Sziaszok!

Ha van egy kódom, ami megkeresi az összes w-vel és nagy w-vel kezdődő szót, akkor hogyan kell módosítani ezt a programot ahhoz, hogy a megtalált szavakat kiírja a képernyőre?
Előre is kösz a választ:

piadex2


furu818
(csendes tag)

Hali!

Nem tudja valaki véletlenül, hogy egy helyi hálózatban lévő géphez hogyan tudok hozzáférni? Csak a könyvtár struktúráját akarnám bejárni, és pár dolgot kimásolni.
A gép a hálózaton simán "\\gepnev\akarmi" formában érhető el és tartozik hozzá külön jelszó és felhasználónév.
Ha esetleg valaki tudja, hogy hogyan kell elérni sima open függvénnyel, vagy valamilyen modullal az kérem írjon!

Köszi


!wannabe
(tag)

# na élesszük fel

Sziasztok!

Írnék egy scriptet amely egy beolvasott listából (amelyben szerepel vezeteknev, keresztnev) kislistázni azokat amelyeknek a keresztneve paratlan hosszusagu. A megszokott ($_%2) stringekre nem működik csak számokra ha jól sejtem. Hogyan lehetne megvizsgálni, hogy egy string páros vagy páratlan hosszusagú-e?

Előre is köszi a válaszokat.


szilu84
(tag)

$string = "hello";
$hossz = length $string;

if ( $hossz % 2 eq 1 ) {
print "paratlan\n";
}
elsif ( $hossz % 2 eq 0 ) {
print "paros\n";
}

Ha még aktuális egyáltalán :DDD


!wannabe
(tag)

Szia,

Köszi a megoldást, persze ez mindig aktuális :)


buherton
(őstag)
Blog

Nem tegnap volt az utolsó hsz, de hát ha ide téved valaki.

Kérdésem: hogyan lehet shell szkriptet programozni perlben? Gondolok itt az install-tól, az ls-ig.

[ Szerkesztve ]


Jester01
(veterán)
Blog

Ezt a kérdést nem is értem :F
A shell scriptet a shell futtatja. A perl scriptet meg a perl. Fából vaskarika?


buherton
(őstag)
Blog

Értem, bocsi a buta kérdésért. Akkor a shell-es dolgokat abban kell írni :O . Fordító mindenre érzékeny...


alapz@j
(tag)
Blog

Lehet hogy rosszul értem, de arra vagy kíváncsi, hogy hogyan lehet Perl programból shell utasításokat kiadni? Mert erre vannak a system(parancs) és az exec(parancs) utasítások, a system bevárja az eredményt, az exec pedig csak végrehajt. Ha az eredménye is kell a folyamatnak, akkor backtick:

exec(PROGRAM);
$sikerultvagynem = system(PROGRAM);
$kimenet = `PROGRAM`;


buherton
(őstag)
Blog

Igen arra gondoltam :) . Köszi :R . Ki tudja mikor jön jól. Mert ebben talán egyszerűbb program telepítő csomagot összedobni mint shell szkriptben. Vagy éppen grub helyreállítót összedobni, nem kell mindent sort mindig leírni, stb...


Osiris
(őstag)

Sziasztok!

Van egy @array tömböm, aminek az elemei karakterláncok -> nevek: vezetéknév+keresztnév+harmadiknév+és így tovább. Ezt a tömböt szeretném rendezni keresztnév szerint, vagyis a az első szóköz utáni listalem szerint.
Mi erre a megoldás? :F


alapz@j
(tag)
Blog

Ezen az oldalon alul vannak példák az ilyen rendezésekre.


Mijo
(tag)

Gondolom már nem aktuális, de jól esett kitalálni a megoldást:

#!/usr/bin/perl

use strict;

my @input = (
'1.+Béla',
'Örök+Eutanázia+Roberta',
'Kiss+Miska+András',
'Aaa+Aaa',
);

sub def_k {
shift =~ m/\+([^+]+)/;
return $1 || "";
}

my @output =
#map { $_->{'o'}}
sort { $a->{'k'} cmp $b->{'k'} }
map +{ 'o'=>$_, 'k'=> def_k($_) }, @input;

foreach my $o (@output) {
#print join( "\n", @output );
print $o->{'k'}.' -- '.$o->{'o'}."\n";
}

Az alkalmazott ötlet a http://en.wikipedia.org/wiki/Schwartzian_transform. A két kommentelt sor a teszteléshez van, élesben az első map veszi ki az eredeti stringeket a hashekből.
Remélem valakinek még hasznos lesz!
Üdv: Mijo


alapz@j
(tag)
Blog

Félofftopic, de megjelent a Perl 5.14, benne teljes Unicode 6 támogatással, gyorsabb futás mellett kevesebb memórifogyasztással és sok más okossággal. Részletesebben pl. itt:
[link]

[ Szerkesztve ]


Peter789
(senior tag)
Blog

Sziasztok!

az alábbi kis linuxos perl kód módosítására szeretnék segítséget kérni:

#!/usr/bin/perl

$file = '/dev/ttyS1';
open(SER, $file);

while (TRUE)
{
$input = getc(SER);
print $input;
}

close(SER);

ez szép és jó, de csak soronként hajlandó fogadni a bejövő karakterláncokat - mindig vár egy ASC10 vagy 13-ast, akkor lép csak tovább a print-re

létezik karakter típusú változó, amivel mindig továbbmenne ? vagy van rá valami más megoldás ?

előre is köszönöm a válaszokat,
Péter


Mijo
(tag)

Szia!
Első tanács, használj objektumokat, pl. ezt:
http://search.cpan.org/~cook/Device-SerialPort-1.002/SerialPort.pm
Gondolom van még számos a CPAN-on, ami a soros portot kezeli.

A getc leírása szerint, ez a függvény nem alkalmas a karakterenkénti olvasásra, mert entert vár hozzá, ahogy írtad is.
Meg lehetne próbálni a különböző olvasó függvényeket: sysread, read,...

létezik karakter típusú változó, amivel mindig továbbmenne ?
Konkrétan karakter típus nincs. Skalár van, ami tárolhat egy vagy több karaktert (stringet), egész vagy tört számot (integer, float, ...), meg egyebeket (objektumok, referenciák,...), de ezek között nincs éles határ, mint C-ben.
A kérdésed abból a szempontból rossz, hogy nem a változóddal mondod meg a függvénynek, hogy mikor és mivel térjen vissza.

Üdv: Mijo


Osiris
(őstag)

Szasztok!

Van egy $sor változóban egy karakterláncom:

$sor = "Németország 276 DEU DE ISO 3166-2:DE"

Hogy tudom a $sor változó első 3db egymást követő számjegysorozatának az első indexét kideríteni?

Így szerettem volna, de nem jó:

$pos = (index ($sor, /\d\d\d/));

:F


Mijo
(tag)

Szia!

Ha a számok kellenek, akkor ezt a reguláris kifejezést tudom javasolni:
$sor =~ m/^[^\d]*(\d{3})/;
$szam = $1;

Ha a tényleg a pozíció érdekel:
$sor =~ m/^([^\d]*)\d{3}/;
$poz = length( $1 );

És ezt lehet kombinálni is. :)
$sor =~ m/^([^\d]*)(\d{3})/;
$poz = length( $1 );
$szam = $2;

Ajánlott olvasmány, ha Perlben sztringeket kell szabni-varrni:
http://perldoc.perl.org/perlre.html

Üdv: Mijo


Osiris
(őstag)

Kössz a gyors választ!

Azt nem értem, hogy a $1 és $2 változók azok mikor kapnak értéket?


Mijo
(tag)

Azok a reguláris kifejezésből kapják az értéket, a ( és ) közötti részeket veszik fel.
$str = 'abcdef';
$str =~ m/(...)(...)/;
print $1; # 'abc'
print $2; # 'def'

Amit linkeltem doksi oldal szépen leírja az összes lehetőséget. Ha magyarul szeretnéd inkább és nem ilyen mélységekben, ezt nézd meg:
http://nyelvek.inf.elte.hu/leirasok/Perl/

Üdv: Mijo


Osiris
(őstag)

Ez lett a megoldás:

$orszagnev = "USA Amerikai Csendes-óceáni szigetek 581 UMI UM ISO 3166-2:U";
chomp ($orszagnev);
$poz = index($orszagnev, "\t");
$orszagnev = substr($orszagnev, 0, $poz-1);
print "$orszagnev\n"

A kimenet:

USA Amerikai Csendes-óceáni szigetek

Ui.: a tabulátor szivatott, space-nek hittem.

@ Mijo:
Van itt előttem egy ~750 oldalas könyv, de valami összeszedettebb dolog kellene, majd megnézem amit linkeltél.
Thx!

[ Szerkesztve ]


Mijo
(tag)

Kezdetnek ezt a cikket, cikksorozatot megnézhetnéd, elég jól magyarázza az alapokat.
http://prog.hu/cikkek/443/Mintaillesztesek.html

Ha biztos vagy abban, hogy tab szeparált a sorod, ezt is használhatod:

$orszagnev = "USA Amerikai Csendes-óceáni szigetek 581 UMI UM ISO 3166-2:U";
chomp( $orszagnev );
@rekordok = split( /\t/, $orszagnev );
print "$rekordok[0]\n";

Üdv: Mijo


Dumas
(csendes tag)

Sziasztok!

Egy olyan problémám lenne, hogy per-lben kilistázok pár dolgot egy fájlba. Termék kódját és a termék elkészülésének dátumát. Jelenleg a termék kódja szerint rakja sorba őket. Őszinte leszek, nem igazán értek a perl-hez. A kérdésem az lenne, hogy, hogy tudnám megoldani, hogy dátum szerint rakja sorba a termékeket?
Tehát most úgy van, hogy mondjuk A-termék: 10:00 B-termék: 8:00 C-termék: 12:00.
Helyette kéne úgy, hogy: B-termék: 8:00 A-termék:10:00 C-termék:12:00.

Előre is köszönöm a választ annak aki esetleg tud segíteni benne :)


Mijo
(tag)

Szia!
Milyen struktúrában található az adatod?

Tömb esetén mondjuk legyen ilyen:

$data = [
[ 'A', '2012.08.24. 10:00' ],
[ 'B', '2012.08.24. 08:00' ],
[ 'C', '2012.08.24. 12:00' ],
];

Ezután szépen átalakítjuk:

my @sorted = sort { $a->[1] cmp $b->[1] } @$data;

Ez alap esetben szövegeket hasonlít össze, ha nem ilyen szép az időformátumod akkor érdemes egy függvényhívással ilyenre alakítani, ami a fenti linken a map { } @data rész lenne.

my @sorted = map { $_->[1] } # visszavesszük az eredeti rekordot
sort { $a->[0] cmp $b->[0] } # rendezünk timstamp szerint
map { [ make_timestamp( $_->[1] ), $_ ] } # elkészítjük a [ timestamp, [eredeti rekord] ] struktúrát
@$data; # bemenet

Remélem ennek segítségével sikerül megoldani, de kérdezz bátran, ha elakadasz!
Üdv: Mijo


Dumas
(csendes tag)

Köszi szépen, ez alapján megpróbálkozok vele :R , de igen, kicsit pontatlan voltam a leírásnál. Mert ráadásul az adatokat is máshonnan nyerem ki :)

Write_log("script started");
$mappres=MappNetSrc($netpath);
Write_log("mapping $netpath");
if($mappres==1)
{
my $name_date= get_timestamp4();
if(!(-d $netpath))
{
Write_log("mapping source error $_[0]");
}
else
{
Write_log("mapping source $_[0] is mapped succesfully");

if((opendir SO, $sourcedir) ==1)
{
Write_log("$sourcedir has been opened");
$today = get_timestamp3();

open out, ">", $lstfiledir.$name_date.'_'.$cell.'.lst' or die $!;
print out "Barkod;Ido\n";
while ($file = readdir(SO))
{
if ($file ne "." and $file ne "..")
{
$fidate=get_creation_time($sourcedir."\\$file");
if ($fidate gt get_timestamp())
{
Write_log("$sourcedir"."\\$file"." creation time is:".$fidate);
open input, "<","$sourcedir"."\\$file" or die $!;
#my $lines = <input>;
while (<input>)
{
#print $_;

$date_from_file =substr($_,0,10);
#print $today.'-'.$date_from_file.'';
if ($today eq $date_from_file)
{
#print $_;
my $out_date =substr($_,11,8);
my $out_ttnr =substr($_,24,6);
print out $out_date .';'.$out_ttnr."\n";

Itt a végén jön ki ugye a $out_date-nél a kimeneti dátum, a $out_ttnr, pedig a száma.
Jelenleg úgy gondoltam, hogy beviszem külön azt a részt amit most csak printelek a végén. És azt "sort"olom. ha az úgy megoldás lehet.

[ Szerkesztve ]


Mijo
(tag)

Szia!

Ha ilyen bonyolult az adatok kinyerése, talán inkább előbb írjad ki egy fájlba, majd a Tie::File modullal nyisd meg a fájlt, és rendezd a fenti módszerrel. Lehet egy kis tesztelést igényel, hogy mekkora cache-t kapjon a modul, hogy a jellemzően előforduló fájlmérettel gyorsan megbírkózzon, és ne kelljen a vinyóra pakolni folyamatosan.
Amit még tehetsz, hogy egyből Tie::File-ba pakolod az adatokat, majd a végén rendezel újabb megnyitás nélkül.

Üdv: Mijo


Peter789
(senior tag)
Blog

sziasztok!

hátha még valaki téved errefelé... :)

valahogyan lehetséges a device::serialport-al vagy bármi mással perl alatt 9 bites csomagokat fogadni? a küldés nem is érdekes, csak a fogadás... adott egy speciális protokol, ahol a 8 bites adatcsomagokat mindig követi egy 9dik bit aminek szintnén van jelentősége - ez mondja meg hogy mikor kezdődik új parancs. lehet valahogy kezelni ezt az utolsó bitet? a databits csak 5,6,7,8 lehet - 9-nél ki is akad. esetleg valahogyan lehet a paritással bűvészkedni? aktiválni a paritás fogadását de ignorálni hogy hibás e a byte szerinte, viszont használni egyéb célra azt a bitet?

üzenetek