Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除Perl字符串中的空白?_Perl - Fatal编程技术网

如何删除Perl字符串中的空白?

如何删除Perl字符串中的空白?,perl,Perl,如果我用值'3'声明了一个变量$myString(请注意空格)。 是否有任何函数可以删除返回值的空白。 有点像SomeFun($myString)然后返回'3'(没有空格) #!C:\Perl\bin\Perl.exe 严格使用; 使用警告; 使用数据::转储程序; my$fh=\*数据; 打印转储程序解析常量规范($fh); #解析常量规范文件。 #将句柄传递给进程。 #只要它的行为像一个文件句柄,它就会工作。 子解析_常量_规范{ 我的$fh=班次; 我的%spec; #在完成文件之前: #

如果我用值
'3'
声明了一个变量
$myString
(请注意空格)。 是否有任何函数可以删除返回值的空白。 有点像
SomeFun($myString)
然后返回
'3'
(没有空格)

#!C:\Perl\bin\Perl.exe
严格使用;
使用警告;
使用数据::转储程序;
my$fh=\*数据;
打印转储程序解析常量规范($fh);
#解析常量规范文件。
#将句柄传递给进程。
#只要它的行为像一个文件句柄,它就会工作。
子解析_常量_规范{
我的$fh=班次;
我的%spec;
#在完成文件之前:
#通读
而(my$block=read_block($fh)){
#解析并返回哈希的键/值对。
my%常量=解析块($block);
#将对散列的引用存储在所有块的大散列中,由常量\ u name键控。
$spec{$constant{const\u name}}=\%常量;
} 
#将ref返回到包含所有块数据的大哈希
返回\%规格;
} 
#从文件句柄读取常量定义块。
#当文件中没有剩余数据时,返回void。
#否则,返回一个数组ref,该数组ref包含块中的行。
子读取块{
我的$fh=班次;
我的@行;
我的$block_start=0;
而(我的$line=){
$block_started++如果$line=~/^CONTANTS/;
如果($block_启动){
最后一个if$line=~/^\s*$/;
按@行,$line;
} 
} 
如果@行,则返回\@行;
返回;
} 
子块{
我的$block=shift;
我的($start_line,@attribs)=@$block;
我的%常数;
#分解第一行:
#首先从选项列表中单独分配。
我的($start\u head,$start\u tail)=拆分/=/,$start\u行;
#关于选项列表的工作
my@options=split/\s+/,$start\u head;
#从选项中恢复常量\u名称:
$constant{const_name}=pop@options;
$constant{options}=\@options;
#现在我们分析值/类型说明符
@常量{'type','value'}=parse_type_value_说明符($start_tail);
#解析属性行。
#因为我们已经有了每行的多个,所以一次获取所有。
chomp@attribs;
my$attribs=加入“”,@attribs;
#我们有一行很长的混合key=“value”或key=
@attribs=$attribs=~/\s*(\w+\s+=\s+\w+\s+|\w+\s+=\s+=\s+*?“| \w+\s+=\s+\s*/g;
对于我的$attrib(@attribs){
警告“$attrib\n”;
我的($name,$value)=拆分/\s*=\s*/,$attrib;
如果($value=~/^”/){
$value=~s/^“|”\s*$//g;
} 
elsif($value=~/^
这将从两侧删除空白

右起:

$myString =~ s/\s*$//;
试试这个:

# Delete leading/trailing whitespace.
$string =~ s/^\s+|\s+$//g;

如果您的空白仅为空格,则以下代码将删除所有空格:

$mystring =~ tr/ //ds;

另一个可能的替代解决方案是CPAN,它将“从字符串中删除前导和/或尾随空格”。它有一个
trim
功能,可以满足您的需要。

查看您的程序,我发现有3个地方可以改进或修复

如果我的代码格式不好,我深表歉意:-(

在函数parse_块(…)中,有3项需要注意

@attribs = $attribs =~ /\s*(\w+\s+=\s+\w+\s+|\w+\s+=\s+".*?"|\w+\s+=\s+<.*?>)\s*/g;
(请注意,函数的参数应该是$value,而不是$start_tail。)您可能没有注意到这一点

在@attributes的循环中,if/else条件中的“else”在“value”具有普通值(no”或“value”中的项)时执行


更新:将parse_type_value_说明符(…)中的参数更改为$value。它被(错误地)表示为$attrib。

这里有一个子例程,允许您从字符串中删除前导和尾随空格,同时从字符串中删除多余的空格,并将其替换为单个空格

parse_type_value_specifier(...)

--例行公事 子空间{ 我的@stringer=@?@:$; $=用于@stringer的连接(“”,拆分(“”)); 返回wantarray?@stringer:“@stringer”; }

--用法 $MySpacedString='带制表符、双空格和其他空白区域的字符串'; $MyCleanString=unspace($MySpacedString)


从Transact-SQL中的变量
$test(eq rtrim(ltrim(@sStr))中删除空格

$test =~s/^\s*(\S*)\s*$/$1/;

如果您愿意使用CPAN模块,或者更经济的可能选择


修剪字符串是每个人都喜欢建造的自行车棚之一!请参阅short by以获取TIMTOWDI乐趣的小示例。

我建议您使用该模块,该模块提供
ltrim
rtrim
trim
,所有这些模块都将修剪传递的参数,或者
$\ucode>如果您不提供参数rs.它不是核心模块,因此可能需要安装

删除字符串中的所有空格:

$string =~ s/ //g;

你好,ghostdog74。我用你的代码进行了测试。
print DEST\u XML\u FILE trim(“$value”);
效果很好。否则,
print DEST\u XML\u FILE trim($value”);
无法工作。请您帮我找出原因好吗?我需要使用第1个表达式在变量之间添加双引号。实际上,在单独替换中删除前导和尾随空格会更快。这种替换会把事情搞砸。:)@Nano,交替工作如预期。修剪结尾和前导空格。仅此而已。在将其传递给trim()之前,您应该执行任何想要$value的操作函数。否则,请显示$value的示例,然后描述修剪后希望看到的内容。@ghostdog74。我更新了整个脚本及其输出。请您对$value进行更多剖析。谢谢。:-@ghostdog74。当我声明另一个tempString时,它会起作用。
my$tempString=trim($value)
然后调用
print DEST\u XML\u FILE“\”$tempString\”
Hi GxG。我用你的代码进行了测试。
print DEST\u XML\u FILE trim(“\”$value\”);
效果很好。否则
print DEST\u XML\u FILE trim
sub trim
{
    my $str = $_[0];
    $str=~s/^\s+|\s+$//g;
    return $str;
}

print trim(" 4 ");
@attribs = $attribs =~ /\s*(\w+\s+=\s+\w+\s+|\w+\s+=\s+".*?"|\w+\s+=\s+<.*?>)\s*/g;
@attribs = $attribs =~ /\s*(\w+\s+=\s+\w+|\w+\s+=\s+".*?"|\w+\s+=\s+<.*?>)\s*/g;  

$value = [ parse_type_value_specifier( $start_tail ) ];  
$value = [ parse_type_value_specifier( $value ) ]; 
parse_type_value_specifier(...)

-- routine

sub unspace { my @stringer = @_ ? @_ : $; $ = join( ' ', split(' ')) for @stringer; return wantarray ? @stringer : "@stringer"; }

-- usage

$MySpacedString = ' String with tabs double-spaces and other whitespace areas. '; $MyCleanString = unspace($MySpacedString);

$test =~s/^\s*(\S*)\s*$/$1/;
$string =~ s/ //g;