2009-08-08 14 views
6

私は長年のLinuxユーザーですが、WindowsとPowerShellについては初めてです。私はWindows7とStrawberry Perl 5をはじめてインストールしました。 Windows PowerShellで簡単なコマンドライン印刷を行いたいと思っています。PowerShell(Perlを使用)が簡単なプリントステートメントで二重引用符を削除するのはなぜですか?

Perlが正しくインストールように見えます:

 
PS C:\Users\Me> perl -v 
This is perl, v5.10.0 built for MSWin32-x86-multi-thread Copyright 
1987-2007, Larry Wall 
... 

とコマンドラインのものが動作します。

 
PS C:\Users\Me> perl -e 'die' 
Died at -e line 1. 

PS C:\Users\Me> echo 'print "Hello, World\n"' | perl 
Hello, World 

しかし、私は自分自身でそれをすべてをしようとすると、それはFileHandlerの警告出力します

 
PS C:\Users\Me> perl -e 'print "Hello, World\n"' 
No comma allowed after filehandle at -e line 1. 

二重引用符を削除するように見えます。

 
PS C:\Users\Me> perl -e 'print \"Hello, World\n\"' 
Hello, World 

これはうんざり!もう一度やり直してみましょう:

 
PS C:\Users\Me> perl -e 'print qq{Hello, World\n}' 
Hello, World 

それはもっと似ていますが、私は混乱しています。

なぜPowerShellは一重引用符で二重引用符をエスケープしていますか? PowerShellのユーザーはいますか?

+1

あなたは 'perl -e 'print' Hello、World '" 'を試したことがありますか? – Weegee

答えて

3

私はここにいくつかの問題があると思います。 1つは、PowerShellとPerlの両方で引用符が象徴的な意味を持つということです。 PowerShellでは、UNIXシェルとは少し違います。 powershellのman about_quotingをチェックしてください。

第2の問題は、perlコマンドラインがWindowsの時とは異なる動作をすることです。あなたがperlに渡したいコマンドラインの中にある二重引用符は、\ "という言葉でエスケープする必要があります。これはpowershell特有の問題ではありません。 cmd.exeのこれらのバージョンは動作するはず

:。

PS> & perl -e "print \`"hello, world\n\`"" 
hello, world 
PS> $s = "print \`"hello, world\n\`"" 
PS> echo $s 
print \"hello, world\n\" 
PS> & perl -e $s 
hello, world 

あなたは少ないが、単一引用符を使用してエスケープと同じことを行うことができます。

PS> & perl -e 'print \"hello, world\n\"' 
hello, world 
PS> $s = 'print \"hello, world\n\"' 
PS> echo $s 
print \"hello, world\n\" 
PS> & perl -e $s 
hello, world 

また、解析のためにperlの改行のエスケープシーケンスを渡すのではなく、PowerShellで改行を入れることができます。

PS> & perl -e "print \`"hello, world`n\`"" 
hello, world 
PS> $s = "print \`"hello, world`n\`"" 
PS> echo $s 
print \"hello, world 
\" 
PS> & perl -e $s 
hello, world 
0

PowerShellではなくcmd.exeで「間違った」コマンドを実行するとどうなりますか?私は、エスケープシーケンス(\")がPerlのものであるために尋ねます。 PowerShellでは `` ``になります。

1

興味深いことに、PowerShellの世界を離れると、一重引用符が二重引用符に変換され、Windowsコマンドシェルによって正しく解釈されるように見えます。 。

C:\>python -c "print "Hi from python"" 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 
:私は、Windowsのコマンドシェルから似た何かをしようとした場合、私が得る同じエラーがある

PS C:\> python -c 'print "Hi from python"' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 

:それは)同じ問題)を示すように思われた(のpythonを実証するために、

これは、powershellがco mmand:

PS C:\> $s = 'python -c "print "Hi from python""' 
PS C:\> cmd /c $s 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 
関連する問題