in reply to Re^3: Split tab-separated file into separate files, based on column name (open on demand)
in thread Split tab-separated file into separate files, based on column name
So my tangential question: Is there a way to "export" the no warnings 'void' from inside the streaming package, rather than requiring it in ::main? It would be best if it could just turn off the warnings for the streaming objects, but leave the warnings on for non-overloaded uses of comparison and bitshift. I tried putting the no-warnings inside the overloaded functions, to try to keep the scope limited, but that's not the right place to prevent the warning. (Yes, I understand this isn't necessarily good practice, or "nice" to the external user. This is just for my own curiosity, and not something I'd put in practical code.)
#!/usr/bin/perl -l use warnings; use strict; # [id://11121105] # as suggested, have file() return an object which overloads > and >>, + so you can overwrite and append # "value" > file('to_overwrite'); "value" >> file('to_append'); # or have fstream() return an object which overloads just <<, for a ve +ry c+_+-eseque # fstream("path") << 120 << " in hexadecimal is " << ctrl::hex << 12 +0; END { print "="x10 }; { package fout; use autodie; use overload '>' => \&overwrite, '""' => sub { \${$_[0]} }, ; sub file($) { print __PACKAGE__, "::file($_[0])"; return bless \$_[0], __PACKAGE__; } sub overwrite { # 'value' > file($f) ==> overwrite(\$f, 'value', 1) my ($self, $value, $swap) = @_; if($swap) { open my $fh, '>', $$self; print {$fh} $value; } else { warn "not sure how to clobber scalar: `file($$self) > $val +ue`"; } return $self; } } *file = \&fout::file; #no warnings 'void'; #file('zzz') > "value"; #fout::overwrite(file('xxx'), 'manual', 1); # this wrote the file corr +ectly #'blah > file(yyy)' > file('yyy'); # will this? #print __PACKAGE__, "::"; { package fstream; use autodie; use overload '<<' => \&append, ; sub fstream($) { print __PACKAGE__, "::fstream($_[0])"; return bless \$_[0], __PACKAGE__; } sub fclobber($) { print __PACKAGE__, "::clobber($_[0])"; open my $fh, '>', $_[0]; return bless \$_[0], __PACKAGE__; } sub append { my ($self, $value, $swap) = @_; if(!$swap) { open my $fh, '>>', $$self; print {$fh} $value; } else { warn "not sure how to clobber scalar: `$value << file($$se +lf)`"; } return $self; } } *fstream = \&fstream::fstream; *fclobber = \&fstream::fclobber; 'value' << fstream('szsz'); fstream('sss') << "first"; fstream('sss') << "second" << "third"; fclobber('clb') << 'one' << 'and another';
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: Split tab-separated file into separate files, based on column name (tangent = open on demand => stream-like)
by LanX (Saint) on Aug 26, 2020 at 18:06 UTC | |
by Eily (Monsignor) on Aug 27, 2020 at 08:34 UTC | |
by LanX (Saint) on Aug 27, 2020 at 10:38 UTC | |
by Eily (Monsignor) on Aug 27, 2020 at 12:30 UTC | |
by LanX (Saint) on Aug 27, 2020 at 12:50 UTC |