كيف يمكنني تقديم قيم غير محددة من Printf في بيرل؟

StackOverflow https://stackoverflow.com/questions/547042

  •  23-08-2019
  •  | 
  •  

سؤال

أبحث عن طريقة أنيقة للإشارة إلى القيم غير المحددة في المواقف التي عادة ما تقدم الأرقام المنسقة. سأعمل مثالا صغيرا. بالنسبة للمبتدئين، لا تستطيع ذلك بالطبع استخدام هذا:

#!/usr/bin/perl
use strict;
use warnings;
for my $s (1, 1.2, undef, 1.3) {
    printf "%5.2f\n", $s;
}

... لأن "تحذيرات الاستخدام" تظنك "استخدام القيمة غير المهجورة ..." على التكرار الثالث. لذلك الخطوة التالية شيء مثل هذا:

#!/usr/bin/perl
use strict;
use warnings;
for my $s (1, 1.2, undef, 1.3) {
    printf "%5.2f\n", $s//0;
}

و الصبي، هل أحب مشغل 5.10 '//' الجديد، بالمناسبة. لكن هذا حقا ليس ما أريد، إما، لأن قيمة $ S ليست صفر، إنه غير محدد. ما أريد حقا هو شيء مثل هذا:

#!/usr/bin/perl
use strict;
use warnings;
for my $s (1, 1.2, undef, 1.3) {
    printf "%5.2f\n", $s//q();
}

... لكنني لا أستطيع لأن هذا يولد "الوسيطة" "ليست رقمية ..." مشكلة في القيمة الثالثة.

هذا يجلبني إلى عتبة سؤالي. أستطيع أن أتمكن من كتابة التعليمات البرمجية التي تتحقق من كل رقم تنبعث منها عن NESS محددة، ويقوم بإنشاء سلسلة مختلفة من Forms Printf غير المستندة إلى F، ولكن، حسنا، ... Yuck.

هل حدد أي شخص طريقة لطيفة للتعامل مع هذا النوع من المتطلبات؟

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

المحلول

لا أعتقد أن هناك أي شيء يوك حول هذا الموضوع - إنه بالضبط ما تريد القيام به.

use strict;
use warnings;

my($raw) = [1, 1.2, undef, 1.3];
my($formatted) = [map((defined $_ ? sprintf('%5.2f', $_) : "(undef)"), @$raw)];

print '$formatted: <', join('> <', @{$formatted}), qq(>\n);

نصائح أخرى

انها ليست جميلة، ولكن أود أن أفعل ذلك فقط

defined($s) ? printf "%f.2f\n", $s : print "undef\n";

اعتقد ان لطيف الطريقة هي الكتابة / الحصول على prettyprinter عام تأخذ كل ما ترمي فيه ثم القيام:

#!/usr/bin/perl
use strict;
use warnings;
use MyPrettyPrinter;
for my $s (1, 1.2, undef, 1.3) {
    print MyPrettyPrinted($s), "\n";
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top