If $i is some string, like: $i = 'abc/def', then,
open (my $myfile, "$i") or die...
open (my $myfile, "<$i")or die... #no space after <
open (my $myfile, '<', "$i") or die...
open (my $myfile, '<', \$i) or die...
take your pick...
A few points:-
- The double-quotes around $i are un-necessary in your first line of code.
- A space after the '<' is allowable in your second example.
- Your fourth example is going to do something quite different to the other three.
Given this file ...
$ cat abc/abc.txt
line 1
line 2
$
... and this script ...
use strict;
use warnings;
my $fn = q{abc/abc.txt};
print qq{\nTest 1:\n};
print do{
open my $fh, $fn or die qq{open: Test 1: \n};
<$fh>;
};
print qq{\nTest 2:\n};
print do{
open my $fh, qq{<$fn} or die qq{open: Test 2: \n};
<$fh>;
};
print qq{\nTest 3:\n};
print do{
open my $fh, qq{< $fn} or die qq{open: Test 3: \n};
<$fh>;
};
print qq{\nTest 4:\n};
print do{
open my $fh, q{<}, $fn or die qq{open: Test 4: \n};
<$fh>;
};
print qq{\nTest 5:\n};
print do{
open my $fh, q{<}, \$fn or die qq{open: Test 5: \n};
<$fh>;
};
print qq{\n};
... the following output is produced.
Test 1:
line 1
line 2
Test 2:
line 1
line 2
Test 3:
line 1
line 2
Test 4:
line 1
line 2
Test 5:
abc/abc.txt
Note that "Test 2" and "Test 3" work in exactly the same way. Note also that in "Test 5", which is analogous to your fourth code line, the filehandle actually reads the text contained in the scalar, as demonstrated in BrowserUk's response, rather than the file contents.
I hope this is of interest.
|