我正在尝试使用perl正则表达式转义给定字符串中的几个特殊字符.除美元符号外,它适用于所有字符.我尝试了以下方法:
my %special_characters;
$special_characters{"_"} = "\\_";
$special_characters{"$"} = "\\$";
$special_characters{"{"} = "\\{";
$special_characters{"}"} = "\\}";
$special_characters{"#"} = "\\#";
$special_characters{"%"} = "\\%";
$special_characters{"&"} = "\\&";
my $string = '$foobar';
foreach my $char (keys %special_characters) {
$string =~ s/$char/$special_characters{$char}/g;
}
print $string;
Run Code Online (Sandbox Code Playgroud) 有时我看到人们从Perl(以及其他脚本语言)调用系统grep,而不是使用内置的语言工具/库来解析文件.我想鼓励人们使用内置设施,我想征求一些原因,说明为什么使用内置工具是一种好习惯.我可以想到一些这样的
还有其他原因吗?
硬币的另一面是否有理由支持使用系统命令而不是内置语言设施?在这方面,如果一个Perl脚本基本上只调用外部命令(例如没有库的自定义实用程序),那么制作一个shell脚本可能更好吗?
我基本上想这样做:
$_ = "some content that need to be escaped &>|\"$\'`\s\\";
qx{echo $_ | foo}
Run Code Online (Sandbox Code Playgroud)
这里有两个问题。首先$_需要转义的内容,因为它可以包含二进制数据。其次,调用的echo效率可能稍低。
如何简单地将一些内容作为 STDIN 传送到 Perl 中的命令?
在Perl中编码时,真的应该使用外部命令吗?我看到它的几个缺点.它不是系统独立的,也可能存在安全风险.你怎么看?如果没有办法,你必须使用Perl的shell命令,那么执行该特定命令最安全的方法是什么(比如检查pid,uid等)?
我有这样的数据
>sp|Q96A73|P33MX_HUMAN Putative monooxygenase p33MONOX OS=Homo sapiens OX=9606 GN=KIAA1191 PE=1 SV=1
RNDDDDTSVCLGTRQCSWFAGCTNRTWNSSAVPLIGLPNTQDYKWVDRNSGLTWSGNDTCLYSCQNQTKGLLYQLFRNLFCSYGLTEAHGKWRCADASITNDKGHDGHRTPTWWLTGSNLTLSVNNSGLFFLCGNGVYKGFPPKWSGRCGLGYLVPSLTRYLTLNASQITNLRSFIHKVTPHR
>sp|P13674|P4HA1_HUMAN Prolyl 4-hydroxylase subunit alpha-1 OS=Homo sapiens OX=9606 GN=P4HA1 PE=1 SV=2
VECCPNCRGTGMQIRIHQIGPGMVQQIQSVCMECQGHGERISPKDRCKSCNGRKIVREKKILEVHIDKGMKDGQKITFHGEGDQEPGLEPGDIIIVLDQKDHAVFTRRGEDLFMCMDIQLVEALCGFQKPISTLDNRTIVITSHPGQIVKHGDIKCVLNEGMPIYRRPYEKGRLIIEFKVNFPENGFLSPDKLSLLEKLLPERKEVEE
>sp|Q7Z4N8|P4HA3_HUMAN Prolyl 4-hydroxylase subunit alpha-3 OS=Homo sapiens OX=9606 GN=P4HA3 PE=1 SV=1
MTEQMTLRGTLKGHNGWVTQIATTPQFPDMILSASRDKTIIMWKLTRDETNYGIPQRALRGHSHFVSDVVISSDGQFALSGSWDGTLRLWDLTTGTTTRRFVGHTKDVLSVAFSSDNRQIVSGSRDKTIKLWNTLGVCKYTVQDESHSEWVSCVRFSPNSSNPIIVSCGWDKLVKVWNLANCKLK
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4
IQVVSRCRLRHTEVLPAEEENDSLGADGTHGAGAMESAAGVLIKLFCVHTKALQDVQIRFQPQL
>sp|P10144|GRAB_HUMAN Granzyme B OS=Homo sapiens OX=9606 GN=GZMB PE=1 SV=2
MQPILLLLAFLLLPRADAGEIIGGHEAKPHSRPYMAYLMIWDQKSLKRCGGFLIRDDFVLTAAHCWGSSINVTLGAHNIKEQEPTQQFIPVKRPIPHPAYNPKNFSNDIMLLQLERKAKRTRAVQPLRLPSNKAQVKPGQTCSVAGWGQTAPLGKHSHTLQEVKMTVQEDRKCES
>sp|Q9UHX1|PUF60_HUMAN Poly(U)-binding-splicing factor PUF60 OS=Homo sapiens OX=9606 GN=PUF60 PE=1 SV=1
MGKDYYQTLGLARGASDEEIKRAYRRQALRYHPDKNKEPGAEEKFKEIAEAYDVLSDPRKREIFDRYGEEGLKGSGPSGGSGGGANGTSFSYTFHGDPHAMFAEFFGGRNPFDTFFGQRNGEEGMDIDDPFSGFPMGMGGFTNVNFGRSRSAQEPARKKQDPPVTHDLRVSLEEIYSGCTKKMKISHK
>sp|Q06416|P5F1B_HUMAN Putative POU domain, class 5, transcription factor 1B OS=Homo sapiens …Run Code Online (Sandbox Code Playgroud) 我需要在perl脚本中运行一个shell命令(它需要是一个shell命令)但是我需要在perl循环中使用一个变量
防爆.做某事
#!/usr/bin/perl
for my $i (0..9) {
`echo $i`;
}
Run Code Online (Sandbox Code Playgroud)
应该产生输出
0
1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud) 我需要使用以下形式调用系统命令:
system( $cmd, @args );
Run Code Online (Sandbox Code Playgroud)
当我将@args定义为
my @args = ( "input1", "input2", ">", "file.out" );
Run Code Online (Sandbox Code Playgroud)
">"和"file.out"并不像我希望的那样被解释.如何将此形式的系统命令的输出发送到文件?
我试图在服务器上执行ssh,然后执行grep以获取日志文件中不同错误的计数.一旦我将这些细节记录到CSV文件中.但是当我试图运行grep命令时,我收到错误.
#!/usr/bin/perl
my $addr = "user\@servername";
my $text = qq|Internal Server Error|;
my $remote_path = "/data/logs/error";
my $cmd = `ssh $remote_addr "grep -a $text $remote_path | awk -F " " '{print $4}' | sort -nr | uniq -c | sort -nr 2>/dev/null"`;
print $cmd;
Run Code Online (Sandbox Code Playgroud)
但是当我运行脚本时,我遇到了错误
grep: Internal: No such file or directory
grep: Server: No such file or directory
grep: Error: No such file or directory
Run Code Online (Sandbox Code Playgroud)
有什么建议我们如何在shell脚本中执行此操作.
如果将多个参数传递给perl的系统函数,则shell扩展将不起作用:
# COMMAND
$ perl -e 'my $s="*"; system("echo", "$s" )'
# RESULT
*
Run Code Online (Sandbox Code Playgroud)
如果命令作为一个参数传递,那么扩展将起作用:
# COMMAND
$ perl -e 'my $s="echo *"; system("$s")'
# RESULT
Desktop Documents Downloads
Run Code Online (Sandbox Code Playgroud)
系统功能还允许使用多个命令并使用管道连接它们.这仅在参数作为一个命令传递时有效:
# COMMAND
$ perl -e 'my $s="echo * | cat -n"; system("$s")'
# RESULT
1 Desktop Documents Downloads
Run Code Online (Sandbox Code Playgroud)
如何组合提到的命令并使用两个管道并防止shell扩展?
我试过了:
# COMMAND
$ perl -e 'my $s="echo"; system("$s", "* | cat -n")'
# RESULT
* | cat -n
Run Code Online (Sandbox Code Playgroud)
但由于我上面描述的原因(多个参数未扩展),这不起作用.我想要的结果是:
1 *
Run Code Online (Sandbox Code Playgroud)
编辑:我实际面临的问题是当我使用以下命令时:
system("echo \"$email_message\" | mailx -s \"$email_subject\" $recipient");
Run Code Online (Sandbox Code Playgroud)
然后扩展$ …