كيف تطبع الخطوط غير المتطابقة؟

البرنامج النصي الذي قمت بكتابته يخرج جميع الأسطر من الملف 2 الذي يبدأ برقم موجود في الملف 1 .

على سؤال </قوي>

كيف أقوم بإنتاج جميع الأسطر الأخرى غير المتطابقة؟

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @res;

open(FILE, '<', "1") or die $!;
while (defined (my $line = )) {
  chomp $line;
  push @res, $line;
}
close FILE;

open(FILE, '<', "2") or die $!;
while (defined (my $line = )) {
  chomp $line;
  $line =~ m/(\d+)/;

  if (defined $1) {
    foreach my $a (@res) {
      if ($a == $1) {
        print $line . "\n";
      }
    }
  }
}
close FILE;

الملف 1

155
156
157
158
159
160

الملف 2

150 a
151 f
152 r
153 a
154 a
155 a
156 a
157 f
158 f
159 f
0
المعرّفة في بينما (المعرّفة (خطي $ = )) متكررة. ومع ذلك ، فإن فوائد استخدام filehandles معجمية في أصغر نطاق قابل للتطبيق بدلا من علب الملفات العالمية bareword الحزمة ليست كذلك.
وأضاف المؤلف Sinan Ünür, مصدر
لاحظ أنه إذا كان النظام الأساسي الخاص بك يوفر أمر grep متوافق مع POSIX ، فيمكنك استبدال البرنامج النصي بـ grep -f1 2 و grep -v -f1 2 . (الأول إذا كنت تريد البرنامج النصي الحالي ، والثاني إذا كنت تريد إصدار raina77ow .)
وأضاف المؤلف sarnold, مصدر

2 إجابة

إجابتك قريبة جدًا: إنها كافية لتغيير هذا

foreach my $a (@res) {
  if ($a == $1) {
    print $line . "\n";
  }
}

... الى هذا ...

my $found;
foreach my $a (@res) {
  if ($a eq $1) { # we compare strings, not numbers, even if these strings are 'numeric'
    $found = 1;
    print $line . "\n";
    last; # no need to look further, we already found an item
  }
}
print "Not matched: $line", "\n" unless $found; 

ومع ذلك لا يزال هناك شيء نتحدث عنه. ) نظرًا لأن كل هذه السلاسل الرقمية في الملف الأول فريدة ، فمن الأفضل استخدام تجزئة لتخزينها. في الواقع ، لن يتغير الرمز كثيرًا:

my %digits;
... # in the first file processing loop:
$digits{$line} = 1;
... # in the second file processing loop, instead of foreach:
if ($digits{$1}) { 
  print $line, "\n"; 
} else {
  print "Not matched: $line", "\n";
}

ولكن النقطة هي أن البحث في التجزئة هو أسرع بكثير من التكرار من خلال صفيف مرارا وتكرارا. )

0
وأضاف
بالتاكيد. ) هذه المهمة هي التسول حرفيا عن التجزئة ليتم تقديمها. )
وأضاف المؤلف raina77ow, مصدر
.. أنت ذاهب للحديث عن استخدام التجزئة بدلا من قائمة؟
وأضاف المؤلف sarnold, مصدر
use strict;
use warnings;

my %res;

open(FILE, '<', "1") or die $!;
while (defined (my $line = )) {
  chomp $line;
  $res{$line} = 1;
}
close FILE;

open(FILE, '<', "2") or die $!;
while (defined (my $line = )) {
  if ($line =~ m/(\d+)/) {
      print $line if not $res{$1};
  }
}
close FILE;
0
وأضاف