Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I am using File::Basename to get the user's file path: $path=dirname($bla); $path=s/\//\/; $file= basename($bla); and finally using open(FH,"$path/$file") to open and read contents of the $file(.txt file). Its not reading the contents. please help me with this,I am new to perl. thanks in advance,

Replies are listed 'Best First'.
Re: Read file contents
by FunkyMonk (Bishop) on Jun 29, 2008 at 12:18 UTC
    print $file and $path before opening the file to check that perl is trying to open what you think it's trying to open.

    Make sure to check the open succeeded using

    open FH, "<", "$path/$file" or die "can't open $path/$file: $!";

    It's generally accepted that lexical filehandles are better than barewords:

    open my $FH, "<", "$path/$file" or die "can't open $path/$file: $!";


    Unless I state otherwise, all my code runs with strict and warnings
      Allright. I have a file called tax.txt on C:\Users\rak\Desktop\tax.txt this is the code: #!/usr/local/bin/perl use strict; use File::Path; use File::Basename; print"enter the path\n"; my $ans=<STDIN>;#$ans=C:\Users\rak\Desktop\tax.txt chomp($ans); my $path= dirname($ans);#I dont have to use this I know.I am just checking here. my $file= basename($ans);#I dont have to use this I know. $ans=~ s/\\/\//gi;#All my file open statements worked well #with c:/bla/bla instead of c:\bla\bla; print $ans; #to make sure that I am replacing all "\" with "/"; open(FH,"<$ans") or die $!; @lines=<FH>; print "\n@lines-bla\n";#bla is to check the print statement:Just prints bla there,not printing file contents; Here is the output: enter the path C:\Users\rak\Desktop\tax.txt No such file or directory at C:\Users\rak\Desktop\cool.pl line 18, <STDIN> line 1. Where i am going wrong? tried without replacing \ with/ same error. I HAVE tax.txt EXISTING ON MY DESKTOP.
        When I try to run your code, I get the error message:
        Global symbol "@lines" requires explicit package name...
        What happens if you fix that problem?

        Sorry, but your example is not clear. If you substitute all the "\" with "/" and then you print $ans, why I can't see any "/" in your output?

        Update: hilitai is right: that can't be the output of the script you posted, for it doesn't compile. I tried it adding "my" before @lines and it works AFAICT.

        sini@ordinalfabetix:~$ ./x.pl enter the path \home\sini\x.pl /home/sini/x.pl #!/usr/bin/perl # use strict; use File::Path; use File::Basename; print"enter the path\n"; my $ans=<STDIN>; #$ans=C:\Users\rak\Desktop\tax.txt chomp($ans); my $path= dirname($ans);#I dont have to use this I know.I am just che +cking here. my $file= basename($ans);#I dont have to use this I know. $ans=~ s/\\/\//gi;#All my file open statements worked well #with c:/b +la/bla instead of c:\bla\bla; print $ans; #to make sure that I am replacing all "\" with "/"; open(FH,"<$ans") or die $!; my @lines=<FH>; print "\n@lines-bla\n";#bla is to check the print statement:Just prin +ts bla there,not printing file contents; -bla sini@ordinalfabetix:~$

        Rule One: "Do not act incautiously when confronting a little bald wrinkly smiling man."

Re: Read file contents
by almut (Canon) on Jun 29, 2008 at 12:25 UTC

    For one, whether you can open the file depends on what's in $bla. Second, what's that $path=s/\//\/; supposed to do? If it's meant to replace slashes with backslashes, it would at least have to be $path =~ s/\//\\/g;. But that seems inconsistent, as you're then using a slash yourself in "$path/$file"...

    Also, given that you aren't really changing much in the path anyway, why not use the path $bla directly as is?

    Could you describe in more detail what you're trying to achieve?

Re: Read file contents
by syphilis (Archbishop) on Jun 29, 2008 at 12:26 UTC
    $path=s/\//\/;

    That would normally be written as:
    $path=~s/\//\\/g;
    I'm not entirely sure what your rendition would do - though it's highly likely that it won't do what you want. OTOH, it's also likely that you don't need to do that substitution - so simply removing that line of code might fix your problem.

    open(FH,"$path/$file")

    Always check that the open() succeeded - and print out the contents of $! if it failed:
    open(FH,"$path/$file") or die $!;
    (Note that you've just specified a / as the path separator - yet earlier on you deemed it necessary to use \ as the path separator.)

    Update: Fixed typo that a certain pedant picked up. (Thanks almut :-)

    Cheers,
    Rob
Re: Read file contents
by pc88mxer (Vicar) on Jun 29, 2008 at 14:31 UTC
    Since you are very new to perl, you might find the information on perl101.org helpful. It contains good examples of how to open and read from files on this page: Perl101 - Files.
Re: Read file contents
by locked_user sundialsvc4 (Abbot) on Jun 30, 2008 at 02:35 UTC

    I very-respectfully agree with the preceding comment:   perhaps you are seeking to fly before you can run. In which case, you just might be wasting your own bruises. Perhaps you are stumbling against obstacles, and bruising yourself, simply because you do not yet know where they are.

    Set-aside your moment's task and quickly review these various materials. Look at the other examples presented there, then carefully compare them to yours.

    “The little light will come on.” Of course it will. We remember that moment well ... we all do. There isn't anybody here who hasn't been down that very same road. Therefore, my admonition is simply that you ought to do what ... well ... what we all, I guess, wish in-hindsight that we had done ... :-)

    Don't bash your head into any more trees than you possibly can. (There will be plenty of new-and-exciting trees yet-to-come...) If you can glean some information without subscribing to Mme. Experience's effective-but-dreadful school, do it.