Perl @ARGV

Тема в разделе "Другие языки", создана пользователем KHyT, 24 сен 2011.

Модераторы: Цукер
  1. KHyT

    KHyT

    Регистр.:
    26 апр 2008
    Сообщения:
    328
    Симпатии:
    27
    Код:
    #!/usr/bin/perl -w
    use strict;
    my $foo = join('',@ARGV);
    if (is_tainted($foo)) {
            print "\$foo is tainted. Attempting to launder\n";
            my $pattern = qr(^\d{3}(-|\s+)?\d{3}(-|\s+)?\d{4}$);
            $foo = untaint($foo, $pattern);
    }else{
            print "\$foo is not tainted!!\n";
    }
    sub is_tainted {
            my $check = shift;
            return  !eval { $check++, kill 0;1;};
    }
    sub untaint {
            my ($foo, $pattern) = @_;
            if ($foo =~ /($pattern)/) {
                    $foo = $1;
                    print "\$foo has been laundered!!\n";
                    return $foo;
            }else{
                    print "Unable to launder \$foo\n";
                    return $foo;
            }
    }  
    
    Объясните Новичку код а именно действия @ARGV это что то типа массива который принемает параметры командной строки, но где и куда вводятся эти параметры и каким образом??
     
  2. MishaMW

    MishaMW Писатель

    Регистр.:
    12 ноя 2008
    Сообщения:
    4
    Симпатии:
    1
    Массив @ARGV - это список аргументов переданных скрипту в момент его запуска.
    Например, так
    Код:
    %perl script_name.pl a b c d e
    Далее у вас эти параметры объединяются в одно слово (abcde) и передаются в функцию.
     
    KHyT нравится это.
  3. KHyT

    KHyT

    Регистр.:
    26 апр 2008
    Сообщения:
    328
    Симпатии:
    27
    cпасибо прояснилось
    А вот из этого же кода вот эту строку $foo = $1;
    Код:
    sub untaint {
            my ($foo, $pattern) = @_;
            if ($foo =~ /($pattern)/) {
                    [COLOR="Red"]$foo = $1;[/COLOR]
                    print "\$foo has been laundered!!\n";
                    return $foo;
            }else{
                    print "Unable to launder \$foo\n";
                    return $foo;
            }
    }
    
    ведь нельзя использовать цифры в переменых $123 и т.д =
     
  4. mcdir

    mcdir

    Регистр.:
    6 ноя 2007
    Сообщения:
    202
    Симпатии:
    37
    @ARGV
    Массив параметров строки запуска программы. Внимание! @#ARGV - меньше количества параметров на 1, т.к. $ARGV[0] это первый параметр (не имя программы).
    ...
    $foo = $1;
    это регулярки
    см http://xpoint.ru/forums/programming/perl/regexp/faq.xhtml
    или
    Что лучше использовать - $1 или $&?
    Проблема:
    Если в программе или в любом подключаемом ей модуле есть хоть одно упоминание о $&, $` или $', то для каждого успешного совпадения регулярного выражения Perl будет заполнять эти переменные, что, мягко говоря, иногда очень ресурсоемко.
    Вдобавок, использование переменных этого семейства подавляет некоторые оптимизации при заменах.
    Вердикт:
    Полностью исключить использование этих переменных и модулей их содержащих.
    Альтернативы:

    $& - заключить все выражение в ()

    $` - (.*?) перед выражением

    $' - (?=(.*)) после выражения
    И использовать $1-$9.
    Пример:
    $str = '1'x1000000;
    $str =~ /1/;
    $str = 'abc'; # Эту строку можно убрать
    $str =~ /a/; # Эту строку можно убрать
    $';

    После первого регулярного выражения для переменной $' резервируется дополнительный мегабайт в памяти. Теперь, этот мегабайт так и останется зарезервированным независимо от того, что логически, после второго регулярного выражения "длина" $' будет только 2 байта.

     
    KHyT нравится это.
  5. KHyT

    KHyT

    Регистр.:
    26 апр 2008
    Сообщения:
    328
    Симпатии:
    27
    Код:
    sub read_file
    {
        local @ARGV = shift;
        [B][COLOR="Red"]local $/ = wantarray ? $/ : undef;
        <>;[/COLOR][/B]
    }
    обьясните пожалуйста код функции