Perl의 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의 값은 0이 아니기 때문에 정의되지 않았기 때문에 실제로 원하는 것이 아닙니다. 내가 정말로 원하는 것은 다음과 같습니다.

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

...하지만 이것이 "인수" "가 숫자가 아님"을 생성하기 때문에 세 번째 값의 문제를 일으키기 때문에 할 수 없습니다.

이것은 내 질문의 문앞에 나를 데려옵니다. 물론 정의 된 결과에 대해 내가 방출 한 모든 숫자를 확인하고 이는 완전히 다른 비%F 기반 Printf 형식 문자열을 생성하는 코드를 작성할 수 있습니다.

이 유형의 요구 사항을 처리하는 좋은 방법을 정의한 사람이 있습니까?

도움이 되었습니까?

해결책

나는 아무것도 없다고 생각합니다 그것에 대해 - 그것은 당신이하고 싶은 일입니다.

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";

제 생각에는 멋진 방법은 당신이 던지는 모든 것을 취한 다음하는 일반적인 예쁜 프린터를 작성/얻는 것입니다.

#!/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