Schrift
[thread]8055[/thread]

wie ein array[0] nochmals aufspalten?



<< >> 8 Einträge, 1 Seite
zieglerch
 2006-06-05 03:29
#66995 #66995
User since
2006-04-26
23 Artikel
BenutzerIn
[default_avatar]
hallo,

hab da ein problem, wenn ich mein modem auslesen will per perl

Code: (dl )
1
2
3
4
5
6
7
use Net::Telnet ();
$t = new Net::Telnet;
$t->open("192.168.0.90");
$t->login("admin", "passwort");
@lines = $t->cmd("show dsl stat");

@maxrate = grep /Current Attainable Rate/, @lines;


der code gibt mir die zeile zurück

Current Attainable Rate - 2784000

und das ganze steht aber jetzt im $maxrate[0] aber wie splitte ich den ausdruck jetzt anhand von leerzeichen auf das ich zum schluss nur noch den wert 2784000 drinstehen habe, denn will ich dan in eine logdatei schreiben und nicht den text dazu noch

gruß
renee
 2006-06-05 12:00
#66996 #66996
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
my $value = (split(/\s/,$maxrate[0]))[-1];


wenn es in $maxrate[0] bleiben soll:

Code: (dl )
$maxrate[0] =~ s/.*?(\d+)$/$1/;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
zieglerch
 2006-06-05 13:29
#66997 #66997
User since
2006-04-26
23 Artikel
BenutzerIn
[default_avatar]
danke, der code funktioniert, aber könntest du vielleicht noch ein paar worte drüber verlieren wie das genau funtioniert dein ausdruck? bin absoluter perl anfänger :rock:

im bezug auf den teil des codes

Code: (dl )
@array =~ s/.*?(\d+)$/$1/;
Ronnie
 2006-06-05 13:44
#66998 #66998
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Die von renee gezeigte Variante ist sicher die üblichste und wahrscheinlich auch sinnvollste. Hier noch eine Variante mit einer getrennten Funktion first_match:
Code: (dl )
1
2
3
4
5
6
sub first_match ($@) {
my ($regex, @data) = @_;
my $result;
for (@data) { $result = $1 and last if /$regex/ }
return $result;
}

...
Code: (dl )
my $max = first_match qr/Current Attainable Rate -\s*(\d+)/, @lines;

Nachtrag: Bequemer kann man das ganze natürlich auch mit CPAN:List::Util haben.\n\n

<!--EDIT|Ronnie|1149500835-->
renee
 2006-06-05 13:47
#66999 #66999
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
CPAN:YAPE::Regex::Expression ist immer ganz gut, wenn man sich RegExes erklären lassen will:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
The regular expression:

(?-imsx:.*?(\d+)$)

matches as follows:

NODE EXPLANATION
----------------------------------------------------------------------
(?-imsx: group, but do not capture (case-sensitive)
(with ^ and $ matching normally) (with . not
matching \n) (matching whitespace and #
normally):
----------------------------------------------------------------------
.*? any character except \n (0 or more times
(matching the least amount possible))
----------------------------------------------------------------------
( group and capture to \1:
----------------------------------------------------------------------
\d+ digits (0-9) (1 or more times (matching
the most amount possible))
----------------------------------------------------------------------
) end of \1
----------------------------------------------------------------------
$ before an optional \n, and the end of the
string
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------


Außerdem solltest Du die substitution auf ein einzelnes Element machen, denn CPAN:warnings gibt Dir folgende Meldung:
Code: (dl )
Applying substitution (s///) to @array will act on scalar(@array) at skript.pl line 9.


Mehr zu dem was s/// macht findest Du in perlop.

Was $1 ist, wird in perlvar erklärt.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
zieglerch
 2006-06-05 13:52
#67000 #67000
User since
2006-04-26
23 Artikel
BenutzerIn
[default_avatar]
danke
Linuxer
 2006-06-05 14:44
#67001 #67001
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
[quote=renee,05.06.2006, 10:00]wenn es in $maxrate[0] bleiben soll:

Code: (dl )
$maxrate[0] =~ s/.*?(\d+)$/$1/;
[/quote]

Warum nicht folgendes, wenn es in $maxrate[0] bleiben soll?
Code: (dl )
$maxrate[0] = (split(/\s/,$maxrate[0]))[-1];
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
renee
 2006-06-05 15:45
#67002 #67002
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
geht auch -- TIMTOWTDI ;)

Ich wollte mehrere Möglichkeiten nennen. Die Möglicheiten kann man auch untereinander "kombinieren"...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 8 Einträge, 1 Seite



View all threads created 2006-06-05 03:29.