Почему я получаю завершающий «1» после вывода Perl в printf? - PullRequest
3 голосов
/ 05 октября 2009

Когда я реализую код ниже, я получаю правильные даты:

10/05/2008
10/05/2009

Когда я использую printf вместо sprintf, я получаю следующее:

10/05/200910/05/20081
1

Любые идеи о том, почему printf печатает конечный 1?


#!/usr/bin/perl

use strict; use warnings;

my ($from_date, $to_date) = to_from_dates();

print "$from_date\n";
print "$to_date\n";

sub to_from_dates {
    my ($day, $month, $year) = (localtime)[3,4,5];
    my $to_date   = sprintf "%02d/%02d/%04d", $month+1, $day, $year+1900;
    my $from_date = sprintf "%02d/%02d/%04d", $month+1, $day, $year+1899;
    return ($from_date, $to_date);
}

Ответы [ 3 ]

13 голосов
/ 05 октября 2009

Только sprintf возвращает значение для печати. printf печатает значение и возвращает 1, чтобы сообщить вам, что вывод был успешным.

Вывод, который вы показываете, является именно тем выводом, который я ожидал бы, если бы вы просто стерли s -ы с начала вызовов.

sub to_from_dates {
    my ($day, $month, $year) = (localtime)[3,4,5];
    my $to_date=printf("%02d/%02d/%04d", $month+1, $day, $year+1900);
    # printed: 10/05/2009 (no carriage return)
    # $to_date = '1';
    my $from_date=printf("%02d/%02d/%04d", $month+1, $day, $year+1899);
    # printed: 10/05/2008 (no carriage return)
    # $from_date = '1';
    return ($from_date,$to_date);
}

($from_date,$to_date)=to_from_dates(); # returns ( 1, 1 )
# output: 10/05/200910/05/2008
print $from_date."\n";                 # prints "1\n"; <- first line feed
# output: 10/05/200910/05/20081\n
print $to_date."\n";                   # prints "1\n"; <- second line feed.
# output: 10/05/200910/05/20081\n1\n
5 голосов
/ 05 октября 2009

Если вы используете printf, Perl печатает строку и возвращает результат операции, равный 1, затем вы печатаете этот результат, отсюда и исходящие. Вы можете сделать либо printf или print sprintf

3 голосов
/ 05 октября 2009

Ну, sprintf возвращает строку, printf печатает в файловый дескриптор (STDOUT по умолчанию) и возвращает 1, если он был успешным.

Поэтому, когда вы используете printf, обе даты печатаются на экране при выполнении операторов to_from_dates, а затем print выводят результат to_from_dates, который всегда (1, 1) как оба оператора printf были успешными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...