# By default
$ cat > TabNL
Tab NL
# By redirection
$ cat -vet < TabNL
Tab^INL$
# By piping
$ cat TabNL | cat -vet
Tab^INL$
# By using '-' as a special filename
$ cat -vet -
Tab NL
Tab^INL$
# By others I didn't immediately think of
####
$ perl -E '
use strict;
use warnings;
say "Real \\*STDIN fileno: ", fileno(\*STDIN);
say "Real \\*DATA fileno: ", fileno(\*DATA);
*STDIN = *DATA;
say "Fake \\*STDIN fileno: ", fileno(\*STDIN);
__DATA__
some data
'
Real \*STDIN fileno: 0
Real \*DATA fileno: 3
Fake \*STDIN fileno: 3
####
ken@titan ~/tmp/pm_11152777_test_stdin/t
$ cat test_json.t
#!perl
use strict;
use warnings;
use autodie;
use Cwd 'abs_path';
use File::Basename 'dirname';
my $THISDIR;
BEGIN { $THISDIR = dirname abs_path __FILE__ }
use JSON::MaybeXS;
use POSIX '_exit';
use Test::More;
my @file_bases = qw{test1 testA};
plan tests => 0+@file_bases;
for my $file_base (@file_bases) {
my $json_data = '';
my $child_pid = open my $from_kid, '-|';
if ($child_pid) {
# parent process (pipe from child):
# reads JSON from "effective" STDIN
while (my $line = <$from_kid>) {
$json_data .= $line;
}
waitpid $child_pid, 0;
}
else {
# child process (pipe to parent):
# writes JSON to STDOUT
my $json_file = "$THISDIR/../data/$file_base.json";
open my $json_fh, '<', $json_file;
while (my $line = <$json_fh>) {
print $line;
}
_exit 0;
}
my $perl_data = decode_json($json_data);
my $reference_data = do "$THISDIR/../data/$file_base.perl";
is_deeply $perl_data, $reference_data, "Testing '$file_base'";
}
####
ken@titan ~/tmp/pm_11152777_test_stdin/data
$ cat test1.json
{
"key1" : "val1",
"key2" : [
"elem1",
"elem2",
"elem3"
],
"key3" : {
"name1" : "value1",
"name2" : "value2"
}
}
$ cat test1.perl
{
key1 => 'val1',
key2 => [qw{elem1 elem2 elem3}],
key3 => {name1 => 'value1', name2 => 'value2'},
};
$ cat testA.json
{
"keyA" : "valA",
"keyB" : [
"elemA",
"elemB",
"elemC"
],
"keyC" : {
"nameA" : "valueA",
"nameB" : "valueB"
}
}
$ cat testA.perl
{
keyA => 'valA',
keyB => [qw{elemA elemB elemC}],
keyC => {nameA => 'valueA', nameB => 'valueB'},
};
####
ken@titan ~/tmp/pm_11152777_test_stdin
$ prove -v t/test_json.t
t/test_json.t ..
1..2
ok 1 - Testing 'test1'
ok 2 - Testing 'testA'
ok
All tests successful.
Files=1, Tests=2, 1 wallclock secs ( 0.01 usr 0.03 sys + 0.12 cusr 0.08 csys = 0.25 CPU)
Result: PASS