سؤال

وأنا تحليل ملفات XML مع شيء من هذا القبيل:

while (<files/*.xml>) { ... }

وأريد أن استخدام ثابت "ملفات"، ويقول

use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }

وأرجو أن تفهم هذه الفكرة، ويمكن أن تساعد لي:) ..

وشكرا لكم مقدما.

هل كانت مفيدة؟

المحلول

وهم، وهذا هو أحد الأسباب لاستخدام قراءة فقط بدلا من ثابت. قد تكون قادرا على استخدام & بداية أو () في نهاية ثابت للحصول على بيرل لتحقيق ذلك هو روتين. اسمحوا لي أن تحقق.

وكلا، ولكن يمكنك استخدام خدعة الكلاسيكية من خلق arrayref إلى dereference:

#!/usr/bin/perl

use strict;
use warnings;

use constant DIR => "/tmp";

print map { "$_\n" } <${[DIR]}[0]/*>;

ولكن منذ glob "*" هو نفس <*> قد تفضل:

#!/usr/bin/perl

use strict;
use warnings;

use constant DIR => "/tmp";

print map { "$_\n" } glob DIR . "/*";

وأنا ربما يقول

#!/usr/bin/perl

use strict;
use warnings;

use Readonly;

Readonly my $DIR => "/tmp";

print map { "$_\n" } <$DIR/*>;

نصائح أخرى

وكما قال آخرون، وهذا هو كل شيء عن الاستيفاء السلسلة.

وفشل PRAGMA مستمر في سياقات interpolative، لذلك يجب عليك استخدام شيء من شأنها أن تعمل.

وكما سبق ذكره، للقراءة فقط هي خيار واحد.

ويمكنك أيضا استخدام القديمة "تعيين قيمة للقراءة فقط إلى خدعة typeglob".

our $FILES_PATH; # declare FILES_PATH scalar to keep strict happy.
*FILES_PATH = \'files';  # Assign to typeglob so $FILES_PATH points to a string literal  

while( <$FILES_PATH/*.xml> ) {
    # read the files
}

وبالتأكيد "/" في هذا السياق سيتم التعامل معها على أنها الانقسام والتي ليس من المرجح أن تذهب إلى أي مكان. أعتقد أنك قد تحتاج إلى خطوة الى الوراء قليلا وننظر إلى ما الخيارات الأخرى لديك. أعتقد أنك تحاول أن تفعل "ملف globbing" ويبدو لي أن أذكر الدعم في بيرل لذلك على الرغم من أنني لا أذكر التفاصيل. هناك "غلوب" وحدة في CPAN التي قد ترغب في النظر في. شخصيا سأكون الكثير من المشاة ومجرد استخدام DirHandle وتصفية الملفات غير XML مع "بجوار ... إلا إذا ..." سطر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top