Как я лучше всего передаю аргументы остроте Perl?

У меня есть файл, someFile, как это:

$cat someFile
hdisk1 active
hdisk2 active

Я использую этот сценарий оболочки для проверки:

$cat a.sh
#!/usr/bin/ksh
for d in 1 2
do
    grep -q "hdisk$d" someFile && echo "$d : ok"
done

Я пытаюсь преобразовать его в Perl:

$cat b.sh
#!/usr/bin/ksh
export d
for d in 1 2
do
    cat someFile | perl -lane 'BEGIN{$d=$ENV{'d'};} print "$d: OK" if /hdisk$d\s+/'
done

Я экспортирую переменную d в сценарии оболочки и получают использование значения %ENV в Perl. Существует ли лучший способ передать это значение остроте Perl?

20
задан Peter Mortensen 22 October 2012 в 13:45
поделиться

5 ответов

Вы можете включить рудиментарные аргументы командной строки с помощью переключателя "s". Для каждого аргумента, начинающегося с тире, определяется переменная. -- указывает, где начинаются ваши аргументы командной строки.

for d in 1 2 ; do 
  cat someFile | perl -slane ' print "$someParameter: OK" if /hdisk$someParameter\s+/' -- -someParameter=$d; 
done

См: perlrun

31
ответ дан 29 November 2019 в 23:52
поделиться

Передайте его в командной строке, и он будет доступен в @ARGV:

for d in 1 2
do
  perl -lne 'BEGIN {$d=shift} print "$d: OK" if /hdisk$d\s+/' $d someFile
done

Обратите внимание, что оператор shift в данном контексте удаляет первый элемент @ARGV, который в данном случае является $d.

2
ответ дан 29 November 2019 в 23:52
поделиться

Если у вас возникли проблемы с написанием однострочника, возможно, это немного сложно для одной строки (только мое мнение). Я бы согласился с предложением @FM и все сделал бы на Perl. Прочтите весь файл, а затем проверьте его:

    use strict;
    local $/ = '' ; # Read in the whole file
    my $file = <> ;

    for my $d ( 1 .. 2 )
    {
        print  "$d: OK\n" if  $file =~ /hdisk$d\s+/
    }

Вы можете сделать это циклически, но это займет больше времени. Конечно, это в некоторой степени зависит от размера файла.

Обратите внимание, что все примеры Perl до сих пор выводят сообщение для каждого совпадения - можете ли вы быть уверены, что нет дубликатов?

2
ответ дан 29 November 2019 в 23:52
поделиться

Это выглядит хорошо, но я бы использовал:

for d in $(seq 1 2); do perl -nle 'print "hdisk$ENV{d} OK" if $_ =~ /hdisk$ENV{d}/' someFile; done
0
ответ дан 29 November 2019 в 23:52
поделиться

Комбинируя некоторые из предыдущих предложений и добавляя свой собственный сахар, я бы сделал это так:

perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d='[value]' [file]

[value] может быть числом (например, 2), диапазоном (например, 2-4), списком различных чисел (например, 2|3|4) (или почти чем угодно другим, что является допустимым шаблоном) или даже переменной bash, содержащей одно из них, например:

d='2-3'
perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d=$d someFile 

и [file] - имя вашего файла (то есть, someFile).

1
ответ дан 29 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: