-1

より簡潔になるように編集します、ご容赦ください。

「.」、「+」、「/」、「-」のいずれかの文字を含む可能性のある文字列を使用して、配列から grep できる必要があります。文字列は、ユーザーから取得されます。配列には、検索しているファイルの各行が含まれています(ユーザーがプログラムとインターフェースしている間、ファイルを開いたままにしないように、配列にファイルを詰め込んでいます。これは、cron上にあり、それを持ちたくないためです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);

プログラムからのこれ以上の活動は見られません。ユーザーからの入力を待っているかのように、ただそこに座っているだけです。これは私が期待したことではありません。検索パターンを固定したい理由は、検索パターンと同じ文字順序を持ち、正規表現評価で無視される追加の文字も含む、類似した名前のデバイスの例が非常に多くあるためです。それらが一致に含まれているという意味で、それらを無視したくありません。変数内の文字列の正確な一致を強制したい。

私のひどく経験の浅いコードと、私の問題を詳述するためのコミュニケーションの試みをざっと見てくれてありがとう。

4

2 に答える 2