@taaadm

Как получается элемент списка?

Вот прога с сайта Zabbix:
#!/usr/bin/perl
 
$first = 1;
 
print "{\n";
print "\t\"data\":[\n\n";
 
for (`cat /proc/mounts`)
{
    ($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
    $fsname =~ s!/!\\/!g;
 
    print "\t,\n" if not $first;
    $first = 0;
 
    print "\t{\n";
    print "\t\t\"{#FSNAME}\":\"$fsname\",\n";
    print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";
    print "\t}\n";
}
 
print "\n\t]\n";
print "}\n";


Цикл по полученному списку (`cat /proc/mounts`). Но как тут получается элемент списка? Где какое ни будь присваивание, на пример? Объясните пожалуйста
  • Вопрос задан
  • 2384 просмотра
Пригласить эксперта
Ответы на вопрос 3
@krypt3r
Вот присваивание:
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
ЗЫ. Сплошной гoвнoкoд. Лучше что-то типа
#!/usr/bin/perl

use strict;
use warnings;
use JSON;
 
open my $F, '<', '/proc/mounts' or die "open() error: $!\n";
my ($fsname, $fstype, %result);
while (<$F>)
{
    ($fsname, $fstype) = (split /\s+/)[1, 2];
    #$fsname =~ s!/!\\/!g;
    push @{$result{'data'}}, {'{#FSNAME}' => $fsname, '{#FSTYPE}' => $fstype};
}
close $F;
print JSON->new->pretty->encode (\%result);
Ответ написан
@pcdesign
В этой строке происходит присваивание:
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;

Переменной $fsname присваивается $1, а переменной $fstype присваивается $2.
Если вы спросите, что такое $1, а что такое $2?
То это результат того, что было найдено в регулярном выражении.
Первые круглые скобки - это $1.
Вторые круглые скобки - это $2.
Ответ написан
@dionys
Операция `` возвращает список строк. В цикле for каждая строка неявно попадает в специальную переменную $_. Следующая операция m// также неявно работает с этой переменной. В явном виде цикл будет выглядеть так:

for my $_ (`cat /proc/mounts`) {
    ($fsname, $fstype) = $_ =~ m/\S+ (\S+) (\S+)/;
    ...
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы