http://qs321.pair.com?node_id=11128250


in reply to Re^3: Why can't I write to a custom log from a Catalyst application on SELinux/CentOS
in thread Why can't I write to a custom log from a Catalyst application on SELinux/CentOS

Not sure about the debugger, but code shows otherwise:
#!/usr/bin/perl use strict; use warnings; use feature qw{ say }; open OUT, '>', 'log.txt' or die $!; print OUT "bla\n"; open IN, '<', 'log.txt' or die $!; my $nothing = <IN>; say "Read: $nothing.\n"; close OUT; my $bla = <IN>; say "Read: $bla.\n";
map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

Replies are listed 'Best First'.
Re^5: Why can't I write to a custom log from a Catalyst application on SELinux/CentOS
by LanX (Saint) on Feb 11, 2021 at 18:37 UTC
    so yes, autoflush is not default, but you don't need to close after explicitly setting it

    #!/usr/bin/perl use strict; use warnings; use feature qw{ say }; unlink "./log.txt" or warn "$!"; # in case open OUT, '>>', 'log.txt' or die $!; { my $previous_default = select(OUT); # save previous default $|++; # autoflush OUT select($previous_default); # restore previous default } print OUT "before close"; open IN, '<', 'log.txt' or die $!; my $read; $read = <IN>; chomp $read; say "Before close: <$read>"; close OUT;

    Before close: <before close>

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      even easier is using method autoflush directly.

      Got it from HaukeX' recent post.

      I should have read the FAQ: https://perldoc.perl.org/perlfaq5#How-do-I-flush/unbuffer-an-output-filehandle?-Why-must-I-do-this? more carefully :)

      #!/usr/bin/perl use strict; use warnings; use feature qw{ say }; unlink "./log.txt" or warn "$!"; open OUT, '>>', 'log.txt' or die $!; if (0){ # as you like my $previous_default = select(OUT); # save previous default $|++; # autoflush OUT select($previous_default); # restore previous default } else { #use PerlIO; # needed for Perl <5.14 OUT->autoflush(); } print OUT "before close"; open IN, '<', 'log.txt' or die $!; my $read; $read = <IN>; chomp $read; say "Before close: <$read>"; close OUT;

      -*- mode: compilation; default-directory: "d:/tmp/pm/" -*- Compilation started at Fri Feb 12 02:23:56 C:/Perl_524/bin\perl.exe -w d:/tmp/pm/auto_flush.pl Before close: <before close> Compilation finished at Fri Feb 12 02:23:56

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

Re^5: Why can't I write to a custom log from a Catalyst application on SELinux/CentOS
by LanX (Saint) on Feb 11, 2021 at 18:30 UTC
    > Not sure about the debugger, but code shows otherwise:

    It's not the debugger, I think the system command (aka backticks) is causing a flush

    #!/usr/bin/perl use strict; use warnings; use feature qw{ say }; unlink "./log.txt" or warn "$!"; open OUT, '>>', 'log.txt' or die $!; print OUT "before system\n"; print `type log.txt`; print OUT "after system\n"; open IN, '<', 'log.txt' or die $!; my $nothing = <IN>; say "Before close: $nothing.\n"; close OUT; my $bla = <IN>; say "After close: $bla.\n";

    -*- mode: compilation; default-directory: "d:/tmp/pm/" -*- Compilation started at Thu Feb 11 19:29:04 C:/Perl_524/bin\perl.exe -w d:/tmp/pm/auto_flush.pl before system Before close: before system . After close: after system . Compilation finished at Thu Feb 11 19:29:05

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery