在Perl中,如果不使用模块,如何判断字符串是否是数字?

在Perl中,如果不使用模块,如何判断字符串是否是数字?,perl,variables,types,Perl,Variables,Types,我有一个数组,每个元素是一个由几个单词组成的字符串。第一个单词是identifier,不考虑它。字符串的其余部分只能是数字或字母。我想对字母表部分进行排序,然后输出整个元素。以下是我的代码 #!/usr/bin/perl use strict; use warnings; my @log=("a1 9 2 3 1","gl cct car","zo4 4 7", "abl off key dog","a8 act zoo"); my @values; my @letter_log; my

我有一个数组,每个元素是一个由几个单词组成的字符串。第一个单词是identifier,不考虑它。字符串的其余部分只能是数字或字母。我想对字母表部分进行排序,然后输出整个元素。以下是我的代码

#!/usr/bin/perl

use strict;
use warnings;

my @log=("a1 9 2 3 1","gl cct car","zo4 4 7", "abl off key dog","a8 act zoo");

my @values;
my @letter_log;
my @letter_idf;
my @dig_log;
my $i;
$i=0;
foreach(@log)
{
  @values=split(/\s+/,$_);chomp(@values);
  @_= m/$values[0]\s/;
print "25 \$'=$';\n";
  if($' =~ /\D\s+/){$letter_idf[$i]=$values[0];$letter_log[$i]="$'";}
  else{$dig_log[$i]=$_;}

  $i++;
}

@_=sort { $letter_log[$a] cmp $letter_log[$b] } 0..$#letter_log;
chomp(@_);
enter code here
for($i=0;$i<=$#letter_log;$i++){print"$letter_idf[$_[$i]]"."$letter_log[$_[$i]];\t";}


foreach(@dig_log){print "$_;\t";}

print "\n";

我尽量避免使用模块,因为我想学习如何判断字符串是否是数字。谢谢

感谢ikegami和melpomene的评论

我之所以想尝试它,是因为该模块也是一个“程序”。我想学习如何自己实现它。毕竟,我们遇到了各种需要处理的数据

经过多次失败和测试后,我找到了答案并在这里分享

首先,在if语句中分配系统变量“$”之前,它已更改。我将它保存到另一个变量中。 其次,我使用另一种方法来实现它,因为带空格的序列号必须是字符串。所以,我只取一个“字符”来测试它。这证明了这个操作是正确的。别忘了我原来帖子里的话

"The first word is identifier, which will not be considered. The rest part of the string would be number or alphabet only. "
这是我修改过的剧本。“没有什么是不可能的。”

#/usr/bin/perl-w
严格使用;
使用警告;
#导入标量::Util qw(看起来像数字);
my@log=(“a1 9 2 3 1”、“gl act car”、“zo4 4 7”、“abl off key dog”、“a8 act动物园”);
打印“原始日志:\n”;
$"=";\t“;#控制数组的分隔符
打印“@log\n”;
我的价值观;
我的@letter_log;
我的@letter_idf;
我的挖掘日志;
我的$s;
我的$i;
我的$s_r;
$i=0;
foreach(@log)
{
@values=split(/\s+/,$);chomp(@values);
@_=m/$value[0]\s/;
打印“25\$=$”;\n”;
$s=$';
$s_r=substr($s,0,1);
如果($s\u r=~/\D/)
{print“26.0:$”\ts=$s\ts\u r=$s\u r\n”;
$letter_idf[$i]=$value[0];
$letter_log[$i]=$s;
打印“26:$letter_idf[$i]\t$letter_log[$i]\n”;$i++;
}
else{$dig\u log[$i]=$\u;}
}
@_=排序{$letter_log[$a]cmp$letter_log[$b]}0..$#letter_log;
(小标题),;
打印“35:srt信函日志:@letter\u log\n”;
#foreach(@letter_log){print“$;\t”;}
打印“38:nsrt信函日志”:;

对于($i=0;$i),提供的代码表明您的意图与标题并不完全匹配,因为它做的更多。我只想在这里解决标题中的主要问题

如果您可以首先定义数字是什么(而不是使用“perl认为数字是什么”的间接定义),那么问题就变得简单了


例如,如果将要查找的数字定义为具有多个数字0..9字符的字符串,则简单的正则表达式
/^[0-9]+$/
可以满足您的需要。

如果我使用“import Scalar::Util qw(看起来像数字);“,我可以说。正如我提到的,除了第一个单词外,元素值的其余部分只能是字母或数字。你要求我们翻译100行C代码。这不是问题。“我想学习如何判断字符串是否是数字”-你“告诉”通过调用<代码> OrthySovier>代码>为什么你坚持避免你的问题的实际解决方案?这并不是很接近检查Perl是否考虑一个数字的值。有太多的东西不能考虑数字,包括<代码> -1 < /代码>和<代码> 0.1 > /代码>。uldn't,例如空字符串和
(U+0967 DEVANAGARI数字1)您没有仔细阅读条件,“第一个单词是标识符,这将不予考虑。字符串的其余部分仅为数字或字母表。”对于不同格式的数字(如1.2、35、1e5),你仍然可以测试它。Randal L.Schwartz等人的书中有一些例子。非常感谢你的评论和回答。是的。你是对的。我的标题集中在我编程时的问题上。代码是我的练习。
"The first word is identifier, which will not be considered. The rest part of the string would be number or alphabet only. "
#!/usr/bin/perl -w

use strict;
use warnings;
#import Scalar::Util qw(look_like_number);

my @log=("a1 9 2 3 1","gl act car","zo4 4 7", "abl off key dog","a8 act zoo");
print "original log:\n";
$"=";\t";   #control array's delimiter
print "@log\n";

my @values;
my @letter_log;
my @letter_idf;
my @dig_log;
my $s;
my $i;
my $s_r;

$i=0;
foreach(@log)
{
  @values=split(/\s+/,$_);chomp(@values);
  @_= m/$values[0]\s/;
print "25 \$'=$';\n";
  $s=$';
  $s_r=substr($s,0,1);
  if($s_r =~ /\D/)  
  {  print"26.0: $'\ts=$s\ts_r=$s_r\n";    
     $letter_idf[$i]=$values[0];
     $letter_log[$i]=$s;
     print "26:  $letter_idf[$i]\t$letter_log[$i]\n";$i++;
  }
  else{$dig_log[$i]=$_;}
}

@_=sort { $letter_log[$a] cmp $letter_log[$b] } 0..$#letter_log;
chomp(@_);

print"35:  srt letter  log: @letter_log\n";
#foreach(@letter_log){print "$_;\t";}

print"38: nsrt letter log: ";
for($i=0;$i<=$#letter_log;$i++){print"$letter_idf[$_[$i]] "."$letter_log[$_[$i]];\t";}
print"\n";
print"41: digital log:";
foreach(@dig_log){print "$_;\t";}

print "\n";