Soru Perl'de belirli bir uzunlukta bir dize nasıl kırpılır?


Perl'de "belirli bir boyuta bir dizgeyi kırp" bulamıyorum. Herhangi bir yol var mı?

GÜNCELLEŞTİRME:

giriş: $str = "abcd";

çıktı (3 karakter için kısaltma): $ str abc


25
2018-01-21 15:10


Menşei


Daha iyi bir netlik için örnek bir GİRİŞ / ÇIKIŞ sağlayabilir misiniz? - Gilles Quenot


Cevaplar:


Sen kullanmak istiyorsun substr() işlevi.

$shortened = substr( $long, 0, 50 ); # 50 characters long, starting at the beginning.

Daha fazlası için perldoc

perldoc -f substr

Durumunuzda şöyle olurdu:

$str = 'abcd';
$short = substr( $str, 0, 3 );

37
2018-01-21 15:13



Cevap için teşekkür ederim :) - SS Hegde


Kesik uzunluğun bir dizesi için, kesim uzunluğunun uzunluk uzunluğundan daha uzun olabileceği için, bir yer değiştirmeyi tercih ederim

$str =~ s/.{3}\K.*//s;

Kısa dizeler için, ikame eşleşmeyecek ve dizge değişmeyecektir. Uygun \K Kaçış bir lookbehind onaylaması veya basit bir yakalama ile değiştirilebilir:

s/(?<=.{3}).*//s   # lookbehind
s/(.{3}).*/$1/s    # capture

8
2018-01-21 15:45



İlgilenenler için not: Perl v5.20'de (en azından), lookbehind iddiasının uzunluğu 255 ile sınırlıdır. - Bentoy13


Orijinal dizeniz en az 3 karakter uzun olduğu sürece, substr bir değer olarak.

my $str = "abcd";
substr($str, 3) = "";
print "$str\n";   # prints "abc"

Dizenin başlangıç ​​uzunluğunun, 3 karakterden kısa olduğu gibi, bu çağrının dönüş değeri olarak kontrol edilmesi gerekebilir. substr atanamaz (bkz. perldoc -f substr Daha fazla bilgi için) ve bunu yapmaya teşebbüs etmek bir hataya neden olacaktır.


3
2018-01-21 15:33





Ayrıca, bunun yerine söz etmek de yararlıdır. substr() veya normal ifadeler kullanabilirsiniz printf veya sprintf.

Görmek perldoc -f sprintf :

Dize dönüşümleri için, bir hassas belirtmek dizgiyi   belirtilen genişliği sığdır:

  printf '<%.5s>', "truncated";   # prints "<trunc>"
  printf '<%10.5s>', "truncated"; # prints "<     trunc>"

2
2018-01-09 18:29





Doğru anlarsam, yapman gerek php  wordwrap() bir dize, yani:

use Text::Format;
print Text::Format->new({columns => 50})->format($string);

İlk N karakterine ihtiyacınız varsa:

print substr $string, 0, 50;

1
2018-01-21 15:12





Ya da aynısını yapmak için regexp'i kullanabilirsiniz.

#!/usr/bin/perl -w

use strict;

my $str = "abcd";

$str =~ /(\w{0,3})/;
print $1;

1
2018-01-21 15:34





En doğal yol, istediğiniz bölümü çıkarmak için substr kullanmaktır:

$first_n = substr($string, 0, $n);

Sadece dizgiyi değiştirmek isterseniz ve en azından istenen uzunluk olduğundan eminseniz:

substr($string, $n) = '';

Emin değilseniz, şunları yapabilirsiniz:

use List::Util "min";
substr($string, min($n, length($string))) = '';

veya istisnayı yakalamak:

eval { substr($string, $n) = '' };

1
2018-01-21 17:46