У меня есть код, который мне удалось сузить до следующего примера наименьшего кода.
Сначала у меня есть модуль plugh.pm
, который отвечает за чтение в файле конфигурации. В основном это можно заменить следующим текстом, который устанавливает один элемент конфигурации:
use strict;
use warnings;
sub cfgRead () { $main::cfg{"abc"} = "/usr"; }
1;
Затем у меня есть основная программа, которая использует этот модуль следующим образом, просто вызывает функцию для настройки элементов конфигурации и затем использует один из этих элементов в подпрограмме:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.005;
require File::Basename;
import File::Basename "dirname";
push (@INC, dirname ($0));
require plugh;
my (%cfg);
sub subOne () {
my $list = `ls -1 $main::cfg{"abc"}`;
my @list = split (/\s+/, $list);
my $fspec;
foreach $fspec (@list) {
print $fspec . "\n";
}
}
sub mainLine () {
cfgRead();
subOne();
}
mainLine();
Теперь, когда я запускаю это, я получаю следующий вывод: первая строка - стандартная ошибка, а остальные - стандартный вывод:
Name "main::cfg" used only once: possible typo at /home/xyzzy/bin/xyzzy line 15.
bin
games
include
lib
lib64
local
sbin
share
src
Строка, на которую он жалуется, - это создание подпроцесса ls -1
. У меня вопрос просто: и что? Да, я использую его только один раз, но почему это вообще проблема?
Если бы я никогда не использовал его, тогда хорошо, но я не понимаю, почему Perl предупреждает меня об использовании его только один раз.
Я получаю переменную из ассоциативного массива, а затем использую ее для получения списка каталогов. Существует ли какое-то странное руководство по Perl, согласно которому переменные состояний должны использоваться как минимум дважды? Семь раз? Сорок два? Я серьезно озадачен.