Редактирование, чтобы быть более кратким, простите.
Мне нужно иметь возможность извлекать из массива, используя строку, которая может содержать один из следующих символов: '.', '+', '/', '-'.Строка будет получена от пользователя.Массив содержит каждую строку файла, который я просматриваю (я сжимаю файл в массив, чтобы не оставлять его открытым, пока пользователь взаимодействует с программой, потому что он находится в cron, и я не хочу его иметьopen, когда запускается cron), и каждая строка имеет уникальный идентификатор, который является основой для строки поиска, используемой в регулярном выражении.Приведенный ниже код показывает оператор grep, который я использую, и я использую OUR и MY в своих программах, чтобы сделать переменные, к которым я хочу получить доступ, во всех пространствах имен, а те, которые я использую только в подпрограммах, - нет.Если вы хотите попытаться повторить проблему
#!/usr/bin/perl -w
use strict;
use Switch;
use Data::Dumper;
our $pgm_path = "/tmp/";
our $device_info = "";
our @new_filetype1 = ();
our @new_filetype2 = ();
our @dev_info = ();
our @pgm_files = ();
our %arch_rtgs = ();
our $file = "/path/file.csv";
open my $fh, '<', $file or die "Couldn't open $file!\n";
chomp(our @source_file = <$fh>);
close $fh;
print "Please enter the device name:\n";
chomp(our $dev = <STDIN>);
while ($device_info eq "") {
# Grep the device info from the sms file
my @sms_device = grep(/\Q$dev\E/, @source_file);
if (scalar(@sms_device) > 1) {
my $which_dup = find_the_duplicate(\@sms_device);
if ($which_dup eq "program") {
print "\n-> $sms_dev <- must be a program name instead of a device name." .
"\nChoose the device from the list you are working on, specifically.\n";
foreach my $fix(@sms_device) {
my @fix_array = split(',', $fix);
print "$fix_array[1]\n";
undef @fix_array;
}
chomp($sms_dev = <STDIN>);
} else { $device_info = $which_dup; }
} elsif (scalar(@sms_device) == 1) {
($device_info) = @sms_device;
@sms_device = ();
}
}
Когда я пытаюсь код с привязкой:
my @sms_device = grep(/\Q$dev\E^/, @source_file);
Больше никаких действий со стороны программы не замечено.Он просто сидит там, как будто ждет еще каких-то комментариев от пользователя.Это не то, что я ожидал.Причина, по которой я хотел бы привязать шаблон поиска, заключается в том, что существует множество примеров устройств с одинаковыми именами, которые имеют тот же порядок символов, что и шаблон поиска, но также включают в себя дополнительные символы, которые игнорируются в оценке регулярного выражения.Я не хочу, чтобы их игнорировали в том смысле, что они включены в матчи.Я хочу установить точное совпадение строки в переменной.
Заранее благодарен за пробежку по моему ужасно неопытному коду и попытки связи, чтобы детализировать мою проблему.