相关疑难解决方法(0)

如何使用perl正则表达式转义字符串中的美元符号($)

我正在尝试使用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)

regex perl special-characters dollar-sign

16
推荐指数
1
解决办法
4万
查看次数

在Perl中使用系统命令而不是内置库/函数

有时我看到人们从Perl(以及其他脚本语言)调用系统grep,而不是使用内置的语言工具/库来解析文件.我想鼓励人们使用内置设施,我想征求一些原因,说明为什么使用内置工具是一种好习惯.我可以想到一些这样的

  • 使用库/语言设施更快.由于执行外部命令的开销,性能会受到影响.
  • 坚持语言设施更便携.

还有其他原因吗?

硬币的另一面是否有理由支持使用系统命令而不是内置语言设施?在这方面,如果一个Perl脚本基本上只调用外部命令(例如没有库的自定义实用程序),那么制作一个shell脚本可能更好吗?

scripting perl

7
推荐指数
1
解决办法
378
查看次数

如何在 Perl 的 qx{} 语句中将变量的内容作为 STDIN 传送?

我基本上想这样做:

$_ = "some content that need to be escaped &>|\"$\'`\s\\";
qx{echo $_ | foo}
Run Code Online (Sandbox Code Playgroud)

这里有两个问题。首先$_需要转义的内容,因为它可以包含二进制数据。其次,调用的echo效率可能稍低。

如何简单地将一些内容作为 STDIN 传送到 Perl 中的命令?

perl

4
推荐指数
2
解决办法
993
查看次数

在Perl中编码时安全地执行系统命令

在Perl中编码时,真的应该使用外部命令吗?我看到它的几个缺点.它不是系统独立的,也可能存在安全风险.你怎么看?如果没有办法,你必须使用Perl的shell命令,那么执行该特定命令最安全的方法是什么(比如检查pid,uid等)?

security perl

2
推荐指数
1
解决办法
1077
查看次数

随机选择一个区域并进行多次处理

我有这样的数据

>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 awk sed

2
推荐指数
1
解决办法
152
查看次数

使用perl循环中的变量在perl循环中运行shell命令

我需要在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)

shell perl

1
推荐指数
1
解决办法
982
查看次数

Perl系统命令,多个参数输出到文件

我需要使用以下形式调用系统命令:

system( $cmd, @args );
Run Code Online (Sandbox Code Playgroud)

当我将@args定义为

my @args = ( "input1", "input2", ">", "file.out" );
Run Code Online (Sandbox Code Playgroud)

">"和"file.out"并不像我希望的那样被解释.如何将此形式的系统命令的输出发送到文件?

perl

1
推荐指数
1
解决办法
393
查看次数

从perl脚本运行Unix命令

我试图在服务器上执行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脚本中执行此操作.

shell perl

0
推荐指数
1
解决办法
264
查看次数

如何在perl系统函数中使用两个管道并防止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)

然后扩展$ …

shell perl system pipe variable-expansion

-1
推荐指数
1
解决办法
236
查看次数